Skip to content

Latest commit

 

History

History
98 lines (65 loc) · 3.86 KB

cum_returns.md

File metadata and controls

98 lines (65 loc) · 3.86 KB

累计收益计算方法

(pct_change*weights+1).cumprod()的不足

多头计算正确,空头计算失真。例如

价  格: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项目