多头计算正确,空头计算失真。例如
价 格:1 -> 1.5 -> 2
收益率: 0.5 -> 0.3333
多头收益 1 -> 1.5 -> 2
空头收益 1 -> 0.5 -> 0.333
只在第一天入场交易,之后只持有不调仓。
即空头收益第一步0.5是正确的,第二步0.333错了,应当是0才对。其实早已经破产
而这里的结果其实是每天调仓。第二步时再调仓时由于资金减少,所以跌33.3%时并不会破产
时序上可以累加,并且可以还原成简单收益率。累加比累乘快,非常好用。 但横截面上却无法累加,也就无法求平均。所以无法计算等权
思考再三,这个方法应当能处理空头问题,例如:
价 格:1 -> 1.5 -> 2
收益率: 0.5 -> 0.3333
多头持仓市值: 1 -> 1.5 -> 2
开仓现金流: -1 -> -1 -> -1
盈利: 0 -> 0.5 -> 1
平时我们只注意了持仓市值,而现金流一直没有留意
价 格:1 -> 1.5 -> 2
收益率: 0.5 -> 0.3333
空头持仓市值: -1 -> -1.5 -> -2
开仓现金流: -1 -> -1 -> -1
盈利: 0 -> -0.5 -> -1
空头虽然正确,但起始两个-1,为何不能是1呢?做一下调整
价 格:1 -> 1.5 -> 2
收益率: 0.5 -> 0.3333
空头持仓市值: -1 -> -1.5 -> -2
开仓现金流: 2 -> 2 -> 2
盈利: 0 -> -0.5 -> -1
这样起始就为1了。
同样多头也做成起始为1。
价 格:1 -> 1.5 -> 2
收益率: 0.5 -> 0.3333
多头持仓市值: 1 -> 1.5 -> 2
开仓现金流: 0 -> 0 -> 0
盈利: 0 -> 0.5 -> 1
现金流改成了0,正好我们平时也忽略此值
如何计算持有5期的收益率呢?5期收益难道忽略中间4期的因子信号吗?不同的起始入场点会得到不同的累计收益,难道分5条曲线分别比较吗?
多方参考后的处理方法是:将资金平均分成5份,这5份资金是隔离的,每天入场1份,每份都是持有5天后再调仓,然后得到每份的累计收益区线。将5条曲线合并成最终的累计收益曲线
在很多地方看到收益率的计算方式是((long_ret-short_ret)+1).cumprod(),它相当于多头与空头资金完全平分。 这也是日频能用,持有多天就会有问题。
如果资金分成两份,两份资金独立,分别计算多空的净值。其中一份资金减少,导致开仓数量不足,之后就无法完全对冲。所以两份资金一定是共享的,每次再平衡时会再多空等权分配。
例如,完全一样的资产,同时多空,不管什么时候调仓,净值曲线应当是一条水平线。而实际情况是做空时,只要发生了再调仓,它的资金曲线就已经不是做多资金的翻转了。 所以正确的计算方法是多头0.5、空头-0.5,权重绝对值和为1。
假定空头是现金,由于多头权重是0.5,而不是1,所以就算不对冲,收益波动已经变小。如果多头空头相关性高,波动会变得更小。
最开始的确是按真实情况来编码,比如复利、空头收益率计算,资金分多份入场等。但实际运行时,由于既分层又多份入场,每条曲线要计算10层*5份,导致全市场计算要约10秒, 而投研时常常要绘制多个因子,所耗费时间就多了,一般要40秒~1分钟。
分层收益计算的目的是为了考察因子的单调性,能看出分层,区分因子好坏即可,是否精确并不重要
所以,考虑再三,还是将收益计算改成了单利,不考虑资金不足等各种细节。修改后,运行时间减少为原来的1/3~1/2。
多空收益的计算也直接多头-空头
,不考虑仓位需要再平衡的问题
如要更精确的收益曲线,可以考虑使用LightBT
项目