合理的收益率计算方式
看到标题大家肯定会说,收益率就是:利润/本金 或者 (期末资产-期初资产) / 期初资产,小孩子都会算吧。
其实不是的,因为这样的算法在有资金划入划出的时候就会有大问题了。
我们假设张三,他这个人很强,能保证自己每天都能赚2个点。那么张三建仓1000元,10天后张三的收益率是多少呢
利润为 1000 * (1+2%) ^ 10 - 1000 = 218.99
收益率为 218.99 / 1000 = 21.899%
如果这时候张三的父亲看张三这么能赚钱啊,就把给了张三5000元让他继续去交易
那么又运行10天之后呢
- 后10天的利润为 (1000 + 218.99 + 5000)* 21.899% = 1,361.89 (我们已经知道张三的10天收益率为 21.899% )
那么问题来了,张三20天的 收益率怎么算呢
- 如果是 利润/本金 (1,361.89 + 218.99 )/1000 = 158.088%
- 如果是 利润/(本金+资金划入) (1,361.89 + 218.99 )/(1000 + 5000) = 26.348%
- 如果是 (期末资产-期初资产) / 期初资产
- 期末资产为 1000 + 218.99 + 5000 + 1361.89 = 7580.88
- 收益率 = (7580.88 - 1000)/1000 = 658.088%
但我们都知道 张三的20天 实际利率收益率应该为 ((1+2%) ^ 20 - 1) = 48.59%
所以上面两个结果都不对 并且第三个离谱的要命。
并且这还是在日收益平稳且只有一笔划入的情况。实际情况会更复杂
那么如何正确计算呢
答案是引入基金 净值和份额的概念
基金在建仓时净值固定为 1 而 **份额 = 市值 / 净值 **
除非有资金划入划出不然份额是不会变化的,盈利和亏损只会影响净值
收益率 = **(期末净值 - 期初净值 ) / 期初净值 **
确立好模型后让我们开始计算吧
第一天
张三建仓 1000 净值为 1 份额 为 1000
10 天后 (我们已经知道张三的10天收益率为 21.899% )
- 净值为 1 * (1+ 21.899% )= 1.21899
- 份额不变为 1
- 市值为 净值 * 份额 1000 * 1.21899 = 1218.99
第十天收盘后
张三划入资金 5000 元,相当于以净值为1.21899 购买基金
一共买了 5000 / 1.21899 = 4101.75 份
现在
- 净值不变 = 1.21899
- 份额增加 1000 + 4101.75 = 5101.75
- 市值为 净值 * 份额 5101.75 * 1.21899 = 6182.8057
继续交易
第二十天收盘后
- 净值为 1.21899 * (1+ 21.899% )= 1.48593
- 份额不变为 5101.75
- 市值为 净值 * 份额 1.48593 * 5101.75 = 7580.84
OK,那么我们来算一下收益率 **(期末净值 - 期初净值 ) / 期初净值 ** = **(1.48593 -1 ) / 1 ** = 48.593%
而且 48.593% = 20天理论收益率 48.59%
ohhhhhhhhhhh!
这样就正确的算出了收益率 无论有多少资金的划入和划出都可以保持正确
简化算法
如果嫌记录净值和份额麻烦 我们可以简化这个算法
**份额 = 市值 / 净值 ** 因为它们三个有着这样的关系 ,那么实际只要记录两个元素就可以计算出另外一个元素
我们记录市值和净值就好了
又因为期初净值总为 1 而 收益率 = **(期末净值 - 期初净值 ) / 期初净值 **
那么只要记录每天的累计收益率就好了 净值= 1 + (1 * 累计收益率) = 累计收益率 +1
如果要算 第A天 至 第B天的期间收益率
= ( ( 第B天累计收益率+1 ) - ( 第A天累计收益率+1 ) ) / ( 第A天累计收益率+1 )
如果要算 第A天的日收益率
= ( ( 第A天累计收益率+1 ) - ( 第A-1天累计收益率+1 ) ) / ( 第A-1天累计收益率+1 )