芝加哥商品交易所--债券盈亏公式
背景
原本债券的盈亏计算,都是统一交给下游的量化系统统一处理。
但由于业务量增加,量化引擎计算力出现了瓶颈,经常导致交易员下单后看到持仓的盈亏数据出现延迟。
因此,为了提升性能,我们把债券交易 和 债券期货交易 的盈亏计算剥离出来。不再走量化系统,而是通过自己获取交易数据、市场数据、静态数据来计算。
计算公式
关于计算公式,我们参考的是,芝加哥商品交易所给出的期货交易盈亏计算方法:
CME Group version = (livePrice - tradePrice) * "size of contract" * "number of contracts"
=(当前市场价 - 交易价格)* 合约规模 * 合约数目
那么落实到我们的项目中,需要结合野村内部的概念,对交易的盈亏计算做新老区分:
对于当天新交易:和交易所给出的公式并无差别
对于之前的老交易:当前市场价 减去的 不再是 交易价格,而是量化部门给出的一个经过市场shock后的一个价格。合约数目也不再是成交时的数目,而是当前持仓。
Bond Trade
BondFuture Trade
DCF--现金流折现估值法
项目背景:
交易部门发现某些债券的估值有问题,该估值原本应该由上游系统提供。但他们的计算方式非常复杂,无法快速做一个修复。
一个应急的折中方案,就是在我们的引擎里计算出这个债券估值,然后喂给更下游组件。
交易团队指明需要DCF法对这些债券做一个估值,因此我有机会了解下现金流折现估值法。
DCF解释:
DCF全程叫做Discounted Cash Flow-现金流折现估值法,本质就是把企业未来特定期间内的预期现金流还原为现值。
对于折现率我是这么理解的:由于通货膨胀的存在,现金购买力在下降,未来的100块的购买力肯定不如现在的100块。假设现在牛肉肉价格是100块一斤,一年后卖105块;那么以牛肉为标的,1年后的105块折算到现在就是100块,一年期的贴现率为(105-100)/100 =5%
落实到我们的项目,折现率我们使用数据部门提供的无风险利率;现金流通过 债券面值*票面利率来计算,再根据股息频率,一年期的现金流,要除以(1+无风险利率);两年期的现金流就要除以(1+无风险利率)的二次方,以此类推。。。
假设企业的未来1~n年的现金流为D1、D2、D3……Dn,假设折现率为恒定的r,那么未来n年的现金流折现到现在的公式如下:
适用公司类型:
DCF模型只适合那些处于稳定期的企业,赚钱能力已经定型,企业自由现金流可以预期,公司未来基本定型(甚至是销售合同或销售价格都有合同约束,那么就越适宜用现金流折现)。比如污水处理厂、签有PPA协议的电厂、高速公路等。
关键假设:
第一,假设公司未来是稳定增长的。
第二,假设公司未来现金流可预测。
第三,假设公司未来存续期可期。
第四,假设社会无风险利率维持固定水平。
相对估值法(市盈率)
DCF属于绝对估值法。还有一类方法叫相对估值法,最常用的方法是市盈率估值方法,它的侧重点不在于自身到底值多少,而在于和同类型公司相比自己处于什么位置。
影响因素有:行业因素,企业发展阶段
关于市盈率的计算:
静态市盈率:是股票价格除以每股盈利的比率。比如说,上市公司目前股价为20元,每股收益为0.38元,静态市盈率:20元÷0.38元=52 表示在每股盈利不变的情况下,经过多少年投资可以通过股息全部收回。
动态市盈率:是以静态市盈率为基数,乘以动态系数。该系数为1÷(1+i)n,其中i为企业每股收益的增长性比率,n为企业可持续发展的存续期。比如说,上市公司目前股价为20元,每股收益为0.38元;去年同期每股收益为0.28元,成长性i为35%,该企业未来保持该增长速度的时间n可持续5年,则动态系数为1÷(1+35%)5=22%。相应地,动态市盈率为11.6倍[即:52(静态市盈率:20元÷0.38元=52)×22%]。两者相比,差别之大。
EfficiencyRatio--效率比值策略
策略背景
1.“EfficiencyRatio效率比值” 概念是美国交易员 Perry J. Kaufman 佩里·考夫曼 在1995年提出的,是一种趋势强度的衡量。它的计算公式是:
- ER = N期间内价格总变化 / N期间内个别价格变化的绝对值
- 取值范围为-1.0到1.0; -1.0代表最强烈的下跌趋势,1.0代表最强烈的上涨趋势, 0.0代表无方向性的波动
参数池解释
2. 在我们的项目中,使用ER策略对期货进行回测交易,参数因子池包含了5个参数,分别是:
- K线的长度M:也就是说选取M分钟(该策略是日内策略)的K线(就是下图的每个红色/绿色的K线:K线也分1分钟K线,5分钟K线,天K线,周K线,年K线,等)
- 回望周期N:就是指计算ER时使用了几根上一步的K线
- 追踪止损的比例L:止盈止损的比例,触发时会平掉持有的头寸
- 多仓ER阈值:当ER值到达多大的正值,开多仓
- 空仓ER阈值:当ER值到达多大的负值,开空仓
项目中,我们遍历60个交易日,选出最好的一组参数,给接下来的20个交易日使用。以此类推,动态获取最优参数。
我的主要贡献
3. 我的主要贡献:
- 代码的补充实现:以及bug fix - 策略收益一直从15年的某一刻(回测期2014.01-2016-12)开始持续异常下跌,原因是代码在特定条件下的开多开空逻辑颠倒
- 策略的完善:原本的参数池只有4个因子,开多仓和开空仓的阈值始终保持一致。之后,我就改为分开设置,多仓空仓的信号阈值不同。
- 原本的夏普率:1.42,年化收益率:18%,最大回撤:14.8%
- 修改后夏普率:1.29,年化收益率:21%,最大回撤:13.4%
- 结论:夏普率下降0.2个点,年化收益率上升2个点,最大回撤下降2个点
注意:该策略是日内策略,会在每个交易日的最后一条K时,强制平仓