美文网首页量化学习笔记Python学习我爱编程
量化学习笔记#股票的移动平均线的研究(2)单股多组均线

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

作者: 刀客特鹿 | 来源:发表于2018-02-10 21:12 被阅读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小时+。

    课程传送门:

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/uoyhtftx.html