Python进阶量化交易场外篇4——寻找最优化策略参数-程序员宅基地

技术标签: python  

新年伊始,很荣幸笔者的《教你用 Python 进阶量化交易》专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习本专栏内容,因此同学们无需担心专栏内容在学习上的困难,更多的是明确自己学习的目的即可。当然笔者也欢迎同学们踊跃留言,说出自己想扩展的知识点,笔者会根据同学们的意愿选择性的推出一些内容。

在第一篇《管理概率==理性交易》中笔者结合一个简单的市场模型介绍了为什么在没有概率优势的前提下参与交易会亏钱,其实股票交易和玩一个游戏、做一个项目理念是相通的,需要章法、需要制定策略,否则就和抛硬币赌博一样一样的,用量化交易可以帮助我们管理好概率,更理性的去下单。

在第二篇《线性回归拟合股价沉浮》中笔者在专栏《股票交易策略开发:走势线性回归选股策略》小节的基础上对线性回归方法的策略应用做进一步的扩展介绍。由于线性回归作用于股票收盘价的整个周期,前后两段完全相反的周期会彼此作用,最终影响拟合的角度值,于是笔者设定窗口期用移动窗口的方式拟合股价的走势,寻找角度曲线的拐点以预示新一轮的反转走势,给大家提供一个衍生的策略思路。

在第三篇《最大回撤评价策略风险》中笔者在专栏
《股票交易数据可视化:买卖区间下策略收益绘制》的基础上对策略的最大回撤指标做一定的扩展介绍。投资是有风险的,那么如何去衡量这个风险呢?最大回撤率就是一种直观的将风险切实量化的指标,它描述了买入股票后,在策略出现最糟糕的情况下会损失多少钱,这也直接关系到了风险策略中止损因子的设定。
————————————————————————————————————————
本次场外篇笔者在专栏《19、股票交易策略开发:趋势突破择时策略》的基础上对寻找最优化策略参数的方法做一些扩展介绍。在开发交易策略的过程中常常会涉及到选择哪个参数的问题,比如均线指标有M20、M30……经过N日平滑形成,在围绕均线展开的趋势型策略中不同的均线最终所产生的回测效果也是不一样的。

在单均线突破的交易策略介绍中,笔者分别用指示短线操作的M20和指示中长线操作的M60两种移动平均线作为策略参数进行回测,最终从收益曲线上可以看出应用M60作为策略参数效果更好,不仅交易次数明显减少,亏损也大幅度减少。但是M60真的是最优化参数了吗?好像也不见得,那么让我们在19小节的内容之上一步一步地开始寻找最优化参数之旅吧!!

对于寻找最优化参数的方法可以选择枚举法或者蒙特卡洛法。枚举法也称为列举法、穷举法,它的基本思想顾名思义就是逐一列举所有可能的情况,并且一个不漏地进行检验,从中找出符合最佳要求的答案。虽然枚举法得到的结果肯定是正确的,但是为了换取答案的全面性却牺牲了很多无用的时间,只能适用于解决效率要求不高,样本规模小的问题。蒙特卡洛这类方法的特点是在随机采样上计算得到近似结果,随着采样的增多,得到的结果是正确结果的概率逐渐加大,但在遍历全部样本之前,无法知道目前得到的结果是不是真正的结果。蒙特卡洛法不同于枚举法的应用,它为了提高搜索的效率却牺牲了答案的全面性,因此它得到的结果并不一定是最优的,但是在大规模样品的场合下可以更快地找到近似最优结果。此处我们仅仅需要寻找出在M20至M60之间的最优均线参数,因此枚举法更合适。电动叉车

我们只需对单均线突破策略的回测代码class QuantAverBreak进行改造,将移动平均线窗口值开放为变量传入run_factor_plot()方法中,另外去除绘图相关的plt代码,增加返回最终收益值代码。

class QuantAverBreak:
    def __init__(self):
    # 仅体现更改代码
       
    def run_factor_plot(self, stock_df, N):
        stock_df['Ma_n'] = stock_df.Close.rolling(window=N).mean()  # 增加移动平均线
        list_diff = np.sign(stock_df.Close - stock_df.Ma_n)
        return stock_df['profit'][-1]

