量化入门系列:如何用Python做一个基金定投的回测模型
本系列通过实例来介绍量化的入门知识,适合零基础的初学者。本文的量化环境基于Python和AKShare数据接口,安装教程见文末附录。
上一篇文章《如何用EXCEL做一个基金定投的回测模型》用excel建立了一个基础版的定投回测模型,先来回顾一下建模的思路,量化只是工具,会使用工具当然重要,但更重要的是有清晰的思路。整个模型最重要的,就是要得出下面这样图:
这张图上的两条曲线是投入成本和持仓价值,持仓价值在投入成本之上为盈利,反之为亏损,有了这两个数据,就能判断这个策略是不是可行。投入成本是每期定投金额的累计数;持仓价值等于持仓数量乘上当天的收盘价,而持仓数量是每期买入数量的累计数。思路清晰了,建立这个回测模型其实是很简单的事情。
本篇用Python来实现这个模型,首先是导入需要的库:
import akshare as ak # 导入AKShare数据源
import pandas as pd # 导入pandas库
import datetime # 导入datetime库
然后用AKShare的 ak.stock_zh_index_daily() 数据接口来获取沪深300历史行情数据中的交易日期date和收盘价close这两列,并筛选定投开始日(2015年6月1日)之后的数据:
hs300_df = ak.stock_zh_index_daily(symbol="sh000300")[['date','close']] # 取沪深300的历史行情数据,只需要日期date和收盘价close这两列数据
hs300_df = hs300_df[hs300_df['date']>datetime.date(2015,6,1)].set_index('date') # 筛选2015年6月1日之后的数据,并将日期date设为索引
获取完数据后,开始建立定投回测模型:
fees = 0.001 # 交易手续费率设为千分之一
hs300_df['每期定投金额'] = 100 # 每天定投100元
hs300_df['累计定投金额'] = hs300_df['每期定投金额'].cumsum() #‘每期定投金额’的累计值
hs300_df['每期定投数量'] = hs300_df['每期定投金额']/hs300_df['close']*(1-fees) # 每期能买到的股数
hs300_df['累计持有数量'] = hs300_df['每期定投数量'].cumsum() #‘每期定投数量’的累计值
hs300_df['累计持仓净值'] = hs300_df['累计持有数量']*hs300_df['close'] # 所持有的全部基金当天收盘后的价值
hs300_df['xxxx'] 的作用是为 hs300_df 这个DataFrame表格新增一列,每列的含义是:
每期定投金额:设定为每天投100元。
累计定投金额:为‘每期定投金额’的累计值,用 .cumsum() 这个函数来计算累计求和。
每期定投数量:每期定投金额 ÷ 当天的收盘价 × (1-交易手续费率)
累计持有数量:为‘每期定投数量’的累计值,用 .cumsum() 这个函数来计算累计求和。
累计持仓净值:累计持有数量 × 当天的收盘价
这几列的内容在上篇文章说过,就不详细说了。
做完后用print函数将 hs300_df 显示出来:
print (hs300_df)
对比下上篇文章中的excel表格,是一摸一样的。
最后用一行代码把‘累计定投金额’和‘累计持仓净值’这两条曲线画出来:
hs300_df[['累计定投金额','累计持仓净值']].plot(figsize=(16,8),grid=True,title='定投的资金曲线图') # 画图
蓝线为累计定投金额,也就是资金成本;橘线为累计持仓净值。当橘线在蓝线之下时,表明投资出现亏损,反之就是盈利。
下图为沪深300在定投期间的行情,几起几伏,如果是一次性买入,现在还没有回本,但定投已经实现了7.33%的年化收益率(具体计算见上一篇文章),这就是定投的机制在起作用。
这是一个基础版的定投回测模型,下篇文章介绍如何实现一个加强版的定投回测模型:将指数的估值百分位用在定投中,在估值低时多投点,在估值高时少投点。
本文涉及的AKShare数据接口的参数、输出、示例的说明文档如下,建议仔细读一下,对理解获取数据的程序代码很有好处。
指数历史行情数据:
https://www.akshare.xyz/data/index/index.html#section-4
量化投资系列的文章:
1. 量化入门系列:用Anaconda和AKShare搭建免费的Python量化环境
3. 量化入门系列:沪深300、中证500、中证1000的估值百分位
4. 量化入门系列:行业指数、主题指数、风格指数的估值温度计
5. 量化入门系列:如何用EXCEL做一个基金定投的回测模型