Python应用之回测基金定投,选周几收益最高?

今天我用Python做了定投回测实验,想从历史数据上看,什么时候定投获得的收益最大。先上结论:对于沪深300/中证500,周定投的话,周5定投收益最高,但由于周5申购下周一才确认,因此会多占用2天时间,考虑到资金的时间价值,周5投也不一定最合适,另外从回测结果上看,周2、周3收益率垫底,因此周定投的朋友,周1、周4、周5选哪天投都ok,差不多。对于沪深300/中证500,月定投的朋友,尽量避免月中,至于为什么月中定投收益低,我也没想明白,期待高手解惑。以上结论基于10年定投&.
摘要由CSDN通过智能技术生成

今天我用Python做了定投回测实验,想从历史数据上看,什么时候定投获得的收益最大。


先上结论:

  1. 对于沪深300/中证500,周定投的话,周5定投收益最高,但由于周5申购下周一才确认,因此会多占用2天时间,考虑到资金的时间价值,周5投也不一定最合适,另外从回测结果上看,周2、周3收益率垫底,因此周定投的朋友,周1、周4、周5选哪天投都ok,差不多

  2. 对于沪深300/中证500,月定投的朋友,尽量避免月中,至于为什么月中定投收益低,我也没想明白,期待高手解惑。

以上结论基于10年定投&2年无脑定投(定时定额)回测结果,历史不一定代表未来,谨慎参考~

以下为啰里啰嗦的分析过程。




这几年定投很火,大家都知道,简单说就是分批买入基金

定投的好处有很多

  1. 每月拿出工资的一部分买基金,相当于强制储蓄,避免乱花钱;

  2. 对于我们这种非专业投资者,不太会择时,既然不知道什么时候该买,那就佛系一点,定时自动扣款,不用盯盘,省时省力

  3. 一次性买入有可能会买在高点被套,而定投可以摊平成本,避免这种情况。


使用工具——Baostock

Baostock是一个免费、开源的证券数据平台,我们可以用它来遍历沪深市选股,监测股票行情,进行量化分析和定投回测。

Baostock的安装方法和其他Python包一样,pip install baostock就行。

类似的包还有Dtshare、Tushare,这两个都是免费的Python金融数据接口库,可以自行选择,不过Tushare现在取数需要注册和积分,稍有点麻烦。

  1. Baostock官方说明文档:baostock.com

  2. Tushare官方说明文档:tushare.pro/document/1

  3. Dtshare官方说明文档:dt-share.com


回测思路

一些问题

  1. 定投哪些基金?

  2. 定投频率和日期?

  3. 定投金额?

  4. 定投日遇到节假日(不开盘)如何操作?

  5. 收益率如何计算?


第一个问题,我们定投基金一般选指数基金(债券基金不适合定投,这里不展开说了)。

“指数”很好理解,就是选取一组股票,把他们的价格进行加权平均。也就是说,你买股票买的是单个股票,买指数买的是多个股票。

从代表性来看,指数可以分为宽基指数和窄基指数。

宽基指数包含了不同行业,不同类型的指数,能够避免单个股票、单个行业出现的黑天鹅事件,风险相对较小。在中国,最合适新手的宽基指数,就是沪深300指数、中证500指数(这2个可以说是定投入门经典组合了)。

窄基指数中比较有代表性的是行业指数,行业指数要比宽基指数投资风险高,当然,出现利好时,获得超额收益的可能性也更大。我也会投行业指数,例如消费指数、医疗指数,这个以后再说。

今天就先看沪深300、中证500这2个指数。

定投周期通常有周定投、月定投,这两都可以测一下。

周定投:测周一到周五,每次定投1单位金额(不设置具体金额了,毕竟最后计算的收益率是一个相对值的概念,这里1单位你可以理解为1千元,1万元之类)。

月定投:测每月5日、10日、15日、20日、25日,每次定投4单位金额。

节假日:为了方(偷)便(懒),遇到节假日就直接跳过不投。

收益计算逻辑:累计收益率=(市值-本金)/本金

简便起见,这里不考虑资金效率,因为本文主要涉及周定投、月定投的不同定投日的横向比较,也是一个相对值的概念,所以在计算收益率上没那么严谨(其实还是我懒得计算IRR>.<)。


过程及代码

我是从2010年5月31日(周一)开始取数,看近10年的定投情况(我们一般认为中国股市的牛熊周期是7-8年,因此年限太短的话覆盖不了一个周期)。

在这里插入图片描述

上图是在果仁网上拉的近20年上证指数(大盘)的走势,我简单标注了一下,差不多2001年到2008年是一个熊牛周期,7年,2008年到2015年又是一个7年周期(粗略地看)。

整体上来讲中国股市的熊市时间很长,所以长期定投真的很考验人的耐心啊(当然了,没有遇到大牛市,也可以做短线策略,吃一些短期波动的收益)。

import baostock as bs
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, date

# 登陆系统
lg = bs.login()
code = 'sh. 000300' 
start = '2010-05-31'
end = '2020-06-01'

# 获取指数基金指数历史数据
hs300_price = bs.query_history_k_data_plus(code, "date,code,open,high,low,close,preclose,pctChg",
              start_date=start, end_date=end, frequency="d")
# 整合为DataFrame格式
data_list = []
while (hs300_price.error_code == '0') & hs300_price.next():
    data_list.append(hs300_price.get_row_data())
hs300 = pd.DataFrame(data_list, columns=hs300_price.fields)

# 最后一行对应的日期执行卖出操作
sell_index = hs300[hs300['date']==end].index[0]
hs300_buy = hs300.drop(sell_index
  • 9
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值