-
2021-12-22 14:23:50
私藏干货:期货交易策略解析
导读:
策略,也可以称作为方法,是我们从事操作交易所必须依靠的东西。策略,必须结合起来才能发挥其神奇的效果。对于一笔完整的操作,就是多个策略结合起来运用的结果。单个策略即便使用,也无法发挥其功效。多个策略结合起来后就称为系统,即交易系统,也就是交易所需要的一整套方法。
只有有了自己的交易系统,那我们的交易才不会迷茫,至少在任何时候,遇到任何问题,我们自己知道该怎么去解决。有了自己的交易系统之后,在交易之路上才能够快速的成长。
下面我所介绍的四大交易策略是整个交易系统中最重要的,也是最主要的。在期货交易中有着不可或缺的地位。
四大交易策略所涉及的问题分别是:如何开仓(做空、做多以及开仓点位数量),如何控制风险(保护资金即止损问题),如何加仓(扩大战果),以及如何出局(变现获利)。
下面我们就来详细解释这四大交易策略。
顺势交易
顺势交易,字面意思就是顺着当前的趋势进行买卖。趋涨就买入开仓,趋跌就卖出开仓。虽顺势交易理解上没有问题,但这仅仅是表面意义。在实战交易中,并不容易下手。因为实际会有诸多不确定的因素,那就需要趋势的判断与分析。因为同一趋势,不同交易者看法不同。其次,对于是否顺应趋势的级别上也不尽相同。有些交易者习惯顺应大级别趋势,有些则习惯顺应小级别趋势。并且,顺势同样也有弊端。顺势交易其首当其冲的弊端就是会导致交易者进行追涨杀跌。因为有些交易者并不能及时看清趋势,他们看清趋势时,甚至有可能趋势发展的收尾阶段了,这样就容易导致交易者出现追涨杀跌的情况,而追涨杀跌是一个极大的麻烦。
但无论你是否认可顺势交易,它的确是目前投机市场中的交易方最常用法之一,不论是在国内外。顺势交易都更靠近市场的一边,市场趋势发展都会有一个过程,或长或短而已。研究趋势的大方向便是研究当前市场的动态,认目前市场在做什么。站在市场一方的胜率往往就较大,至少市场不会经常突然的改变其目前的运动方向,这便是趋势的惯性。
对于绝大多数交易者来说,顺势交易还是可以接受的。但是在某些细节上确有不同,下面来看看我们应该如何追随趋势。
首要问题就是如何判断趋势。判断趋势,这很重要。如果趋势判断失误,那顺势逆势就毫无义了。不知为何势,又如何而顺呢?
趋势判断的方法还是很多的,有均线系统,有道氏理论,有趋势理论等等。但是我们必须固定使用一套方法,也就是自己的一套判断趋势的方法,这样可以达到趋势判断前后的一致性。这里我将给大家介绍一种方法,这种方法还是结合了这些经典的趋势分析理论。
首先我们把趋势的方向划分为上涨、下跌和横盘,这个没有多大问题。其次就是划分趋势的级别,我们一般把趋势分为小级别的趋势、短期趋势、中期趋势、以及长期趋势。
小级别的趋势是指价格在短时间内的表现,时间一般为1-3天之间。小级别的趋势往往发生在短期趋势中且方向相反,也就是我们所说的小级别反弹或回调,但是这对整体趋势影响不大。而一旦小级别趋势被新高或者新低所代替,往往是比较好的进场点,无论是开仓还是加码。
短期趋势是指价格在短期内的表现,上涨、下跌或横盘。我们一般看他的价格是否是3天到10天左右的新高或者新高。如果是,那么我们可以说目前价格的短期趋势是上涨的。同样短期下跌趋势也是同样的道理,只是价格是规定时间内的新低。当然,如果当天收盘能够维持这个新高或者新低就最好了。怎么理解3天到10天的新高或新低呢?3天的新高就是第三天的高点比前两天任何一个最高点都要高,此时我们就可以称为3天内的新高。那么10天也可以理解了,新低就是反过来好了。除此之外,我们还应该注意到,短期上升趋势和短期下跌趋势是交替循环的。也就是说两个短期上升之间,必然有一个短期下跌趋势。
在顺势交易中,最需要的心理就是耐心等待。虽然我这样给出的交易机会不算少,但是也不会经常出现。所以在交易机会出现之前,只有耐心等待了。能够少几次失误,就能够多几次成功,这个完全是成正比关係的。3次交易抓一把大行情和10次交易抓一把大行情,你说哪个方法更好?
没有耐心往往导致介入过早,介入过早就要经受市场的波动,因为此时尚未完全展开上涨或者可能还处在下跌趋势中,而这些情况你往往无法坚持得住或者你的止损计划也不会让你继续坚持的。急着想赚上一笔钞票,往往会导致我们失去耐心,迫不及待的、过早的介入市场。
风险控制
大部分专业人士一致同意新手和业馀交易者花太多时间研究进场技巧,觉得它们对操作成功十分重要。而他们却认识,赢家和输家的区别就在于风险管理。
由于市场走势很难预测,所以採用适当的风险管理技巧对交易的效果,远好于寻找更好的新方法以判断市场下一个顶部或底部。
交易者不怕没有机会去交易,而是怕没有本金进行交易。如果你输光了本钱,那么你就没有办法继续交易了。你可以东山再起,但是这样的麻烦为什
更多相关内容 -
基于Bollinger通道的商品期货交易策略_28页
2022-01-03 11:03:08基于Bollinger通道的商品期货交易策略_28页 -
量化交易:商品期货交易策略的数学模型.pdf
2022-07-01 03:13:53量化交易:商品期货交易策略的数学模型.pdf量化交易:商品期货交易策略的数学模型.pdf量化交易:商品期货交易策略的数学模型.pdf量化交易:商品期货交易策略的数学模型.pdf量化交易:商品期货交易策略的数学模型.pdf... -
国债期货交易策略教材.pptx
2021-10-14 05:50:38国债期货交易策略教材.pptx -
国债期货交易策略XXXX0526.pptx
2021-10-14 05:50:36国债期货交易策略XXXX0526.pptx -
量化交易:商品期货交易策略的数学模型.doc
2021-09-27 19:54:50量化交易:商品期货交易策略的数学模型.doc -
20210513-国信证券-CTA系列专题之一:基于开盘动量效应的股指期货交易策略.pdf
2021-05-13 19:59:1920210513-国信证券-CTA系列专题之一:基于开盘动量效应的股指期货交易策略.pdf -
基于计算实验金融的股指期货交易策略评测
2020-01-15 07:04:28基于计算实验金融的股指期货交易策略评测,熊熊,闫晓聪,本文主要使用区别于传统方法的计算实验金融方法,设计融合股票和股指期货市场的跨市场平台进行仿真实验,得到高频数据并对其进行 -
使用遗传算法优化具有移动平均线的石油期货交易策略-研究论文
2021-06-10 12:10:02在这项工作中,实施 AG 以优化基于 WTI 原油期货日内市场两条移动平均线的交易策略。 目标函数是总体投资回报。 中文: 通过计算工具和人工智能实施交易策略,如人工神经网络 (ANN) 和遗传算法 (AG) 已在文件中介绍... -
金融工程专题研究:CTA系列专题之三,基于Carry的商品期货交易策略.pdf
2022-05-25 13:27:37金融工程专题研究:CTA系列专题之三,基于Carry的商品期货交易策略.pdf -
专题资料(2021-2022年)0Avobfe《期货交易策略》.doc
2021-10-07 22:16:15教育资料 -
CTA系列专题之一:基于开盘动量效应的股指期货交易策略(30页).pdf
2022-02-11 00:03:49CTA系列专题之一:基于开盘动量效应的股指期货交易策略(30页).pdf -
算法策略 | 基于残差动量的横截面期货交易策略
2022-02-14 10:20:59致力于分享量化策略,培训视频,Python,算法研究等相关内容。量化策略开发,高质量社群,交易思路分享等相关内容
引言
大家好,我是LE CHIFFRE。
本年度第一个策略来了,我们公众号的VIP服务开通以来,一直缺少像选股一样选期货的策略。好,本期我们就来开发一个期货阿尔法相对动量策略。相对动量策略的依据理论有很多,我们这一期的算法是采用的套利回归算法中的方法与思想,改装成选期货做趋势。然而,我并不准备罗列一大堆数学公式,因为我也不会。而是秉持松鼠宽客一贯的作风——“接地气”,策略落地。
正文
OK,说正事儿。相对动量就要有相对一说,相对谁?股票里面是大盘是沪深300,期货呢?当然是板块指数。所以显而易见,第一步就是构建相对的目标也就是指数,第二步是把相对刻画出来,第三步是把刻画出来的相对变成进出场信号,第四步加上止盈止损。
首先我们来看一组对比:
上面是焦炭的主连后复权,下图是焦炭、铁矿、螺纹、热卷的板块指数构件图,从图中肉眼可以明显看到,2020年7-8月期间板块指数的向上走势要比焦炭自身更为单调向上,说明此期间热卷或者铁矿或者螺纹的趋势要比焦炭要好。我们放大这块时间图来仔细看:
从板块指数的技术形态和焦炭的技术形态可以明显看出,在此阶段,如果做多,我们选择另外三者要比焦炭更舒服一些。
下面我们就先介绍我们的第一步:板块指数的构建。
本文开头是自定义了Index_contract的函数构建板块指数,该函数的原理就是根据板块内所有品种的涨跌幅汇总构建的板块指数算法。
第二步:我们通过自定义LinearReg2seqs线性回归函数对标的资产和板块指数进行回归计算。
如上图所示,我们要计算出残差,就要计算出两个品种收盘价格时间序列的斜率和截距,斜率也就是贝塔值。依据中学所学y=ax+b,当我们求得贝塔值→a,随即也就求得b→截距,那么我们首先要求得就是斜率。
上图是计算贝塔值也就是斜率的公式,我们首先要计算出两个标的资产的协方差和某个标的资产的方差,我们举例说明,假设X是铁矿石,Y是螺纹钢,也就是我们需要求出铁矿石和螺纹钢的协方差和铁矿石的方差。
求出协方差同样要按照下面的公示分成两步,第一步求出length周期的平均值,类似均线。第二步求出铁矿石和螺纹钢的变量值与平均值的差值的乘积,后再求期望值(平均)。如下图所示,方差亦然。上述两个函数具体算法逻辑和代码,我们会在VIP群里发放,没有关注我们的朋友,请速速关注哦。
第三步:在第二步基础上得到标的资产和板块指数的回归残差,根据回归残差,我们构建进场信号。
这里我们采用传统的肯特钠通道,下面子图黄线为残差和肯特钠通道
第四步:止盈止损
上图所示为吊灯止盈的方式,具体的我们不再赘述,以往文章中我们已经经常用到,有任何疑问可在VIP群内咨询。
最后附上我们的工作区截图和部分回测结果展示(已做样本内外):
另外,强调的是,我们这一期采用的是ATR倒数的开仓模式,因为经过回测发现,固定手数的的确没有海龟资金管理方式好。但是我们可以在整体的开仓手数下进行同比例的缩小以应对大部分小资金账户的需求。
源码包
本策略仅作学习交流使用,实盘交易盈亏投资者个人负责。
-
期货程序化交易模型 完美期货程序化交易策略 v4.0
2020-10-21 07:30:15好期货程序化交易策略,无比简单的期货程序化交易策略!不用开通程序化授权,一天10分钟!没有时间的,通过条件单下单,不耽误工作,不耽误学习,不耽误日常生活,简约不简单 -
兴业证券_20171019_兴业证券CTA策略系列报告之三:基于库存基本面视角的商品期货投资策略(上)(1).pdf
2019-10-05 00:11:20本文是兴业证券定量研究 团队“宽海拾贝”系列报告 的第七篇。从上篇文章开 始,我们开启了一个全新的 系列研究——《体系的力 量》。本篇报告 继上篇对于 数据管理的讨论后阐述了 我们定义因子的具体方式。 -
期货软件指标期货指标公式文华财经期货软件 世界最简单交易策略.doc
2021-08-11 13:56:49期货软件指标期货指标公式文华财经期货软件 世界最简单交易策略.doc -
TB交易开拓者实盘策略002
2021-01-20 13:32:39Params Numeric midtanqilen(5); //黄线通道突破的长度参数初始值 Numeric BreakLimen(0); //价格突破黄线超出的比例 Numeric barsPer(0); //价格突破黄线的个数 Numeric WinPoint(1000); //盈利点数 ... -
经典的期货量化交易策略大全
2021-12-28 09:30:001.双均线策略(期货) 双均线策略是简单移动平均线策略的加强版。移动平均线目的是过滤掉时间序列中的高频扰动,保留有用的低频趋势。它以滞后性的代价获得了平滑性,比如,在一轮牛市行情后,只有当价格出现大幅度的...1.双均线策略(期货)
双均线策略是简单移动平均线策略的加强版。移动平均线目的是过滤掉时间序列中的高频扰动,保留有用的低频趋势。它以滞后性的代价获得了平滑性,比如,在一轮牛市行情后,只有当价格出现大幅度的回撤之后才会在移动平均线上有所体现,而对于投资者而言则大大增加了交易成本。如果使用双均线策略,就可以在考虑长周期趋势的同时,兼顾比较敏感的小周期趋势,无疑是解决简单移动平均线滞后性弱点的一项有效方法。
双均线策略源代码:https://www.myquant.cn/docs/python_strategyies/153
2.菲阿里四价(期货)
昨天高点、昨天低点、昨日收盘价、今天开盘价,可并称为菲阿里四价。它由日本期货冠军菲阿里实盘采用的主要突破交易参照系。此外,因菲阿里主观心智交易的模式,决定了其在实际交易中还大量结合并运用了“阻溢线”的方式,即阻力线、支撑线。
主要特点:日内交易策略,收盘平仓;菲阿里四价指昨日高点、昨日低点、昨日收盘、今日开盘;上轨=昨日高点;下轨=昨日低点;当价格突破上轨,买入开仓;当价格跌穿下轨,卖出开仓。
菲阿里四价策略源代码:https://www.myquant.cn/docs/python_strategyies/426
3.布林线均值回归(期货)
BOLL指标是美国股市分析家约翰·布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。一般而言,股价的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,布林线指标正是在上述条件的基础上,引进了“股价通道”的概念,其认为股价通道的宽窄随着股价波动幅度的大小而变化,而且股价通道又具有变异性,它会随着股价的变化而自动调整。由于之前大部分交易策略都是选股或者趋势追踪的择时,所以基于这一指标我们设计了一个均值回归的交易策略。
布林线均值回归策略源代码:https://www.myquant.cn/docs/python_strategyies/428
4.网格交易(期货)
网格交易是利用市场震荡行情获利的一种主动交易策略,其本质是利用投资标的在一段震荡行情中价格在网格区间内的反复运动以进行加仓减仓的操作以达到投资收益最大化的目的。通俗点讲就是根据建立不同数量.不同大小的网格,在突破网格的时候建仓,回归网格的时候减仓,力求能够捕捉到价格的震荡变化趋势,达到盈利的目的。
网格交易策略源代码:https://www.myquant.cn/docs/python_strategyies/104
5.跨期套利(期货)
跨期套利就是在同一期货品种的不同月份合约上建立数量相等、方向相反的交易头寸,最后以对冲或交割方式结束交易、获得收益的方式。最简单的跨期套利就是买入近期的期货品种,卖出远期的期货品种。
跨期套利策略源代码:https://www.myquant.cn/docs/python_strategyies/107
6.跨品种套利(期货)
跨品种套利是指利用两种不同的,但相互关联的商品之间的合约价格差异进行套利交易,即买入某一交割月份的某种商品合约,同时卖出另一相同交割月份、相互关联的商品合约,以期在有利时机同时将这两个合约对冲平仓获利。
跨品种套利的主导思想是寻找两种或多种不同,但具有一定相关性的商品间的相对稳定关系(差值、比值或其他),在其脱离正常轨道时采取相关反向操作以获取利润。根据套利商品之间的关系,跨品种套利可分为相关商品套利和产业链跨品种套利两种类型。
跨品种套利策略源代码:https://www.myquant.cn/docs/python_strategyies/106
7.海龟交易法(期货)
海龟交易法则属于趋势交易,首先建立唐奇安通道(下文会具体解释),即确定上突破线和下突破线,如果价格突破上线,则做多,如果价格突破下线就平仓或做空。
海龟交易法策略源码:https://www.myquant.cn/docs/python_strategyies/110
8.Dual Thrust(期货)
Dual Thrust是一个趋势跟踪系统,由Michael Chalek在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一。Dual Thrust系统具有简单易用、适用度广的特点,其思路简单、参数很少,配合不同的参数、止盈止损和仓位管理,可以为投资者带来长期稳定的收益,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。
Dual Thrust策略源码:https://www.myquant.cn/docs/python_strategyies/424
9.R-Breaker(期货)
R-Breaker是一种短线日内交易策略,该策略已经在市场上存活了二十年之久,尤其当指数波动较大时,该策略表现越好,根据S&P至2011年底的统计,R-Break也多次名列前十,由于进入榜单的交易系统业绩并不稳定,尤其是一年业绩榜单,时常会发生变化,因此模型的稳定性和一致性其实比短期排名更加关键,杂志给出了长期来看一致性最好的十大交易模型,其中就包括 R-Breaker 等模型,它们的业绩不一定总是能排进前十名的榜单,但长期以来具有较高的一致性。
R-Breaker策略源码:https://www.myquant.cn/docs/python_strategyies/425
10.做市商交易(期货)
做市商的主要利润来自于双向报价的买卖价差。因而,做市商需要计算期权的理论价格,在大量买入和卖出交易中,逐渐积累每笔交易价格和理论价格的差价,并根据持仓头寸特征,动态调整价差。由于做市商以被动成交为主,因而在一些对手方持续大量单边交易的情况下,做市商可能面临损失。
做市商交易策略源码:https://www.myquant.cn/docs/python_strategyies/109
11.alpha对冲(期货)
投资者在市场交易中面临着系统性风险(即贝塔或Beta、β风险)和非系统性风险(即阿尔法或Alpha、α风险),通过对系统性风险进行度量并将其分离,从而获取超额绝对收益(即阿尔法收益)的策略组合,即为阿尔法策略。
alpha对冲策略源代码:https://www.myquant.cn/docs/python_
-
2021年9月月度白糖期货投资交易策略报告:原糖调整,郑糖短期丧失向上驱动力.pdf
2021-09-23 00:22:362021年9月月度白糖期货投资交易策略报告:原糖调整,郑糖短期丧失向上驱动力.pdf -
基于市场情绪平稳度的股指期货日内交易策略
2021-04-09 11:38:52基于市场情绪平稳度的股指期货日内交易策略 策略分析请下载这个pdf 测试数据请下载这个csv文件 编程难点 平均最大回撤和平均最大反向回撤的计算 累计收益的计算 代码实现(使用python实现,其他编程语言大概一致)...基于市场情绪平稳度的股指期货日内交易策略
策略说明请下载下面这个pdf文件:
测试数据请下载下面这个csv文件:
实现内容
策略题为一个PDF文档(基于市场情绪平稳度的股指期货日内交易策略)和写策略需要的聚宽数据包(data.csv),
根据文档和数据包写出程序和年化收益图实现截图
编程难点
- 平均最大回撤和平均最大反向回撤的计算
- 累计收益的计算
代码实现(使用python实现,其他编程语言大概一致)
配置类Configuration.py
class Configuration: # 文件地址 file_path = "/Users/zhangqinxiong/Downloads/基于市场情绪平稳度的股指期货日内交易策略/data.csv" # 情绪平稳度阈值 emotional_stability_threshold = 9 / 10000.0 # 止损阈值 stop_loss_threshold = 0.5 / 100.0 # 初始金额 # 设置为100是因为算到最后的结果刚好可以以百分比表示 init_money = 100 # 多次开仓交易的数据 # money保存的是交易当前的金额 # details保存的是所有的交易数据 multi_transaction_data = dict(money=init_money, details=[]) # 一次开仓交易的数据 # money保存的是交易当前的金额 # details保存的是所有的交易数据 uni_transaction_data = dict(money=init_money, details=[]) # 交易成本(双边) # 在计算收益的时候需要去掉 service_charge = 2 / 10000.0 # 以日期分组的数据 data_group_by_date = {} # 沪深300期货每天的收盘价列表 hu_shen_300_date_close_price_list = [] # 沪深300期货每天的日期列表 hu_shen_300_date_list = []
处理csv文件的工具类csv_file_utils.py
import csv from domain.configuration import Configuration # 以日期分组数据 def group_data_by_date(file_path): # 从csv文件读取内容 file = open(file_path, "r") line_list = csv.reader(file) # 保存以日期分组之后的内容 data_group_by_date = Configuration.data_group_by_date # 不处理第一行字段 index = 0 # 遍历每一行内容 for line in line_list: # 第一行数据是字段名称,不用处理 index = index + 1 if index == 1: continue # 把每一行数据转换成对象 csv_data = dict(date=line[0], open=float(line[1]), close=float(line[2]), high=float(line[3]), low=float(line[4]), volume=int(line[5]), money=int(line[6])) # 截取日期,格式为年/月/日 csv_date = line[0] csv_date = csv_date.split(" ")[0] # list保存一个日期的所有数据 # 第一步先判断有没有保存这个日期的数据 # 如果没有则初始化为空的数组 # 如果有则拿出来 if csv_date in data_group_by_date.keys(): csv_data_list = data_group_by_date[csv_date] else: csv_data_list = [] # 保存数据 csv_data_list.append(csv_data) data_group_by_date[csv_date] = csv_data_list # 释放文件资源 file.close() # 计算保存沪深300期货所有的日期和收盘价数据 hu_shen_300_date_close_price_list = Configuration.hu_shen_300_date_close_price_list hu_shen_300_date_list = Configuration.hu_shen_300_date_list for date in data_group_by_date: data_of_date = data_group_by_date[date] # 每天的数据 len_of_data_of_date = len(data_of_date) close = data_of_date[len_of_data_of_date - 1]["close"] # 沪深300期货每天的收盘价 hu_shen_300_date_list.append(date) hu_shen_300_date_close_price_list.append(close) print("沪深300期货所有的日期列表:") print(hu_shen_300_date_list) print("沪深300期货每天所有的收盘价数据:") print(hu_shen_300_date_close_price_list)
计算市场情绪平稳度的工具类emotional_stability_utils.py
# 计算情绪平稳度 # 计算每分钟的最大回撤和反向最大回撤 # 最大回撤计算公式max(1 - close_j / close_i) # 反向最大回撤计算公式-min(1 - close_j / close_i) # 然后计算平均最大回撤和平均反向最大回撤 # 文档中指出使用收盘价格进行计算 # 平均最大回撤和平均反向最大回撤,哪个小就是用哪个 def calculate_emotional_stability(data): length_of_data = len(data) max_sum = 0.0 # 最大回撤求和 min_sum = 0.0 # 反向最大回撤求和 for i_value in range(0, length_of_data): close_i = data[i_value]["close"] max_value = 0.0 # 计算一分钟的最大回撤 min_value = 0.0 # 计算一分钟的反向最大回撤 for j_value in range(i_value + 1, length_of_data): close_j = data[j_value]["close"] calculate_result = 1 - close_j / close_i if calculate_result > max_value: max_value = calculate_result if calculate_result < min_value: min_value = calculate_result max_sum += max_value # 把每一分钟的最大回撤相加 min_sum += -min_value # 把每一分钟的反向最大回撤相加(注意取负值) max_ave = max_sum / length_of_data # 平均最大回撤 min_ave = min_sum / length_of_data # 平均最大反向回撤 print("平均最大回撤:" + str(max_ave)) print("平均最大反向回撤:" + str(min_ave)) # 比较平均最大回撤和平均最大反向回撤,哪个小就返回哪个 if max_ave <= min_ave: print("采用平均最大回撤作为平稳度") return max_ave else: print("采用平均最大反向回撤作为平稳度") return min_ave
绘制折线图的工具类line_chart_utils.py
# 绘制折线图 import matplotlib.pyplot as plt # 绘制折线图 from matplotlib.ticker import MultipleLocator from domain.configuration import Configuration # 绘制折线图 def draw_line_chart(): # 从单次开仓交易数据中获取折线图的数据 uni_line_chart_data = get_line_chart_data(Configuration.uni_transaction_data) uni_date_list = uni_line_chart_data["date_list"] uni_money_list = uni_line_chart_data["money_list"] # 从多次开仓交易数据中获取折线图的数据 multi_line_chart_data = get_line_chart_data(Configuration.multi_transaction_data) multi_date_list = multi_line_chart_data["date_list"] multi_money_list = multi_line_chart_data["money_list"] plt.subplots_adjust(bottom=0.4) # 调节下方位置,不然日期太长会被挡住 ''' plt.subplots_adjust(bottom=0.9) # 调节下方位置,不然日期太长会被挡住 plt.title("model cumulative income") # 标题,模型累计收益 plt.xlabel("date") # x轴表示日期 plt.ylabel("cumulative income") # y轴表示累计收益 # 把x轴的刻度间隔设置为40,并存在变量里 x_major_locator = MultipleLocator(40) # ax为两条坐标轴的实例 ax = plt.gca() # 把x轴的主刻度设置为40的倍数 ax.xaxis.set_major_locator(x_major_locator) # x轴倾斜90度 for tick in ax.get_xticklabels(): tick.set_rotation(90) ''' # 开始绘制折线图 fig = plt.figure(figsize=(20, 10)) ax1 = fig.add_subplot(111) ax1.xaxis.set_major_locator(MultipleLocator(30)) for tick in ax1.get_xticklabels(): tick.set_rotation(90) ax1.plot(multi_date_list, multi_money_list, color="blue") ax1.plot(uni_date_list, uni_money_list, color="gray") ax2 = ax1.twinx() # this is the important function ax2.xaxis.set_major_locator(MultipleLocator(30)) ax2.plot(Configuration.hu_shen_300_date_list, Configuration.hu_shen_300_date_close_price_list, color="orange") # 同时展示多条图表 plt.legend() plt.show() # 从交易数据中获取绘制折线图所需要的数据 def get_line_chart_data(transaction_data): # 保存x轴的数据 日期 date_list = [] # 保存y轴的数据 累计收益 money_list = [] for details in transaction_data["details"]: date_value = details["date"] money_value = details["money"] date_list.append(date_value) # 注意这里减去init_money非常必要,因为算的是累计收益,必须减去本金,不然会多100% money_list.append(money_value - Configuration.init_money) return dict(date_list=date_list, money_list=money_list)
计算累计收益的交易工具类transaction_utils.py
from utils import emotional_stability_utils from domain.configuration import Configuration # 计算一天的交易数据 # transaction_data 保存所有的交易数据 # date_value 日期 # date_init_list 一天所有的原始csv数据 # sample_observation_begin_index 样本观察开始索引 # sample_observation_end_index 样本观察结束索引 # finish_index 收盘平仓时的索引 def calculate_transaction_data(transaction_data, date_value, date_init_list, sample_observation_begin_index, sample_observation_end_index, finish_index): # 根据样本观察索引区间获取样本数据 sample_observation = date_init_list[sample_observation_begin_index:sample_observation_end_index] print("样本长度为:" + str(len(sample_observation))) # 根据样本数据计算情绪平稳度 emotional_stability = emotional_stability_utils.calculate_emotional_stability(sample_observation) # 情绪平稳度小于阈值,决定开仓 if emotional_stability < Configuration.emotional_stability_threshold: print("情绪平稳度小于阈值,决定开仓") # 样本观察收盘价 sample_observation_end_close = date_init_list[sample_observation_end_index - 1]["close"] # 样本观察开盘价 sample_observation_begin_open = date_init_list[sample_observation_begin_index]["open"] # 在样本观察之后的下一分钟开盘买入 buy_price = date_init_list[sample_observation_end_index]["open"] # 如果样本观察的收盘价大于样本观察开盘价,则做多 if sample_observation_end_close > sample_observation_begin_open: print("开始做多") long = 1 else: print("开始做空") long = 0 for i_value in range(sample_observation_end_index + 1, finish_index): # 在开盘之后判断是否需要止损 sell_price = date_init_list[i_value]["open"] # 如果做多,则用卖出价格减去买入价格 if long == 1: percent = (sell_price - buy_price) / buy_price # 如果做空,则用买入价格减去卖出价格 else: percent = (buy_price - sell_price) / sell_price # 如果损失大于止损阈值,则平仓止损 if percent < 0 and abs(percent) > Configuration.stop_loss_threshold: print("平仓止损") transaction_data["money"] = transaction_data["money"] * (1 + percent - Configuration.service_charge) transaction_data["details"].append( dict(date=date_value, money=transaction_data["money"])) return print("收盘平仓") sell_price = date_init_list[finish_index - 1]["close"] # 如果做多,则用卖出价格减去买入价格 if long == 1: percent = (sell_price - buy_price) / buy_price # 如果做空,则用买入价格减去卖出价格 else: percent = (buy_price - sell_price) / sell_price transaction_data["money"] = transaction_data["money"] * (1 + percent - Configuration.service_charge) transaction_data["details"].append( dict(date=date_value, money=transaction_data["money"])) return else: print("情绪平稳度大于阈值,决定不开仓") transaction_data["details"].append(dict(date=date_value, money=transaction_data["money"])) return
最后是程序入口main.py
# 程序入口 from utils import csv_file_utils, line_chart_utils, transaction_utils from domain.configuration import Configuration # 以日期分组数据 csv_file_utils.group_data_by_date(Configuration.file_path) data_group_by_date = Configuration.data_group_by_date for date in data_group_by_date.keys(): print("开始处理日期" + date + "的数据") # 当前日期所有的初始数据 date_csv_list = data_group_by_date[date] length = len(date_csv_list) print("当前日期有" + str(length) + "条数据") # 早晨样本观察开始索引 morning_sample_start = 0 # 早晨样本观察结束索引 morning_sample_end = 0 # 早晨平仓索引 morning_position_close = 0 # 下午样本观察开始索引 afternoon_sample_start = 0 # 下午样本观察结束索引 afternoon_sample_end = 0 # 下午平仓索引 afternoon_position_close = length # 多次开仓的交易策略中,上午开仓同原始策略一致,观察开盘后50分钟的收盘价样本,随后决定是否开仓。但是在11:30上午收市时平仓。下午开盘则充分利用上午的数据,观察包括上午收盘数据在内11:12至13:32的数据样本,并在13:33决定下午是否开仓。 # 遍历该日期对应的所有时间点,找出操作点对应的索引 for i in range(0, length): i_date = date_csv_list[i]["date"] if i_date.endswith("9:16"): morning_sample_start = i if i_date.endswith("10:06"): morning_sample_end = i if i_date.endswith("11:30"): morning_position_close = i if i_date.endswith("11:12"): afternoon_sample_start = i if i_date.endswith("13:32"): afternoon_sample_end = i # 多次开仓 --> 早晨开仓 print("----------------------------------------") print("多次开仓 --> 早晨开仓,开始处理......") transaction_utils.calculate_transaction_data(Configuration.multi_transaction_data, date, date_csv_list, morning_sample_start, morning_sample_end, morning_position_close + 1) # 多次开仓 --> 下午开仓 print("----------------------------------------") print("多次开仓 --> 下午开仓,开始处理......") transaction_utils.calculate_transaction_data(Configuration.multi_transaction_data, date, date_csv_list, afternoon_sample_start, afternoon_sample_end, afternoon_position_close) # 一次开仓 print("----------------------------------------") print("一次开仓,开始处理......") transaction_utils.calculate_transaction_data(Configuration.uni_transaction_data, date, date_csv_list, morning_sample_start, morning_sample_end, afternoon_position_close) print("\r\n") # 开始绘制折线图 line_chart_utils.draw_line_chart()
福利环节,源码链接地址(我永远喜欢薇尔莉特,永远喜欢编程ヾ(≧▽≦*)o)
-
全球商品期货量化交易策略
2020-09-08 09:46:41商品期货品种繁多,可以通过多品种投资...全球商品期货量化对冲基金及产品介绍商品期货交易源远流长,分布广泛。商品期货品种繁多,因此可以通过多品种投资有效降低回撤。另一方面,商品期货市场与股票市场有着相对. -
恒指期货交易策略十大心法
2020-01-08 13:02:15工欲善其事,必先利其器,要在期货市场中立于不败之地,拥有必胜的十大操作心法是先决条件,有了正确的观念,再配合投机、避险、套利及价差交易等多样的交易策略,必然能在期货市场游刃有余,创造惊人的收益。... -
重磅干货:万字长文解析全球商品期货量化交易策略.pdf
2021-12-17 08:20:55重磅干货:万字长文解析全球商品期货量化交易策略 -
量化对冲网格模型基于发明者平台的比特币OKCoin期货交易策略
2018-12-27 16:36:41OKCoin期货跨期对冲策略,季度、当周、次周 1、 季度-当周 2、 季度-次周 3、 当周-次周 4、在周五交割前5分钟会自动 平仓, 锁定15分钟 后再正常运行。 作者本人呢 是菜鸟程序猿一个, 平时没什么爱好,就喜欢写... -
期货策略自动交易软件模拟版
2018-11-24 09:51:251、在上海期货信息技术仿真交易网站(http://www.simnow.com.cn/static/register1.action)上注册仿真交易... 3、程序能自动化交易期货合约,并生成交易日志。 如果出现找不到msvcp140.dll的情况,请安装vs2015运行库。 -
量化投资学习必读书目(九)——《期货交易策略》
2019-06-03 11:13:46他在华尔街的33年之中,一直在期货市场上从事商品期货交易,积累了大量的经验。在20世纪70年代初的商品期货暴涨行情中,用1.8万美元获利100万美元。岁月流逝,财富积累,斯坦利·克罗带着他在华尔街聚集的几百万美元... -
经典策略-掘金量化.pdf
2018-12-03 17:53:35以Python语言,经典量化交易策略,可以用以基础的学习和改进参照。 -
10分钟打造WonderTrader上的期货日内交易策略
2020-12-29 15:24:40最终策略源码如下from wtpy import BaseStrategyfrom wtpy import Contextclass StraDualThrust(BaseStrategy):def __init__(self, name:str, code:str, barCnt:int, period:str, days:int, k1:float, k2:float, ... -
2022年金融工程年度策略系列之量化CTA模块.pdf
2022-02-22 12:30:092022年金融工程年度策略系列之量化CTA模块.pdf -
常见商品期货量化交易策略
2019-05-07 11:49:55转 常见商品期货量化交易策略 商品期货套利策略 套利策略一般包括期现套利、跨期套利、跨市场套利、跨品种套利等。 对于商品期货而言,期现套利必须交易大量的商品实物,这对大多数机构投资者而言并不合适。因此...