本文是通过之前学习《Python量化入门》课程系列后,进行的学习研究,将思路和结果供大家分享一起讨论。
关键词:Python, 量化研究,移动平均线。
实验目的:对单个股票,使用多组参数,进行交易策略回测模拟,并对回测结果进行分析。
关于单组测试的模拟,请回顾
刀客特鹿:量化学习笔记#股票的移动平均线的研究(1)zhuanlan.zhihu.com
重复部分,不会再记录。
原始数据:股票 600000 浦发银行的个股日线数据
多组参数:短期均线 ma_short range(20,121,5)
长期均线 ma_long range(20,121,5)
交易策略:最小交易周期:日
买入信号:当短期均线上穿长期均线时候 ma_short >= ma_long
卖出信号:当长期均线下穿长期均线时候 ma_short < ma_long
信号的判别价格:每日收盘价(历史除权价格)
交易计算价格:信号发生后的第二日开盘价(历史未除权价格)
交易手续费:按0.0005计算
印花税:按0.001计算,仅在卖出时发生
交易初始资金 1000000
最小交易数量:100股
测试的时间范围:20050101-20170512
Benchmark: 上证指数
实验步骤:
第一步:获取个股数据
1)设置参数
code = 'sh600000'
2)获取股票基础数据,并处理(除权,涨跌停信号设置)
stock_data = get_stock_data(code)
具体步骤请参考:
刀客特鹿:量化学习笔记#股票的移动平均线的研究(1)zhuanlan.zhihu.com
第二步,计算收益评价结果并保存
1)新建一个空的dataframe用于存放接下来计算的输出结果
output = pd.DataFrame()
2)设置多个均线参数,循环模拟
for ma_long in range(20,121,5):
for ma_short in range(1,21,2):
if ma_short < ma_long:
print code, ma_long, ma_short
# 获取均线结果
df = stock_data.copy()
df = sma_simple(stock_data=df, ma_long=ma_long, ma_short=ma_short)
# print df['index_change']
# 计算测试结果
result = get_pf_reult(stock_data=df, ma_long=ma_long, ma_short=ma_short)
if output.empty:
output = get_pf_reult(stock_data=df, ma_long=ma_long, ma_short=ma_short, printout=False)
else:
output = output.append(get_pf_reult(stock_data=df, ma_long=ma_long, ma_short=ma_short, printout=False))
print output
运行过程:
得到结果:
耗时情况:
将长,短期均线的步长都改为1以后,运行时间增加10倍。
最终耗时:1489.259999
结果保存到本地csv:
output.to_csv(out_put_path + str(code) + '_sma_' + str(date_now) + '.csv', index=False)
第三步,读取以上的结果,寻找收益最高的参数,作图展示
设置参数
code = 'sh600000'
将刚才保存的csv读取出来
df = pd.read_csv(Functions.out_put_path + '/Going_Merry/SMA/'+ str(code) +'_sma_20180112.csv')df.dropna(inplace=True)
按 年化收益/最大回撤 排序
df.sort_values(by='final_ratio', ascending=False, inplace=True)
当然你也可以尝试其他排序方式:
按总收益排序
df.sort_values(by='total_return', ascending=False, inplace=True)
按年化收益排序
df.sort_values(by='annual_return', ascending=False, inplace=True)
选取指标最高的前十个参数
df = df[['ma_long', 'ma_short']][0:10]
df.reset_index(drop=True, inplace=True)
para_list = []
for i in range(0, 10):
para = [df.loc[i, 'ma_long'], df.loc[i, 'ma_short']]
para_list.append(para)
将这些参数结果重新去运行,得到新的绘图结果
stock_data = get_stock_data(code)
新建一张表,用于存放所有的股票收益曲线
equity = pd.DataFrame()
for ma_long, ma_short in para_list:
df = stock_data.copy()
df = sma_simple(df, ma_long=int(ma_long), ma_short=int(ma_short))
if equity.empty:
equity = df[['date', 'nat_equity', 'index_change', 'equity']]
equity.rename(columns={'equity': 'equity_' + str(ma_long) + '_' + str(ma_short)}, inplace=True)
else:
equity['equity_'+ str(ma_long) + '_' + str(ma_short)] = df['equity']
画出股票和基准在回测期间的累计收益率的折线图
df = equity.copy()
设置日期为Index,x轴才能显示日期
df.set_index('date', inplace=True)
fig = plt.figure(figsize=(12, 5))
ax = fig.add_subplot(1, 1, 1)
ax.set_title(str(code) + '_SMA_TEST') # 设置图形的标题名
ax.set_xlabel('Time') # 设置横坐标x轴的名字
ax.set_ylabel('Return') # 设置Y轴
df['benchmark_cumret'] = (df['index_change'] + 1).cumprod()
df['benchmark_cumret'] = df['benchmark_cumret'] * 1000000
for i in df.columns[2:12]:
plt.plot(df[i], label=i)
plt.plot(df['benchmark_cumret'], label='benchmark_return')
plt.plot(df['nat_equity'], label='nat_rtn')
plt.legend(loc='best')
plt.show()
数据分析和参数绘图:
对参数进行统计分析和散点图绘制
# 对参数进行统计分析和散点图绘制
fig = plt.figure(figsize=(12, 5))
ax = fig.add_subplot(1, 1, 1)
ax.set_title(str(code) + '_SMA_TEST') # 设置图形的标题名
ax.set_xlabel('Ma_short') # 设置横坐标x轴的名字
ax.set_ylabel('Final_ratio') # 设置Y轴
plt.scatter(df['ma_short'], df['final_ratio'], label='ma_short')
# plt.scatter(df['ma_long'], df['final_ratio'], label='ma_long')
# plt.scatter(df['ma_long'], df['annual_return'], label='ma_long')
# plt.scatter(df['ma_short'], df['annual_return'], label='ma_short')
plt.legend(loc='best')
plt.show()
短期均线和 年化收益 / 最大回撤 的散点图:
长期均线和 年化收益 / 最大回撤 的散点图:
3D 图展示 长期均线, 短期均线 和 年化收益 / 最大回撤 的散点图:
fig = plt.figure()ax = Axes3D(fig)ax.scatter(df['ma_long'],df['ma_short'],df['final_ratio'], c='b') #绘制数据点# 设置坐标轴名字ax.set_zlabel('final_ratio') #坐标轴ax.set_ylabel('ma_short')ax.set_xlabel('ma_long')plt.show()
实验结果:
从以上结果看 对于 600000 浦发银行 在时间范围20050101-20170512,只要选择合适的参数,均线策略确实可以得到相比股票本身更好的收益。
长期均线在47-54的范围 和 短期均线在13-15的范围 年化收益 / 最大回撤 表现是最好的。
课程评价
优点:这套课程特别适合对Python,pandas都没掌握的同学,和“入门”二字很贴切。虽然价要收取一定的费用,但是对于零基础的同学还是墙裂推荐。当然我的笔记是完全免费的,但这个只能作为点心,毕竟正餐才是最有营养的~而且还有大量的源代码A股所有的股票历史交易数据。
缺点:只能用微信访问学习,PC端的话要通过微信客户端访问。
系列总课时约12多个小时,会获得课程讲解的所有源代码。如要深入熟练掌握,课外练习可能需要100小时+。
课程传送门:
网友评论