本文作者:qiaoqingyi

期货编程(期货编程软件)

qiaoqingyi 09-28 124

兴证期货研发部

刘倡

021-20370975

liuchang@xzfutures.com

  标签:均线、乖离率、时间周期、稳定盈利、程序化、趋势交易

  1.投资者常犯错误及系统简介

  2.选取交易对象

  3.指标选取

  4.操作逻辑

  5.下单

  6.vn.py基本介绍

  7.一个试验

  一.投资者常犯错误及系统简介

  稳定盈利是绝大部分投资者追求的目标,在期货市场中,短期能盈利的投资者是常见的,少见的是能长期持续不断盈利的投资者。对投资者进行观察可以看出,导致投资失败的原因林林总总,本文首先从笔者自己的认识出发,简单谈谈交易中的实际问题和建立本程序化交易系统的初衷。

  1.潜在收益以及风险不明晰,交易计划和风险承受能力不匹配

  期货投资与任何其它投资一样,需要投资者对收益目标以及自身风险承受能力有清晰的认识,并在此基础上制定交易计划,投资者可分为激进型和保守型。在交易中,出于对潜在收益以及风险不了解的原因,可能出现保守型投资者选择了激进型交易计划,交易计划产生的正常浮亏远超投资者风险承受能力,导致交易计划无法贯彻,最终投资失败的情况。以螺纹钢期货的波段操作为例,合约保证金约2000元/手,价格走势的波段高度大约在500点左右,即波段操作的正常浮盈和浮亏在5000元/手上下,波段周期在一个月左右。低保证金或让投资者误认为螺纹钢是一个低风险品种,常有投资者,带着几万元的总资金,动辄进行十多手的操作,导致保证金很快因正常的波段走势亏损殆尽,失去继续交易的可能。而利用程序化交易系统,则可以在实盘操作之前,通过回溯测试和跟踪测试,对可能的收益与亏损有较为清晰的了解。

  2.操作方式不规范,没有客观标准

  未经过训练的投资者,在交易中表现得较为随性,易受短期市场气氛影响,缺少规范化的交易计划,而有交易计划的投资者,则易受心态等因素干扰,未能贯彻既定计划。例如,投资者在亏损时不愿接受事实,容易迟疑不决,甚至不断加码,幻想行情会向对自己有力的方向运行,运气好时,或能转危为安,但更多的情况是被迫止损在最差的位置。同样,在获利时,投资者会表现出缺乏耐心,急于落袋为安,导致止盈过早,错过获取可观利润的机会。上述不规范、随性的操作方式是投资者赚小钱亏大钱的重要原因之一。而利用程序化交易系统,可以利用技术指标等一些客观标准,将开平仓、加减仓、止盈止损等操作规范化、机械化,避免随性操作或心态干扰。

  3.缺乏精力,同时急功近利

  交易是一件高强度的工作,需时时刻刻关注各个合约的盘面变化,及时发现有价值的交易机会。期货市场投资机会众多,但大部分商品在大部分时间是随机游走的,不具备交易指征。投资者受限于自身有限的精力或硬件条件,只能关注少部分商品,同时急功近利的心态会使投资者重仓押注一个商品的趋势。尽管期货市场流传着各种传奇,但毕竟实现概率极低,且风险巨大。而程序化交易系统能同时监控多个商品的趋势,等待并判断交易时机,投资者与其选择耗费巨大精力,冒着破产风险专注一个商品的趋势,不如利用程序化交易系统悠然自得的轻仓博取多个商品的趋势行情。

  以上几点,是笔者关注程序化交易系统的基本初衷。

  在期货市场中,趋势行情是最常见的、最令投资者趋之若鹜的行情,可能每一个投资者都曾梦想过在趋势行情中抄底摸顶,一下实现财务自由,但趋势行情也是极难操作的,趋势只有出现以后才知道,同时趋势常由众多波段组成,并且波段转变频繁,投资者容易出现操作与波段不匹配而错失利润承担亏损的情况,即“做趋势的死在震荡中,做震荡的死在趋势中”。鉴于此,笔者对程序化交易系统的研究将先从趋势行情入手,意图设计一个以波段交易为核心,以波段内交易为补充,最大化获取趋势段收益,尽量回避或减轻震荡段损失的程序化交易系统。

  本文在设计趋势交易系统时主要考量以下几个因素:1.基本面;2.技术面(以波浪理论为主);3.均线指标;4.乖离率BIAS;5.时间周期;6.开平仓时间;7.开平仓价格。

  接下来,本文将按实盘交易的流程,逐步介绍所设计的趋势交易系统,具体包括选取交易对象、指标选取、操作逻辑和下单等四个环节。

  二.选取交易对象

  本系统交易的标的可以是股票,也可以是期货合约,也可以是期货合约组合。选取一个合适的交易对象,是程序化交易系统盈利的基础,而作为一个趋势交易系统,显然应该选取波动率大,有明显趋势的交易对象。品种的走势林林总总,有的如动力煤的深V走势,也有如PTA这种上涨—震荡—再上涨的走势,还有如豆粕由各种小趋势组成的宽幅震荡的走势,之所以有这些不同的走势,是因为品种的基本面、市场主力操作方法、政策环境等因素存在不同。如何从众多品种中选择适合的交易对象,是首当其冲需要解决的问题,笔者认为可以利用以下几种方法或方法组合解决该问题。

  1.历史图形法

  历史总会不断的重演,对于市场化程度较高的品种而言,假如其历史走势波动大、趋势性较好,则其未来也有较大概率走出波动显著,趋势明显的行情,如豆粕或菜粕,几乎每个月份的合约都有一段宽幅震荡的时期。但对于市场化程度偏弱、政策影响更强的品种则不一定有这样的规律,如玉米。因此,选取交易对象的方法之一,是对历史图形的观察,选取那些市场化程度较高,同时在历史上有趋势走势的品种。

  2.基本面分析法

  前文提过,基本面是导致品种走势特点不同的原因之一,基本面,即供需发生重大变化,或其预期发生重大变化时,可能会引起品种走势出现较大波动。因此,可以通过深入研究基本面,找出未来供需或供需预期会发生重大改变的品种,选择这些品种作为趋势交易系统的标的。比如黑色系,16年在黑色系特别是煤炭行业推进的供给侧改革,极大的改变了煤炭的供需格局,使焦煤焦炭迎来了强势趋势行情。再比如美联储加息,美联储加息使世界经济从减息周期转向加息周期,国债期货或因此产生趋势行情。再比如玉米,玉米收储政策变化,也可能使玉米未来走出趋势行情。因此,对基本面的深入研究是选择交易对象的重要方法之一。

  3.技术面分析法

  对基本面进行深入研究有一定难度,特别是考虑到市场信息的不公开、不透明。而技术面信息相对较丰富,易于研究。一些品种有其特定的周期规律,比如“猪周期”、“糖周期”等等,周期规律在行情中的表现则是技术指标或行情形态的周期变化,因此可以根据这种变化选择合适的交易对象。本文借鉴艾略特波浪理论,认为趋势行情更容易在长期震荡以后产生,所谓“横有多长,竖有多高”,因此尽量选择那些经过长期震荡过的品种介入,一方面减轻交易系统在震荡期间的损失,另一方面避免丢失商品趋势性行情。具体而言,若某品种在历史高位经历过5次震荡后的向下突破,或是历史低位经历5次震荡以后的向上突破,则笔者认为该品种有较高的趋势交易价值。

  4.市场面选择法

  不论是股票还是期货市场,均有明显的“板块轮动”或“品种轮动”的特点。市场上常常出现一个或几个“领头羊”品种,例如16年的焦煤焦炭。这些“领头羊”的特点是,领涨领跌。比如领涨的品种,在市场处于多头的时候涨得多,市场处于空头的时候跌得少;比如领跌的品种,在市场处于多头的时候涨得少,市场处于空头的时候跌得多。并且往往会在相当长一段时间内引领市场变化,即所谓的强者恒强,弱者恒弱。当市场上出现这样的品种时,可能的趋势性行情就会产生,该品种或成为较好的交易对象。此外,同一板块中的强势与弱势品种的跨品种组合,也能构成较为理想的低风险高收益的交易对象。

  三.技术指标选取

  选取交易对象之后是技术指标的选取,技术指标种类繁多,笔者依据自身的经验和认识,将5日和10日均线、乖离率BIAS和时间周期等三个指标作为本趋势交易系统主要参考指标,交易信号由这些指标发出。

  1.均线指标

  均线指标简单明了,在趋势中表现较为可靠,广受投资者喜爱,也是各类行情软件的缺省配置。均线是市场成本原理的体现,而市场成本原理则是趋势产生的基础。此外在交易中,趋势行情来临后,都有投资者依托均线抄底摸顶的实例,以至于有投资者信奉“一根均线打天下”。因此均线指标的有效性不仅因市场成本对行情的影响,还在于大量投资者依赖此指标交易而形成的“自我验证”效应。

  从部分行情实例中,也可以看出均线指标的有效性。

  例一,上证指数的趋势行情时很强烈的趋势,MA5/MA10的起止点高度均占到趋势本身的70%。

  

