分享两个简单的基金定投策略代码

发布于: 修改于: 雪球转发:17回复:35喜欢:142

在选择定投基金的网友越来越多,但是大家都苦于没有方便自己回测的工具。如果想对无脑定投、均线定投、组合定投的历史收益进行分析,那工作量就相当大了。而网上那些现成的回测工具,大多是模式太过单一,无法满足定制化需求。

好在我们现在有免费的量化平台可用,而且还不需要购买数据服务。如果你现在还不会自己写策略代码也没有关系,我分享两个简单的回测代码,大多数人都能现学现用。正好是周末,让大家可以合理地消耗时间。
代码的源文件请从这里下载(网页链接)。

如何使用现成的代码

首先,大家注册一个聚宽的账号,登录聚宽网站之后通过"策略研究"→"策略列表”进入如下界面,然后选择新建一个股票策略。

现在系统会自动给你生成一段示例策略,不用管,先把策略名称改成我们想要的名字。例如这里改成的“无脑定投”,方便以后我们知道这个策略的功能是什么。

改完名字之后,在下面的代码区域用Ctrl+A选中全部代码内容删除,然后用记事本打开我们自己的代码文件。把无脑定投的代码全部选中,复制到代码窗口里面。

无脑定投的代码其实非常简单,这里有两个地方需要注意,g.cash这个参数是我们定义每次定投的金额。下面的run_monthly(trade,-2)是指每月的倒数第二个交易日运行一次名为trade的交易函数。如果你想做周四定投,那么这里就可以改成run_weekly(trade,-2)。修改之后不要忘记点一下左上角的保存按钮。

注意:Python语言是严格要求行首缩进的,大家修改代码不要删掉前面的空格,要和图片上的一样,保持对齐。

往下面看也很简单,真正有用的代码只有最后的几行,为了方便大家进行多个基金组合购买的情况,我直接做成一个循环,单个和多个基金都可以支持。

上面的基金列表就很简单了,第一列是基金跟踪的指数代码,第二列是基金的名称,第三列就是基金的代码了。在前面加一个#号,这行就变成灰色的注释状态,不会当成代码处理。如果只回测一个基金,就删除那一行前面的#号,然后方括号后面的逗号也删除(如上图所示)。

如果你想同时回测同时购买几个基金的组合,就应该是下面这样,黄色的就是生效的基金。记住,前面的基金行末有一个英文的逗号,最后一个基金的行末没有逗号。这种情况下,每个基金都按g.cash设置得金额购买,3个就是各1000元。

如何进行定投策略回测

完成之后,先设定回测的时间,然后点击编译运行按钮。

为了准确计算策略的收益,也就是:盈利/总投资金额。我们在运行结束之后要查看日志的最后一行,然后把记录的总投资金额填到上面的回测设置中。

金额就填到这里,因为总的资金量会影响收益率的计算,所以这里填写实际投资金额,收益率才有可比性。这是定投策略的资金使用方式造成的,所以要这么处理,请大家务必留意。

再点一次“编译运行”重新计算,这才是正确的收益率。

如果你想保存这个结果记录,可以点击“运行回测”按钮。这样就会生成一条回测记录,可以随时通过回测列表查询回测的情况。

正式回测是对现场的完整记录,不仅有详细的交易信息和持仓信息,还保存了回测的代码,也就是说你修改的每一个代码版本都可以通过回测记录下来。

均线智能定投

均线智能定投策略的建立和无脑定投完全一致,它和普通定投的算法区别在于定投金额不固定,是计算上一交易日收盘价和250日均线的偏差程度,得到定投的倍率,价格越低投得越多。这个策略的设定是低于250日均线才定投,以下图为例,如果上一交易日收盘价在250均线价格的0.95~1倍之间,投资倍率设定为1.2,即1200元。下面的数值分别代表1.5、2、2.5、3和4倍定投的情况。大家如果要调整均线周期和定投比例,修改下面的数值即可。

关于编译运行以及回测的使用,和普通定投完全一致,区别仅仅是程序对定投金额的处理方式。

通过回测大家应该可以发现,均线定投可以明显改善收益率。但是,定投的难点在于选择合适的目标,提高资金利用率和选择止盈时机,大家在回测的过程中可以慢慢体会。

如何加入基金代码

大家在增加自己的基金代码时要严格按下面的格式,基金代码和基金名字用英文的单引号扩起来,中间是用英文的逗号分隔,前后是英文的方括号。

['399006.XSHE','创业板','159915.XSHE']

聚宽平台有代码提示功能,你只要输入指数或者基金代码,系统就会提示完整的代码,鼠标直接点击即可自动补全,非常方便。大部分基金代码以及对应的指数可在集思录查到(ETF基金一览

回测需要注意的问题

如果回测的起始早于基金的成立时间,回测结果就是错误的,大家千万要留意基金成立时间,并密切留意运行日志是否有交易失败的记录,以免错误的结果造成错误的判断。

下图就是基金不存在时,系统给出的价格非法提示。

基金定投本身就是一个非常简单粗暴的策略,没有必要耗费太多时间寻找最优化的参数,定投基金的选择反而更重要一些。我们一般选择那些规模不算太小,场内成交活跃,流动性较好的基金进行定投。另外就是,不同的基金有不同的市场风格,采用均线定投法时收益会有很大的区别,请大家自行比较,并通过价格的波动找到答案。

后记:这篇文章写得比较赶时间,代码在专业人士眼里可能有点糙,如果发现代码有什么错误欢迎指正。对使用方面有什么不明白的,也请在文章后面留言。

精彩讨论

全部讨论

2021-03-17 02:09

感谢分享,学习了

学习ing

2021-01-06 08:58

打卡,谢谢

如果无脑定投基金组合中,每个基金的定投比例不同,这个时候应该怎么设置呢?

2020-11-14 06:55

mark 本意是想看一下极简组合叠加低中估定投的收益

2020-04-16 12:37

那个,发现了代码中的一个小瑕疵,就是手续费那里,场内基金type应该写fund,您的代码里是stock,测试发现写stock回测不会遵循手续费的设置。

2020-04-14 12:07

按照作者的无脑定投代码运行了一下,很厉害,但有两个疑惑,一是Brinson归因中显示现金持仓有50%,不知道这是为什么,二是想询问作者,假如假定定投中未投入的现金按余额宝或银华日利进行收益,代码可以实现吗?盼作者解答。

2020-03-08 10:34

你好,有个疑问:API上最大回撤指的是“策略最糟糕的情况”,我跑出来的包括这篇文章里贴的图,最大回撤为什么有两个点?而且收益是在0轴之上的那个点该怎么理解呢?

2020-01-30 22:39

这个和估值相比的话似乎差别好大,目前中证500估值很低,如果用250均线的话中证500在线上了,怎么拿捏?

2019-10-18 19:05

太感谢了