接下来我们遍历参数20至60,将参数作为移动平均线的窗口值传入策略中,最终返回回测后的资金收益结果,我们以图表的方式对比选择出资金收益最高的参数作为最优化的参数。
例程代码如下所示:

plt.figure(figsize=(25, 12), dpi=80, facecolor="white")
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 profit='+str(profit_max),\
             xy=(ma_max,profit_max),xytext=(ma_max-10, profit_max-10),arrowprops=dict(facecolor='yellow',shrink=0.1),\
             horizontalalignment='left',verticalalignment='top',fontsize=20)
# 设置刻度字体大小
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
# 设置坐标标签字体大小
plt.xlabel('均线参数',fontsize=20)
plt.ylabel('资金收益',fontsize=20)
# 设置坐标轴的取值范围
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', fontsize=20)
plt.title("均线最优参数",fontsize=50)
plt.show()

图片描述

从结果中我们看到资金收益最高时为76829元,所对应的移动平均线的最优参数是58日,但是我们模拟的初始资金可是10万元啊,这么看应用了策略和优选参数后最终的资金仍然是亏损的,这如何解释呢?关于这点笔者毫不避讳展示回测的真实结果,目的就是拒绝过度拟合以给大家一个量化交易可以无所不能的错觉。其实,回测的本质作用就是反映策略和参数在过去某段时间的市场中是盈利还是亏损的,以评价策略和参数的好坏,很明显17年至今A股市场一直处于下跌的态势,或许我们不采用量化策略会亏损的更多。话说回来我们也是有更多的选择,可以选择不交易,也可以选择更好的股票和更好的策略进行交易!

转载于:https://www.cnblogs.com/xyou/p/10368289.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34110749/article/details/92964327

智能推荐

BAT批处理创建文件桌面快捷方式_批处理创建桌面快捷方式-程序员宅基地

文章浏览阅读1.5w次,点赞9次,收藏26次。简介一个创建某个文件到桌面快捷方式的BAT批处理.代码@echooff::设置程序或文件的完整路径(必选)setProgram=D:\Program Files (x86)\格式工厂.4.2.0\FormatFactory.exe::设置快捷方式名称(必选)setLnkName=格式工厂v4.2.0::设置程序的工作路径,一般为程序主目录,此项若留空,脚本将..._批处理创建桌面快捷方式

射频识别技术漫谈(6-10)_芯片 ttf模式-程序员宅基地

文章浏览阅读2k次。射频识别技术漫谈(6-10),概述RFID的通讯协议;射频ID卡的原理与实现,数据的传输与解码;介绍动物标签属性与数据传输;RFID识别号的变化等_芯片 ttf模式

Python 项目实战 —— 手把手教你使用 Django 框架实现支付宝付款_django 对接支付宝接口流程-程序员宅基地

文章浏览阅读1.1k次。今天小编心血来潮,为大家带来一个很有趣的项目,那就是使用 Python web 框架 Django 来实现支付宝支付,废话不多说,一起来看看如何实现吧。_django 对接支付宝接口流程

Zabbix 5.0 LTS在清理历史数据后最新数据不更新_zabbix问题没有更新-程序员宅基地

文章浏览阅读842次。Zabbix 5.0 LTS,跑了一年多了一直很稳定,前两天空间显示快满了,于是手贱清理了一下history_uint表(使用mysql truncate),结果折腾了一周。大概故障如下:然后zabbix论坛、各种群问了好久都没解决,最后自己一番折腾似乎搞定了。初步怀疑,应该是由于历史数据被清空后,zabbix需要去处理数据,但是数据量太大,跑不过来,所以来不及更新了(?)..._zabbix问题没有更新

python学习历程_基础知识(2day)-程序员宅基地

文章浏览阅读296次。一、数据结构之字典 key-value

mybatis-plus字段策略注解strategy_mybatisplus strategy-程序员宅基地