图1:均线在上证指数中的表现

期货编程(期货编程软件)

  例二,动力煤的趋势上涨行情是一种慢牛,在实际中,属于无人看好但却是一步三折的慢牛,在这种趋势中MA5/MA10仍然可以捕捉到趋势段的70%。

  

图2:均线在动力煤1705中的表现

  例三PTA下降波段MA5/MA10表现得更好,这是由于普遍存在着快速下跌行情的缘故。

  

图3:均线在TA1705中的表现

  上述例子可以看出MA5/MA10指标在强劲的趋势中表现上佳,但相对而言,其缺点也较为明显,即常滞后于行情,依托此信号交易,可能会丢失一部分行情。在大牛或大熊等行情中,这种滞后尚能承受,但在较小的趋势行情或波幅较大的震荡中,这种滞后就难以让人满意了,因此需要引入其它参数,即乖离率(BIAS)和波段时间周期。

  2.乖离率(BIAS)

  乖离率(BIAS),反映一定时期内价格与其均线的偏离程度,衡量剧烈波动时价格回调或反弹的可能性和正常波动时维持现有趋势的可信度。在趋势的顶底区域,笔者使用乖离率来预先进行翻转操作,即在顶部区域,乖离率较高时,尽管均线仍指示出上升趋势,依然提前平掉多仓;反之,在底部区域,乖离率较低时,尽管均线仍指示出下降趋势,依然提前平掉空仓。在大牛、大熊等强劲趋势行情中,这种做法可能会牺牲一部分利润,但考虑到还有众多的中等或小型趋势行情,因此仍采用这种做法,来保证系统整体收益最大化。

  BIAS的具体数值是按6日平均线计算的,不太符合通常一周5个交易日的习惯,但在实际使用中,BIAS主要配合时间周期,利用BIAS的极大值和极小值做判断,因此并不需要太精确。另外,RSI也可以达到相同效果。

  例,从PTA1705最近一个上升趋势,若只用MA5/MA10,能盈利的趋势段仅占总趋势段的一半左右,但若使用BIAS预先止盈,则能盈利的趋势段能占到80%。

  

