量化学习笔记Python学习我爱编程

量化学习笔记#股票的移动平均线的研究(2)单股多组均线

2018-02-10  本文已影响13人  刀客特鹿

本文是通过之前学习《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小时+。

课程传送门:

上一篇下一篇

猜你喜欢

热点阅读