
陈华友
本书的内容包括线性规划、线性规划的对偶理论与灵敏度分析、整数规划、非线性规划、模糊规划、图与网络分析、存储论、决策论、对策论和组合预测等。本书在系统讲述基本理论、方法和模型的同时,为了便于读者的理解和应用,每章均给出了相应的问题实例及其算法求解的Lingo程序代码。同时,为了便于读者复习巩固,每章后均附有习题。
理论照进现实的学科,运筹学作为一门用来解决实际问题的学科,在处理千差万别的各种问题时,一般有以下几个步骤:确定目标、制定方案、建立模型和制定解法。它以整体最优为目标,从系统的观点出发,力图以整个系统最佳的方式来解决该系统各部门之间的利害冲突。 运筹学已被广泛应用于工商企业、军事部门、民政事业等研究组织内的统筹协调问题,故其应用不受行业、部门之限制,从现实生活场合抽出本质的要素来构造数学模型,因而可寻求一个跟决策者的目标有关的解。
很好文字描述不够清晰数学符号解释不清不适合初学者
喜欢应用数学,从小就喜欢应用题
典型的考试大纲式的架构,内容深度也很有限
数学公式比较多,属于专业类的书籍,大概了解下运筹学的框架和内容还是ok的,但是对于新手和实际应用来说,参考意义不是很大。
线性规划模型的一般形式 通过上面的两个例子可以看出,规划问题的数学模型由三个要素组成。 (1)变量,或称决策变量。在规划模型中,用一组决策变量来表示某一方案或措施,即描述所要做出的决策,可由决策者决定和控制。 (2)目标函数。这是决策变量的函数表达式,表示决策者希望实现的目标。按问题的不同,要求目标函数实现最大化或最小化,在前面加上max或min来表示,目标函数也是衡量方案优劣的标准。 (3)约束条件。这是指决策变量取值时受到的各种资源条件的限制,通常表示为一组含有决策变量的等式或不等式,是决策方案可行的保障。 如果规划模型中,目标函数是决策变量的线性函数,且为单一的,决策变量是连续的,可以在实数范围内取值,约束条件是含决策变量的线性等式或不等式,则称该类规划问题的数学模型为线性规划问题的数学模型。线性规划的数学模型中,目标函数里决策变量的系数也被称为价值系数,它反映了每个决策变量的单位取值对决策目标的贡献程度。
PeakAlgo日志结构说明 一、结构说明 PeakAlgo是一个算法交易服务,它在运行中会生成很多日志分布在多个文件夹下。下面对其日志结构做说明。PeakAlgo日志目录的根目录名字是形如 JadeFOGEM_2025-03-29_12-20-06-7164。这个名字中JadeFO是服务的实例名,GEM是固定字符串,2025-03-29是服务启动日期,12-20-06是服务启动时间,7164是服务的进程id。 日志根目录下还有多个子目录。 1, PeakAlgo的每一行日志结构是如下: 2025-09-02 15:42:21.783|078| 16256|INFO |====== STARTED Global logger ======。它的日志用 | 分割成了5部分。第一部分是时间戳,格式是 YYYY-MM-DD HH:MM:SS.xxx,第二部分是1毫秒中的微秒部分,第三部分是线程id,第四部分是日志等级,第五部分是日志内容,第五部分日志内容在日志文件中是可能跨越多行的。 2, StrategyContainer目录。StrategyContainer目录里有Engine日志,Engine日志文件都是以Engine_开头。Engine是一个线性规划求解器,它接受用户输入的策略和各种约束条件,去QuoteManager获取实时行情,去TradeManager获取实时持仓,依次来做线性规划求解。用户策略和约束都是只有交易员在前端界面操作才会更新,从更新完到下一次更新中间的所有计算使用同样的策略和约束,我们称这部分数据为静态数据,因为它们相当不会变动。每次计算都会去拿实时的行情和持仓,我们称它们为动态数据,因为每次计算都可能不一样,变动频繁。以下是一个真实的静态数据实例: Strategy_LIAOJINGWEI123_2025-09-18-17:47:13是这个策略的名字,下一行的2代表这个策略由2个direction组成,接下来的 V 200代表direction的版本,再下一行PEAK 18853304 1 1 2 ,其中的PEAK表示direction的名字,18853304是一个索引,1是bid这边的设置个数,再一个1是ask这边的设置个数,2代表这个direction有几个线性组合组合而成。接下来的 1404.347854 46.759773 106722.449840 30 1871.945582 46.759773 1067.224498 30 分别是bid和ask的设置。Bid和ask都有4个字段,分别是 target, progress,sizelimit,和side。在接下来的行是线性组合,每行一个线性组合,因为这个direction有2个线性组合,所有这里有2行,每行有3个字段,但是只有前2个字段有用,分别代表instrument和符号,在这个例子中,200210.RFQ的符号是-1,200210.PKIM的符号是1,所以这个direction就是 200210.PKIM - 200210.RFQ ,在接下来的一行 3.000000 4.000000 是yield domain的bid target和ask target,再接下来的 0.000000 0.000000 是price domain的bid target和ask target。 至此一个direction的日志输出就结束了。再下来在 V 200又是另外一个direction了。 Helper_Begin 代表direciton结束,同时也表示helper direction开始,下一行的数组0表示helper direction的个数,这里是0,再下一行的Helper_End表示helper direction结束。 Instrument_LIAOJINGWEI123_2025-09-18-17:47:13是Instrument设置集的名字, 紧跟着的数组5代表该设置集有5个instrument的设置。V 400表示instrument设置的版本。 AlgoParams_LIAOJINGWEI123_2025-09-18-17:47:13 V 1000 中AlgoParams_LIAOJINGWEI123_2025-09-18-17:47:13是Algo参数的名字 V 1000是设置的版本。 IC_LIAOJINGWEI123_2025-09-18-17:47:13是Instrument约束集的名字接下来的数字7代表改约束集由7个约束组成,以下是一个约束的输出 CommonSet|instrument|200210.CFETS -100.000000 100.000000 1 200210.CFETS 1.000000 1.000000 第一眼是约束的名字,第二行是约束的上下界,第三方代表该约束由几个线性组合组成,接下来就是输出线性组合,因为这个日志只有1个线性组合,所以值输出了一行,这一行第一个字段是instrument的名字,第二个字段是符号,第三个字段没用。 SC_LIAOJINGWEI123_2025-09-18-17:47:13是 Security约束集的名字,RC_LIAOJINGWEI123_2025-09-18-17:47:13是Risk 约束集的名字,它们的日志结构和Instrument约束集的结构是一样的。 Strategy_LIAOJINGWEI123_2025-09-18-17:47:13 2 V 200 PEAK 18853304 1 1 2 1404.347854 46.759773 106722.449840 30 1871.945582 46.759773 1067.224498 30 200210.RFQ -1.000000 1.000000 200210.PKIM 1.000000 1.000000 3.000000 4.000000 0.000000 0.000000 V 200 swap_vs_swap 18853304 1 1 2 -4185.000000 465.000000 10752.688172 -96 23250.000000 465.000000 1075268.817204 -96 FR007_5Y.OLI 1.000000 1.000000 FR007_1Y.OLI -4.650000 1.000000 -9.000000 50.000000 0.000000 0.000000 Helper_Begin 0 Helper_End Instrument_LIAOJINGWEI123_2025-09-18-17:47:13 7 V 400 200210.CFETS bond 0.000100 50.000000 50.000000 10.000000 10.000000 30.000000 30.000000 10000.000000 10.000000 0.000000 0.000000 0.000500 0.000100 46.682184 2.500000 2.500000 1 106.000000 468.504987 1 10.000000 10.000000 30.000000 30.000000 1 200210.CFETS 1.000000 1.000000 0 0.000000 0.000000 -1 0 0.200000 V 400 200210.IB bond 0.000100 50.000000 50.000000 30.000000 30.000000 30.000000 30.000000 10000.000000 10.000000 0.000000 0.000000 0.000500 0.000100 46.682184 2.500000 2.500000 1 106.000000 468.504987 1 30.000000 30.000000 30.000000 30.000000 1 200210.IB 1.000000 1.000000 0 0.000000 0.000000 -1 0 0.200000 V 400 200210.PKIM bond 0.000100 50.000000 50.000000 30.000000 30.000000 30.000000 30.000000 10000.000000 10.000000 0.000000 0.000000 0.000500 0.000100 46.682184 2.500000 2.500000 1 106.000000 468.504987 1 30.000000 30.000000 30.000000 30.000000 1 200210.PKIM 1.000000 1.000000 0 0.000000 0.000000 -1 0 0.200000 V 400 200210.RFQ bond 0.010000 0.000000 0.000000 30.000000 30.000000 50.000000 50.000000 10000.000000 10.000000 0.000000 0.000000 0.000500 0.000100 0.466822 2.500000 2.500000 1 106.000000 468.504987 1 30.000000 30.000000 50.000000 50.000000 1 200210.RFQ 1.000000 1.000000 0 0.000000 0.000000 -1 0 0.200000 V 400 FR007_1Y.OLI swap 0.002500 100.000000 100.000000 50.000000 50.000000 50.000000 50.000000 10000.000000 50.000000 0.000000 0.000000 0.000600 0.000600 10.000000 12.500000 12.500000 1 3.000000 100.000000 1 50.000000 50.000000 50.000000 50.000000 1 FR007_1Y.OLI 1.000000 1.000000 0 0.000000 0.000000 -1 0 0.200000 V 400 FR007_1Yx5Y.OLI swapswitch 0.250000 20.000000 20.000000 20.000000 20.000000 20.000000 20.000000 465.000000 20.000000 0.000000 0.000000 0.086022 0.086022 46.500000 5.000000 5.000000 1 -1.000000 465.000000 1 20.000000 20.000000 20.000000 20.000000 2 FR007_5Y.OLI 1.000000 1.000000 FR007_1Y.OLI -4.650000 1.000000 0 0.000000 0.000000 -1 0 0.200000 V 400 FR007_5Y.OLI swap 0.002500 40.000000 40.000000 20.000000 20.000000 20.000000 20.000000 46500.000000 20.000000 0.000000 0.000000 0.000215 0.000215 46.500000 5.000000 5.000000 1 2.225000 465.000000 1 20.000000 20.000000 20.000000 20.000000 1 FR007_5Y.OLI 1.000000 1.000000 0 0.000000 0.000000 -1 0 0.200000 AlgoParams_LIAOJINGWEI123_2025-09-18-17:47:13 V 1000 303 303 1.000000 0.500000 5000.000000 0.000000 0.250000 0.000000 0.000000 10000000.000000 0.000000 10000000.000000 1 0.250000 1 0.000000 1500.000000 10000 0.000000 1 14 0.800000 0.500000 2 0.000000 1 0 1 1500.000000 0.000000 0 0.000000 -1.000000 0 0 0 0 -1.000000 -1 IC_LIAOJINGWEI123_2025-09-18-17:47:13 7 CommonSet|instrument|200210.CFETS -100.000000 100.000000 1 200210.CFETS 1.000000 1.000000 CommonSet|instrument|200210.IB -100.000000 100.000000 1 200210.IB 1.000000 1.000000 CommonSet|instrument|200210.PKIM -100.000000 100.000000 1 200210.PKIM 1.000000 1.000000 CommonSet|instrument|200210.RFQ -100.000000 100.000000 1 200210.RFQ 1.000000 1.000000 CommonSet|instrument|FR007_1Y.OLI -250.000000 250.000000 1 FR007_1Y.OLI 1.000000 1.000000 CommonSet|instrument|FR007_1Yx5Y.OLI -100.000000 100.000000 1 FR007_1Yx5Y.OLI 1.000000 1.000000 CommonSet|instrument|FR007_5Y.OLI -100.000000 100.000000 1 FR007_5Y.OLI 1.000000 1.000000 SC_LIAOJINGWEI123_2025-09-18-17:47:13 6 CommonSet|security|200210.CFETS -100.000000 100.000000 1 200210.CFETS 1.000000 1.000000 CommonSet|security|200210.IB -100.000000 100.000000 1 200210.IB 1.000000 1.000000 CommonSet|security|200210.PKIM -100.000000 100.000000 1 200210.PKIM 1.000000 1.000000 CommonSet|security|200210.RFQ -100.000000 100.000000 1 200210.RFQ 1.000000 1.000000 CommonSet|security|FR007_1Y.OLI -250.000000 250.000000 1 FR007_1Y.OLI 1.000000 1.000000 CommonSet|security|FR007_5Y.OLI -100.000000 100.000000 1 FR007_5Y.OLI 1.000000 1.000000 RC_LIAOJINGWEI123_2025-09-18-17:47:13 6 CommonSet|risk|200210.CFETS -10000.000000 10000.000000 1 200210.CFETS 466.821836 1.000000 CommonSet|risk|200210.IB -10000.000000 10000.000000 1 200210.IB 468.504987 1.000000 CommonSet|risk|200210.PKIM -10000.000000 10000.000000 1 200210.PKIM 466.821836 1.000000 CommonSet|risk|200210.RFQ -10000.000000 10000.000000 1 200210.RFQ 466.821836 1.000000 CommonSet|risk|FR007_1Y.OLI -10000.000000 10000.000000 1 FR007_1Y.OLI 100.000000 1.000000 CommonSet|risk|FR007_5Y.OLI -10000.000000 10000.000000 1 FR007_5Y.OLI 465.000000 1.000000 SessionManager_End Begin portfolio:表示开始输出持仓,Portfolio_End表示输出结束。一个真实日志如下: 2025-09-18 17:47:18.835|736| 9508|INFO |Begin portfolio: portSeqNo=0 Portfolio_LIAOJINGWEI123_2025-09-18-17:47:13 V 300 0.000000 7 200210.CFETS 0.000000 0.010000 0.000000 0.000000 0.000500 0.000100 0.000000 0.000000 200210.IB 0.000000 0.010000 0.000000 0.000000 0.000500 0.000100 0.000000 0.000000 200210.PKIM 0.000000 0.010000 0.000000 0.000000 0.000500 0.000100 0.000000 0.000000 200210.RFQ 0.000000 0.010000 0.000000 0.000000 0.000500 0.000100 0.000000 0.000000 FR007_1Y.OLI 0.000000 0.010000 0.000000 0.000000 0.000600 0.000600 0.000000 0.000000 FR007_1Y*5Y.OLI 0.000000 0.000465 0.000000 0.000000 0.086022 0.086022 0.000000 0.000000 FR007_5Y.OLI 0.000000 0.046500 0.000000 0.000000 0.000215 0.000215 0.000000 0.000000 Portfolio_End 这个例子中,Portfolio_LIAOJINGWEI123_2025-09-18-17:47:13 V 300 是持仓的名字和版本,紧接着下一样的数字7表示有7个instrument的持仓,每个instrument一行。 MarketData V 300表示行情集的名字和版本,也同时表示开始输出行情了,ErrorInst表示行情输出结束了。 2025-09-18_17:47:18.835|736|MarketData V 300 1 200210.IB 2 100.460000 10000000.000000 1 0 99.650000 20000000.000000 1 1 2 106.000000 10000000.000000 -1 0 106.092900 10000000.000000 -1 1 0 0 0 0 0 0 0 0 FilterAONSize: 0 ibMarketChoice: 3 ErrorInst 0 一个真实的行情日志例子如上,行情名字下一行紧跟着的数字1表示有1个instrument的行情。 Engine_Result_Begin表示开始输出Engine计算结果了。Engine_Result_End表示Engine计算结果结束。在Engine_Result_Begin和Engine_Result_End中间会有一行EngineID:开头,后面紧跟着的数字就是EngineID,代表的是计算的编号。 所以整个Engine日志的结构就是静态数据(如果交易员有更新)、动态数据、Engine结果。静态数据在下一次更新前,所有的Engine共享同一个静态数据。 Type2计算结果日志 2025-09-18 18:31:14.693|505| 11844|INFO |Result from engine id 2559 ID=2559 inst=FR007_1Y*5Y.OLI side=1 price=-9.2500 size=20.0000 Saved calc state=1 calcTime=8.4850 EnginecreationTime=2830401.9350 这一行日志表示一个type2的计算结果,关键字是“Result from engine id” , EngineId是2559, instrument Id是 FR007_1Y*5Y.OLI, side=1表示bid, side=-1表示ask, 计算出来的price是-9.2500, size是20个百万,也就是 20000000. ResultProcessor目录 ResultProcessor目录下以rp1开头的是type1订单的处理日志,以rp2开头的是type2订单的处理日志,以rpRFQ开头的是RFQ订单的处理日志。不论是哪种日志,都需要先把日志按线程id区分开后,再来看。 RP的日志以” RP recd: EngineId:” 标志RP处理开始,以” RP done: EngineId:”标志RP处理结束,它们中间的同一线程的日志表示的是RP详细处理过程。 2025-09-18 17:47:17.869|771| 14876|INFO |RP recd: EngineId: 3 Inst: FR007_1Y.OLI Side: Bid Result: (EngineId: 3 Type: 2 InstId: 39109 Side: Bid Price: 2.0975 Size: 50M Strategy: LIAOJINGWEI123_2025-09-18-17:47:13)VenuePripority: 2025-09-18 17:47:17.869|771| 14876|INFO |EngineId: 3 Inst: FR007_1Y.OLI Side: Bid Info: New post in empty market. Starting ILP. ILPType: EbayILP DurationMs: 10000 2025-09-18 17:47:17.869|771| 14876|INFO |EngineId: 3 Inst: FR007_1Y.OLI Side: Bid Info: EbayRule: Not degrading price in empty market because ResultPrice: 2.0975 at or worse than rounded Conservative Cutoff Price: 2.9 ReferencePrice: 3 2025-09-18 17:47:17.869|771| 14876|INFO |EngineId: 3 Inst: FR007_1Y.OLI Side: Bid Price stack check passed. Price: 2.0975 MktLevel: 0 MaxLevel: 1 MktData: Bid: [] 2025-09-18 17:47:17.869|771| 14876|INFO |EngineId: 3 Inst: FR007_1Y.OLI Side: Bid Action: Cancel Reason: Too conservative behind reference price. ResultPrice: 2.0975 boundPrice: 2.9 useNewBound: False 2025-09-18 17:47:17.869|771| 14876|INFO |Inst: FR007_1Y.OLI Side: Bid Info: RP filter done. 2025-09-18 17:47:17.869|771| 14876|INFO |Inst: FR007_1Y.OLI Side: Bid Info: RP assignment done. 2025-09-18 17:47:17.869|771| 14876|INFO |RP done: EngineId: 3 Inst: FR007_1Y.OLI Side: Bid Price: 2.0975 Size: 0 这个日志表示RP收到EngineId为3 Inst是FR007_1Y.OLI Side是Bid 的计算结果Price是2.0975 Size是50M RP处理结束后输出的结果是Price是2.0975 Size是0。 由于Size是0,所以这次计算结果不会再往后续流程走,不会生成订单。要生成订单必须Size不等于0 RequestStateManager目录下以rsm1开头的是type1订单的处理日志,以rsm2开头的是type2订单的处理日志,以rsmRFQ开头的是RFQ订单的处理日志。不论是哪种日志,都需要先把日志按线程id区分开后,再来看。RSM的日志由关键字”: New type” 标志新生成了一个订单,冒号前面可能是Live也可能是Test,是Live的话,这个订单会发完交易所,是Test的话,这个订单不会送到交易所。Type后面可能是1或者2或者2b或者RFQ,分别代表type1订单,type2订单,type2b订单和RFQ订单。 2025-09-18 18:41:54.573|363| 9884|INFO |Live: New type 1 order with EngineId: 3190 Inst: 200210.IB Side: Bid Price: 96.1252 Size: 40.0000M PkOrderId: HardLeg|1|6412|3190|LIAOJINGWEI123_2025-09-18-17:48:18 OrderId: 78f214f6-136b-4561-8ea7-07e1e9224a31 Side: ORDER_SIDE_BUY Req: (EngineId: 3190 Type: Type 1 hard leg result InstId: 4252 Side: Buy Price: 96.1252 Size: 40M Strategy: LIAOJINGWEI123_2025-09-18-17:48:18)VenuePripority: Yield: 4.0000 以上日志说明这是一个 type1 订单,由于有Live字样,所以会发完交易所,EngineId是3190,对应的交易所订单id是OrderId:后面的78f214f6-136b-4561-8ea7-07e1e9224a31, 订单方向是Bid,Price是96.1252, Size是40M, Peak内部订单id是HardLeg|1|6412|3190|LIAOJINGWEI123_2025-09-18-17:48:18
真的太好玩了,就是有点费头发 。线性代数和概率论是运筹学的基础。储存论,决策论,博弈论的知识和结合心理学的一些知识,把他们具体量化运用到实际生活。强者之路。
“运筹帷幄之中,决胜于千里之外”,运筹就是通过排兵布阵,取得最大战果。现代的运筹学,与此意正好贴合,不过更强调运用定量的数学理论和方法,获得合理的最优方案。 本书可以作为运筹学的实操手册,在线性规划、整数规划、非线性规划、模糊规划、图与网络、决策论、博弈论以及组合预测等主要分支介绍了各类数学模型及求解方法,遇到问题,对号入座,找到合适的方法去分析、去解决,再迭代优化。 运筹学是系统工程的支撑理论之一,从运筹学的一般程序来看,其本身就可以看作狭义的系统工程,从问题分析和目标定义到模型构建,再到模型求解和结果分析,这就是一整套系统工程流程,只不过在问题的规模和方法的选择上压缩了范围。运筹学和数学建模也有很大关系,我觉得,从小的方面说,数学建模是运筹学的一个环节,从大了说,数学建模也可以说就是运筹学。 运筹学给我的一个启示,就是要学着用数学的方法去解决实际的问题,把理论落到实际上,再由实际来丰富理论。这就要求我一是要增加对方法的认识,知其所以然,一是会对问题进行抽象概括简化,从关键处着眼。
运筹学有四个方面的基本特征。一是运筹学使用数量分析方法,通过建立数学模型及其求解得到实际问题的最优决策方案。二是运筹学具有系统的整体性。其研究问题是从系统的观点出发,研究全局性的问题,寻求整体利益的优化协调方案。三是运筹学具有学科交叉的特性。其研究问题具有领域的多学科性、应用方法的多学科性、团队的多学科性等特点。四是运筹学具有理论和应用相结合的特性,它是一门应用性很强的学科。