图4:BIAS在TA1705中的表现

  3.时间周期

  本交易系统的核心是波段交易,是通过不断赚取每个波段的利润来实现趋势盈利的,同时通过波段内的操作,尽可能减少在震荡期间的亏损,因此波段的时间周期是重要的因素。一个波段的时间周期就是一个上升波段,或下降波段,或震荡波段的持续时间长度。不同商品在不同时期的波段时间周期不尽相同,有些规整,有些多变。笔者认为,商品投资者的交易习惯在短期内有一定延续性,因此选用最近的一个波段时间周期作为当前走势的参考指标。通常将一个波段时间周期分为三部分,在前三分之一与后三分之一时间内,通过配合乖离率进行仓位的预先平仓或翻转。这个参数在每日交易前输入,开盘前,投资者通过观察品种的K线图,确定即将来临的K线所处波段的总周期,以及当前周期所处的位置。

  四.操作逻辑

  在介绍过交易对象选取与参考指标后,笔者将在本节简单介绍交易信号的生成,以及相应的操作,大体可分为开仓、加仓、减仓、止盈、止损和清仓等七个动作。

  1.开仓:由空仓状态转为持有多单或空单状态

  满足两个条件之一即可建立多单:一是5日均线上穿10日均线;二是在波段时间周期的后三分之一,当BIAS触及低价区时或尾盘时5日均上穿10日均线。

  满足两个条件之一即可建立空单:一是5日均线下穿10日均线;二是在波段时间周期的后三分之一,当BIAS触及高价区时或尾盘时5日均下穿10日均线。

  2.加仓

  在上升波段中,即5日均线大于10日均线,当日内价格低于5日均线可加多仓,在尾盘或在K线实体较大时平掉止盈。

  在下降波段中,即5日均线小于10日均线,当日内价格高于5日均线可加空仓,在尾盘或在K线实体较大时平掉止盈。

  3.减仓

  上升波段的波段时间周期进入后三分之一时,若BIAS处于高位或尾盘5日均线下穿10日均线时,可以平掉全部或部分多单。

  下降波段的波段时间周期进入后三分之一时,若BIAS处于低位或尾盘5日均线上穿10日均线时,可以平掉全部或部分空单。

  4.止盈

  这里主要涉及系统外的状况,如虽然系统正常运行,但若基本面出现异动,此时可能会超出系统反应能力,比方说可能会出现涨跌停板,导致系统无法执行交易,又或者行情或转向震荡,此时应当平仓止盈,离场观望。

  5.止损

  若系统一直亏损,说明商品或处于一个长期的窄幅震荡中,特别是当所选品种在前期已经历过一波较长趋势行情,进入历史高点或低点时,可能会出现震荡时间无法预计的情况,若出现这种情况,则说明交易对象选择有误,需平仓止损,重新选择交易对象。

  6.清仓

  当系统和基本面产生严重背离时,如基本面表征见顶,但系统仍显示做多;或基本面表征见底,系统仍显示做空时。可清仓观望,等待系统与基本面背离回归。

  五.下单时机的选择

  当系统出现交易信号后,投资者可择机进行实盘下单。尽管交易系统给出了操作提示,但商品盘面走势有细微区别,交易系统无法尽善尽美的反映出来,系统给出的时机不一定是最优的,因此投资者可以根据自身对商品盘面的认识,对系统参数,或直接对下单的时间和价格进行微调,这个环节较依赖于投资者的经验和智慧。投资者在开盘须做足工作,观察外盘或基本面等因素,对日内行情的走势有个大致的估计,开盘后,关注市场整体情绪,相关品种走势等因素,当系统给出信号时候,正确的下单。

  六.vn.py基本介绍

  vn.py是一个基于python的开源交易平台开发框架,项目起源于国内私募的自主交易系统,伴随着vn.py项目业内关注度的上升和github社区不断的贡献,目前已经成长为一套全面的交易程序开发框架,用户群体也日渐多样化,包括私募基金、证券自营和资管、期货资管和子公司、高校研究机构、个人投资者等。

  实际使用中,笔者对vn.py有几点直观体验,1.免费;2.vn.py接口丰富;3.支持运行编写毫秒级以上策略;4.有回测框架且逻辑与交易框架相同,支持一套代码从回测到交易;5.与文华、TB等常见的程序化交易软件相比,vn.py可以编写更复杂的策略,如跨多周期的技术指标计算。6.需要有一定编程基础;7.安装较为麻烦,没有集成安装包,用户需按官网指导逐步进行,笔者曾在不同的电脑上尝试安装vn.py,成功失败概率各半,失败的原因多以系统缺失dll文件为主,从笔者经验看,在刚装好的64位win7系统上安装vn.py成功概率最高。

  下面简单介绍一下vn.py的策略编写、回测和交易

  按官网流程安装好vn.py后,进入vn.pyvn.traderctaAlgo文件夹,其中ctaTemplate.py即为策略模版,也是所有策略的父类,用户在编写策略时,需继承该类。

  