文章浏览阅读9.7k次,点赞3次,收藏13次。最近项目中遇到一个问题,是关于mybatis-plus的字段注解策略,记录一下。1问题调用了A组件(基础组件),来更新自身组件的数据,发现自己组件有个字段总是被清空。2原因分析调用的A组件的字段,属于基础字段,自己业务组件,对这个基础字段做了扩展,增加了业务字段。但是在自己的组件中的实体注解上,有一个注解使用错误。mybatis-plus封装的updateById方法,如果..._mybatisplus strategy

随便推点

信息检索笔记-索引构建_为某一文档及集构件词项索引时,可使用哪些索引构建方法-程序员宅基地

文章浏览阅读3.8k次。如何构建倒排索引,我们将这个过程叫做“索引构建”。如果我们的文档很多,这样索引就一次性装不下内存,该如何构建。硬件的限制 我们知道ram读写是随机的操作,只要输入相应的地址单元就能瞬间将数据读出来或者写进去。但是磁盘不行,磁盘必须有一个寻道的过程,外加一个旋转时间。那么只有涉及到磁盘,我们就可以考虑怎么节省I/O操作时间。【注】操作系统往往以数据块为单位进行读写。因为读一_为某一文档及集构件词项索引时,可使用哪些索引构建方法

IT巨头英特尔看好中国市场前景-程序员宅基地

文章浏览阅读836次。英特尔技术与制造事业部副总裁卞成刚7日在财富论坛间隙接受中新社记者采访时表示,该公司看好中国市场前景,扎根中国并以此走向世界是目前最重要的战略之一。卞成刚说,目前该公司正面临战略转型,即从传统PC服务领域扩展至所有智能设施领域,特别是移动终端。而中国目前正引领全球手机市场,预计未来手机、平板电脑等方面的发明创新将大量在中国市场涌现,并推向全球。持相同态度的还有英特尔中国区执行董事戈峻。戈峻

ceph中的radosgw相关总结_radosgw -c-程序员宅基地

文章浏览阅读627次。https://blog.csdn.net/zrs19800702/article/details/53101213http://blog.csdn.net/lzw06061139/article/details/51445311https://my.oschina.net/linuxhunter/blog/654080rgw 概述Ceph 通过radosgw提供RES..._radosgw -c

前端数据可视化ECharts使用指南——制作时间序列数据的可视化曲线_echarts 时间序列-程序员宅基地

文章浏览阅读3.7k次,点赞6次,收藏9次。我为什么选择ECharts ? 本周学校课程设计,原本随机佛系选了一个51单片机来做音乐播放器,结果在粗略玩了CN-DBpedia两天后才回过神,课设还没有开始整。于是懒癌发作,碍于身上还有比赛的作品没交,本菜鸡对硬件也没啥天赋,所以就直接把题目切换成软件方面的题目。写python的同学选择了一个时间序列数据的可视化曲线程序设计题目,果真python在数据可视化这一点性能很优秀。..._echarts 时间序列

ApplicationEventPublisherAware事件发布-程序员宅基地

文章浏览阅读1.6k次。事件类:/** * *   * @className: EarlyWarnPublishEvent *   * @description:数据风险预警发布事件 *   * @param: *   * @return: *   * @throws: *   * @author: lizz *   * @date: 2020/05/06 15:31 * */public cl..._applicationeventpublisheraware

自定义View实现仿朋友圈的图片查看器,缩放、双击、移动、回弹、下滑退出及动画等_imageview图片边界回弹-程序员宅基地

文章浏览阅读1.2k次。如需转载请注明出处!点击小图片转到图片查看的页面在Android开发中很常用到,抱着学习和分享的心态,在这里写下自己自定义的一个ImageView,可以实现类似微信朋友圈中查看图片的功能和效果。主要功能需求:1.缩放限制:自由缩放,有最大和最小的缩放限制 2居中显示:.若图片没充满整个ImageView,则缩放过程将图片居中 3.双击缩放:根据当前缩放的状态,双击放大两倍或缩小到原来 4.单指_imageview图片边界回弹