In [1]:
import sys

sys.path.insert(0, "../../")
from pyecharts import online

online()
#  演示必要的准备代码,使用该库时不需重复此单元格命令
In [2]:
import xalpha as xa
import pandas as pd

基金定投探究

波动和成长,标的的性质如何影响定投的成绩

In [3]:
zz500 = xa.indexinfo("0000905")
zz500b = xa.indexinfo("0000831")
# 采用中证500和500低贝进行研究
In [12]:
zz500.bcmkset(xa.cashinfo())
zz500b.bcmkset(xa.cashinfo())
In [6]:
zz500.algorithm_volatility(), zz500b.algorithm_volatility()
# 低波波动性低的也没那么明显
Out[6]:
(0.31811907574774867, 0.29669632893344722)
In [13]:
zz500.total_annualized_returns(), zz500b.total_annualized_returns()
# 不过低波的收益率可是强多了
Out[13]:
(0.12470000000000001, 0.1726)
In [15]:
auto = xa.policy.scheduled(
    zz500, 1000, pd.date_range("2011-01-01", "2015-01-01", freq="W-THU")
)
autob = xa.policy.scheduled(
    zz500b, 1000, pd.date_range("2011-01-01", "2015-01-01", freq="W-THU")
)
# 每周四定投1000元
In [18]:
zz500t = xa.trade(zz500, auto.status)
zz500bt = xa.trade(zz500b, autob.status)
In [22]:
zz500t.xirrrate("2015-06-01"), zz500bt.xirrrate("2015-06-01")
# 到牛市顶部时,年化收益率竟然差不多
Out[22]:
(0.45607187160394663, 0.46458845644291197)
In [23]:
zz500t.dailyreport("2015-06-01")
Out[23]:
基金名称 基金代码 当日净值 单位成本 持有份额 基金现值 基金总申购 历史最大占用 基金持有成本 基金分红与赎回 换手率 基金收益总额 投资收益率
0 中证500 0000905 10.627208 3.9089 53211.76 565492.42 208000.0 208000.0 208000.0 0.0 0.113566 357492.42 171.8714
In [24]:
zz500bt.dailyreport("2015-06-01")
Out[24]:
基金名称 基金代码 当日净值 单位成本 持有份额 基金现值 基金总申购 历史最大占用 基金持有成本 基金分红与赎回 换手率 基金收益总额 投资收益率
0 500µÍ±´ 0000831 14.630401 5.2911 39311.42 575141.83 208000.0 208000.0 208000.0 0.0 0.113566 367141.83 176.5105

由此可见,虽然低波的一次性投入对应的年化收益很高,但最终定投下来和普通500指数的收益差不多。。。。

In [25]:
# 还是换创业板暴力一发吧,让你们领略一下15年神创的风采
cyb = xa.indexinfo("1399006")
In [26]:
cyb.bcmkset(xa.cashinfo())
In [27]:
cyb.total_annualized_returns("2015-06-01"), cyb.algorithm_volatility("2015-06-01")
# 令人眼红的收益率
Out[27]:
(0.30730000000000002, 0.30155185277351393)
In [28]:
autoc = xa.policy.scheduled(
    cyb, 1000, pd.date_range("2011-01-01", "2015-01-01", freq="W-THU")
)
In [30]:
cybt = xa.trade(cyb, autoc.status)
In [31]:
cybt.dailyreport("2015-06-01")
# 就问你怕不怕,同样的投入现金流,收益绝对值接近翻倍
Out[31]:
基金名称 基金代码 当日净值 单位成本 持有份额 基金现值 基金总申购 历史最大占用 基金持有成本 基金分红与赎回 换手率 基金收益总额 投资收益率
0 创业板指 1399006 3.821031 0.9779 212690.33 812696.24 208000.0 208000.0 208000.0 0.0 0.113566 604696.24 290.7193
In [32]:
cybt.xirrrate("2015-06-01")  # 60%多的年化
Out[32]:
0.6452718352308852
In [34]:
# 不过如果不幸没有止盈,持有到现在
cybt.xirrrate()
Out[34]:
0.07698746449319872

让我这次定投一个大蓝筹

In [38]:
sz50 = xa.indexinfo("0000016")
In [39]:
autod = xa.policy.scheduled(
    sz50, 1000, pd.date_range("2011-01-01", "2015-01-01", freq="W-THU")
)
In [41]:
sz50t = xa.trade(sz50, autod.status)
In [42]:
sz50t.dailyreport("2015-06-01")
Out[42]:
基金名称 基金代码 当日净值 单位成本 持有份额 基金现值 基金总申购 历史最大占用 基金持有成本 基金分红与赎回 换手率 基金收益总额 投资收益率
0 上证50 0000016 3.207919 1.6901 123070.13 394798.98 208000.0 208000.0 208000.0 0.0 0.113566 186798.98 89.8072
In [43]:
sz50t.xirrrate("2015-06-01")
# 不愧江湖诨号大烂臭,收益在15年的牛市中远小于中小盘
Out[43]:
0.28189135734500326
In [45]:
sz50.bcmkset(xa.cashinfo(), start="2011-01-01")
In [46]:
sz50.algorithm_volatility("2015-06-01")
# 真点低波
Out[46]:
0.2333094161336661
In [48]:
# 持有到现在,即使这几年大盘股反杀,依旧不如创业板
sz50t.xirrrate()
Out[48]:
0.06558331152460622

试一下定期不定额的加强效果

In [4]:
autoe = xa.policy.scheduled_tune(
    zz500,
    600,
    times=pd.date_range("2011-01-01", "2015-01-01", freq="W-THU"),
    piece=[(3, 5), (3.5, 3), (4, 2), (5.5, 1)],
)
In [5]:
zz500t2 = xa.trade(zz500, autoe.status)
In [10]:
zz500t2.v_tradevolume()  # 每周的买入情况
Out[10]:
In [14]:
zz500t2.v_tradecost(end="2015-06-01")  # 定投对于成本的平滑
# 看似收益很高,但你真的能承受住开始定投后长达两年多的浮亏么,甚至很多至暗时刻,浮亏超过20%,能坚持下来么
Out[14]:
In [21]:
zz500t2.dailyreport("2012-11-30")  # 看一下至暗时刻的投资表现
Out[21]:
基金名称 基金代码 当日净值 单位成本 持有份额 基金现值 基金总申购 历史最大占用 基金持有成本 基金分红与赎回 换手率 基金收益总额 投资收益率
0 中证500 0000905 2.853925 3.6405 31643.62 90308.51 115200.0 115200.0 115200.0 0.0 0.262968 -24891.49 -21.6072
In [11]:
zz500t2.dailyreport("2015-06-01")  # 收益率略有提高
Out[11]:
基金名称 基金代码 当日净值 单位成本 持有份额 基金现值 基金总申购 历史最大占用 基金持有成本 基金分红与赎回 换手率 基金收益总额 投资收益率
0 中证500 0000905 10.627208 3.6838 63684.82 676791.8 234600.0 234600.0 234600.0 0.0 0.113566 442191.8 188.4876
In [12]:
zz500t2.xirrrate("2015-06-01")  # 年化也小幅提高,不过即使对投资变额如此过优化,收益提升幅度还如此小,似乎意义不是很大
Out[12]:
0.49963825079451923

最后,通过改变 pd.data_range() 中 freq 的标签,比如 W-WED,或M,可以调整定投在周几定投,或是按月定投,这里就不大篇幅回测其表现对比了,结论就是:收益都差不多