图5:以提供的ctaDamo.py为例,在编写新的策略类时,需继承ctaTemplate

  大体上,一个策略类包括_init_、onInit、onStart、onStop、onTick、onBar、onOrder、onTrade等函数,其中主要使用的是onInit、onTick、onBar这三个函数,如果对委托下单有更细粒的要求话,也会用到onOrder和onTrade两个函数。笔者暂时只介绍onInit、onTick和onBar三个函数。

  onInit

  onInit是策略初始化函数,通过调用该函数,可以对策略进行初始化设置,具体而言,可将均线参数、乖离率参数、时间周期参数、需要预先缓存的数据写入这个函数中,当函数调用后,对策略的参数进行初始化设置。该函数也可以配合ConfigParser库或xlrd函数,在初始化时自动将本地.ini文件或者.xls文件中的数据导入。

  

图6:结合ConfigParser函数,可以在开盘前将当天交易参数录入到策略中

  onTick和onBar

  vn.py提供了两种行情推送方式,其一是Tick级推送,其二是将Tick数据拟合成一分钟K线数据后推送。onTick和onBar是收到行情推送后直接被调用的函数,也是程序化策略编写场所。这里以vn.py自带的ctaDemo.py策略为例,在该策略的onBar函数中,红框代表技术指标的计算部分,本例是均线计算,绿框是交易信号的产生,本例是均线上穿下穿。蓝框,则是当交易信号产生后的操作,具体包括buy开多、sell平多、short开空、cover平空等发单操作。由于是仅考虑回测的Demo,因此考虑稍显简单,实盘中可能出现发单不成交的情况,笔者在编写时,将onBar分为三块,分别是技术指标计算模块、发单后检验是否成交模块、交易信号产生和响应模块,笔者认为这样的设计能使代码在测试与实盘交易时基本接近。

  

