前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 枚举法选择最优策略参数

python 枚举法选择最优策略参数

作者头像
多凡
发布2019-11-01 09:03:31
4940
发布2019-11-01 09:03:31
举报
文章被收录于专栏:sringbootsringboot

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_44580977/article/details/102477238

枚举20~60作为移动平均天数参数,选出金额最高的做为参数

例程代码
代码语言:javascript
复制
import datetime
import matplotlib.pyplot as plt
import numpy as np
import pandas_datareader as web
class QuantAverBreak:

    def __init__(self):
        self.skip_days = 0  # 持股/持币状态
        self.cash_hold = 100000  # 初始资金
        self.posit_num = 0  # 持股数目
        self.market_total = 0  # 持股市值

    def run_factor_plot(self, stock_df, N):

        stock_df['Ma_n'] = stock_df.Close.rolling(window=N).mean()  # 增加N移动平均线
        list_diff = np.sign(stock_df.Close - stock_df.Ma_n)

        # 当符号为负时为收盘价向下跌破Ma_n,当符号为正时收盘价向上突破Ma_n
        stock_df['signal'] = np.sign(list_diff - list_diff.shift(1))

        for kl_index, today in stock_df.iterrows():
            # 买入/卖出执行代码
            if today.signal > 0 and self.skip_days == 0:  # 买入
                start = stock_df.index.get_loc(kl_index)
                self.skip_days = -1
                self.posit_num = int(self.cash_hold / today.Close)
                self.cash_hold = 0

            elif today.signal < 0 and self.skip_days == -1:  # 卖出 避免未买先卖
                end = stock_df.index.get_loc(kl_index)
                self.skip_days = 0
                self.cash_hold = int(self.posit_num * today.Close)
                self.market_total = 0

            if self.skip_days == -1:  # 持股
                self.market_total = int(self.posit_num * today.Close)
                stock_df.loc[kl_index, 'total'] = self.market_total
            else:  # 空仓
                stock_df.loc[kl_index, 'total'] = self.cash_hold

        return stock_df['total'][-1]


stock = web.DataReader("600410.SS", "yahoo", datetime.datetime(2018, 1, 1), datetime.datetime(2019, 1, 1))

ma_list = []
profit_list = []
for ma in range(20, 60):
    examp_trade = QuantAverBreak()
    ma_list.append(ma)
    profit_list.append(examp_trade.run_factor_plot(stock, ma))

profit_max=max(profit_list)
print(profit_list.index(max(profit_list)))
ma_max=ma_list[profit_list.index(max(profit_list))]


plt.bar(ma_list, profit_list)
plt.annotate('ma='+str(ma_max)+'\n'+str(profit_max),\
             xy=(ma_max,profit_max),xytext=(ma_max-5, profit_max-10),arrowprops=dict(facecolor='yellow',shrink=0.1),\
             horizontalalignment='left',verticalalignment='top')

# 设置坐标标签字体大小
plt.xlabel('均线参数')
plt.ylabel('资金收益')
# 设置坐标轴的取值范围
plt.xlim(min(ma_list)-1, max(ma_list)+1)
plt.ylim(min(profit_list)*0.99, max(profit_list)*1.01)
# 设置x坐标轴刻度
plt.xticks(np.arange(min(ma_list), max(ma_list)+1, 1))
# 设置图例字体大小
plt.legend(['profit_list'], loc='best')
plt.title("均线最优参数")
plt.show()

输出结果

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例程代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档