图7:ctaDemo的onBar函数

  onTick函数,同样以ctaDemo.py的onTick为例,在ctaDemo.py中,onTick函数主要被用作拟合一分钟K线,并在整数分钟调用onBar函数,执行函数中的策略。除了拟合一分钟K线外,还可以将一些发单撤单的逻辑,编写在onTick函数中实现。比如一个策略是以K线为单位的响应动作的,但诸如“发单3秒未成交,先撤单,改为对手价再发单”等逻辑,其时间周期是显著小于K线推送周期的,如果编写在onBar中显然无法实现,但onTick的单位是500毫秒,因此,可以在onTick函数中编写并实现该逻辑。

  

图8:ctaDemo的onTick函数

  策略编写之后进入回测模块,这里主要用到vnpyvn.traderctaAlgo文件夹中的ctaHistory.py和ctaBacktesting.py两个文件。其中ctaHistory.py主要负责将数据导入至本地的MongoDB数据库,ctaBacktesting.py文件则提供回测。

  

图9:ctaHistory.py

  当通过测试,策略可以进入交易了,首先需配置交易接口,笔者使用的是CTP交易接口,在vnpyvn.traderctpGateway中打开CTP_connect.json,将网络配置输入并保存即可。

  

图10:接口配置,以CTP接口为例

  接着需配置策略,在vnpyvn.traderctaAlgo文件夹中,将CTA_setting.json和ctaSetting.py按要求配置好。

  

  

图10:参数配置

  最后,打开vn.py的交易界面,通过双击vnpyvn.trader文件夹中的vtMain.py进入vn.py的交易界面(假设之前vn.py正确安装,且默认执行.py文件的是python2.7),通过点击算法—CTA策略进入策略板块

  

图10:vn.py的交易主界面

  

图11:vn.py的策略界面

  通过点击加载策略,即可将在CTA_setting.json和ctaSetting.py配置的策略导入,通过点击初始化,调用策略的onInit函数,对策略进行初始化配置,接着点击启动,即可将策略投入交易。

  以上,就是在vn.py里编写策略、回测、投入交易的大体步骤。

  七.一个试验

  笔者是PTA研究员,本节在TA1701合约上回溯测试一下前文提及的策略,回测时间在16年4月25日到16年12月15日。以此作为该交易策略范例。

  下面,先简单一些解说。

  首先,PTA在2016年不是一个强势品种,基本面上供需大体平衡,也没有象黑色系那样有国家政策的加持。技术面上,TA刚经历过15年尾的长下跌趋势,再出现新的下跌趋势,或者出现明显的反转的几率都不大,大概率上是走震荡或者震荡盘升的行情。因此从选择交易标的来看,并不是一个特别符合趋势交易规则的合格品种。

  其次,在选取参数上面也没有优化。均线指标采用MA5/MA10,RSI的临界值默认为20和80(为了简化,用RSI代替BIAS),时间周期的选取采用最简单的上个波段长度。

  最后,在行情上面,依据窄幅震荡不跑趋势的原则,在明显进入窄幅震荡的时候,停止运行策略,并在品种震荡5波后,重新运行策略。停止运行时间段为2016年8月9日到2016年11月7日。

  下面是跑程序的结果。笔者想要说明的是,即便在一个没有精挑细选的品种上,只要使用最基本的框架,只要符合本系统的大原则,交易策略就能够盈利。

  在投入实际交易前,各种参数还需要优化。还要有必要的仓位策略,才能获取更好的盈利。

  

图12:TA1701的日K线图

  图13、14即为回测结果,其中图13是vn.py的回测引擎自动输出的结果。其中的图一,代表每次交易后的资金曲线的变化。图二,则是每笔亏损交易的亏损金额。图三,则是所有交易的盈亏分布。图14则是具体成交记录。

  

图13:策略回测结果

  

图14:策略回测交易记录

阅读
分享