期货程序化交易培训.ppt_第1页
期货程序化交易培训.ppt_第2页
期货程序化交易培训.ppt_第3页
期货程序化交易培训.ppt_第4页
期货程序化交易培训.ppt_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

善用程序化工具 提升客户交易能力,经纪管理部 营销中心 唐韵,程序化交易培训,独立性声明 作者保证报告所采用的数据均来自合规渠道,分析逻辑基于小组成员的专业理解,通过逻辑判断,并依据市场公开历史数据得出结论,力求客观、公正,特此声明。 免责声明 文中的观点、结论和建议仅供参考,报告中的信息或意见并不构成所述证券或期货的买卖出价或征价,投资者据此作出的任何投资决策与本公司和作者无关。 版权声明 本报告版权仅为我公司所有,未经书面许可,任何机构和个人不得以任何形式翻版、复制发布。如引用、刊发,须注明出处为东吴期货有限公司,且不得对本报告进行有悖原意的引用、删节和修改。,以卓著策略研究 见证您成就非凡,以程序化交易提升客户交易能力,客户编程入门及程序化案例,程序化交易策略开发基础,帮助客户 理解测试报告,1,4,3,2,程序化交易策略的优化,5,以程序化交易 提升客户交易能力,上半年行情特征的常规总结,宏观经济因素特别复杂 趋势性差 价格的波动率小 交易成本太高,造成资金流失 成交量/持仓量的值小 盈利难度大 从两个策略的表现来分析行情的特征,6,上半年行情特征的常规总结,均线组合交易资金曲线图,上半年行情特征的常规总结,均线策略交易逻辑,计算10周期移动平均线ma10,计算20周期移动平均线ma20。 如果ma10上穿ma20,则以收盘价开多仓;如果ma10下穿ma20,则以收盘价开空仓。 交易级别为30分钟。 该策略为一直在市,为非多即空的系统。 策略按照等市值同时交易股指、铜、橡胶、锌、白糖、棉花、螺纹钢、pta、塑料、豆油等10个品种。,8,上半年行情特征的常规总结,周期突破组合交易资金曲线图,上半年行情特征的常规总结,周期突破策略交易逻辑,计算20周期最高点high20,计算20周期最低点low20。 如果收盘价上穿high20 ,则以收盘价开多仓如果收盘价下穿low20 ,则以收盘价开空仓 交易级别为30分钟。 该策略为一直在市,为非多即空的系统。 策略按照等市值同时交易股指、铜、橡胶、锌、白糖、棉花、螺纹钢、pta、塑料、豆油等10个品种。,历史重复着什么?,历史重复不是指价格的简单重复 历史重复着市场不变的本质: 人性不会变 人性的弱点不会变 人性弱点导致的错误不会变 历史重复着人性弱点的表现形式: 市场证明大多数是错的 市场让大部分人犯错 人性的弱点不断重复 人性弱点高度膨胀的结局不断重复,11,程序化交易优势,我们对程序化交易的理解,程序化交易特点,策略模型构建,我们对策略模型构建的理解,策略模型构建,最复杂 不等于 最有效,策略模型构建,最简单的价位突破策略模型举例,假设标准的分别是高斯分布,那么无论通过什么策略,我们都是无法盈利的。 我们能够盈利是因为历史数据之间有某种联系。 尖峰胖尾,高阶相关等等,任何隐的相关性都可以用来盈利。 盈利随着发现者的增多,这种无效性就会越来越少。因此有必要保护好自己的策略。,程序化交易能盈利吗?,程序化交易优势,程序化交易 如何提升交易能力 帮助形成交易思想 快速验证交易策略 程序化止盈止损 (客服人性弱点 减轻盯盘压力) 尝试新品种 需注意 在完全无人工值守的情况下 资金回撤幅度可能过大,程序化交易优势,证据为基础的技术分析 (evidence-based technical analysis,ebta),客户实际使用程序化交易 可能遇到的问题 不熟悉交易策略完整流程 不知道如何评估测试结果 测试结果与实盘交易无法匹配 测试结果过度最佳化 测试样本数据不足 忽略佣金成本与滑移价差 过分质疑或过分相信系统,客户faq,程序化交易策略开发基础,程序化策略流程,入场策略和出场策略 入场策略是引发买卖信号并开始交易的程序 出场策略是了结头寸的规则组合 两种入场和出场组合 总是在市场中,或者做多或者做空; 做多、做空;或者完全在市场之外(观望)。 有多少位交易者,就有多少种入场和出场策略。,程序化策略流程,4s法则 每个入场策略必须解决四个常规的设计问题:灵敏度、选择度、敏感度和耐受度,统称为4s。 1、灵敏度 灵敏度越高,市场运动和实际入场信号之间的延迟时间越短。比如基于盘中数据的入场信号将比基于月数据的入场信号更灵敏。 2、选择度 选择度越高,系统的盈利因子越大。盈利因子是毛利润与毛亏损的比值。如典型的趋势突破入场一般比趋势跟随入场具有更好的选择性,因为价格震荡区间内时,它并不产生信号。,4s法则,3、敏感度 入场策略越完善,它对噪声的敏感度越低,按照计划运行的可能性越大。例如,与复杂的波动性突破策略相比,简单趋势跟随策略一般不会错过重要趋势,因为价格可能连续数日走高或走低而不触发波动性突破入场信号。 4、耐受度 可以在较为广泛的多元化投资组合上使用?交易策略的耐受度越高,它可以应用的投资组合就越广泛,它的获利性就越容易长期保持。例如,与逆势策略相比,趋势跟随策略可以被应用于更多市场。,4s法则,趋势跟随(tf)策略 在检测到的趋势方向上建仓。比如5日和34日ma。 策略劣势 当市场位于交易区间内时,趋势跟随策略易于受到双面拉锯式亏损的影响。 如果价格以较快的速度运动,那么移动平均在发出趋势改变信号时就显得比较慢,在出场前放弃一大部分持有仓位的利润。 因为其他市场参与者也会关注关键移动平均值,所以趋势跟随策略在入场和出场时会导致额外的滑移价差产生。,常见交易策略分析,常见交易策略分析,逆势振荡(at)策略 寻找在预期的新趋势中建仓的机会。(如使用震荡指标来度量超买或超卖行情) 逆势策略比较灵敏,如果市场区间波动的话,逆势策略会产生令人惊叹的风险/回报比。 策略劣势 如果价格按原先的趋势运动,那么逆势策略便会导致巨额亏损。如果市场动量强劲,一笔大型亏损交易便会抹平多笔盈利交易的利润。 逆势策略需要很好的执行力和较低的交易费用,以保证持续获利。,常见交易策略分析,突破型(rb)策略 当价格超出预设屏障时买进或卖出。 突破型策略是一种特殊类型的趋势跟随策略。(例如将价格突破定义为在数日或数周的固定周期上出现新高或新低。又例如使用移动平均两侧的波动性交易带。) 突破型策略可以克服趋势跟随策略的限制,避免在价格振荡区交易 ,信号延时很小或没有! 策略劣势 当市场在新的价格高点或低点之后反转进入先前的价格整固区时,突破型策略易受假突破的影响。,基于形态的策略 传统的价格形态比如双重底和三角形。这类形态可以用来初始化趋势跟随、逆势或突破型入场。 基于事件的策略 基于事件的策略在预定事件的前后对市场运作进行分析,这些预定事件包括经济统计数字或红利分配的发布。例如,美国失业数据一般在每月的第一个星期五发布,而债券和股票市场经常焦急地期待这些数据。 优点:交易者能够建立独特的入场,而不容易被其他交易者推导出来。 缺点:需要对策略频繁地重新定义。,常见交易策略分析,条件组合与过度适配,策略中条件过多造成的问题 例如 开仓规则 前一根k线rsi30 近日最高价大于昨日最高价 今日收盘价格大于20日收盘价格20%之上 今日收盘价格大于前一日价格区间上三分之一之上 参数优化时 易造成过度适配,只遴选异样价格形态,基于策略本身:如均线交叉或区间突破 基于价位(获利目标):获利目标出场的最大限制是趋势可能在出场后继续。所以重新入场的条件和交易规模会对整体业绩产生重大影响。 基于时间:(如收盘前出场)所有市场都没有最佳交易持续时间。在我们出场之后,趋势很可能会继续,所以会损失较多的机会。 跟踪止损:当市场以平滑、长期的趋势运动时,跟踪止损表现最佳。 但设置较远的止损可能出场太慢,较近的止损易被击穿(atr)。 出场必须以止损单的形式设置,所以场内交易者可能会想方设法推动市场穿越价格图表上关键的支撑或压力价位来“击中”这些止损。,出场策略,出场策略,我们对“优秀”程序化交易策略的理解,什么是优秀的程序化交易策略,程序化交易策略举例,程序化交易策略举例,程序化交易策略举例,程序化交易策略举例,编程入门及程序化案例 (编程解读及测试结果),帮助客户学习程序化编程(以tb为例) tb公式系统架构: 公式系统最底层的东西就是函数,系统函数或者用户函数。 函数负责准备数据,这是个数据层。 指标、k线形态、特征走势和交易指令是表现层,他们负责把函数准备好的数据呈现出来。 函数是用来被调用的。指标、k线形态、特征走势和交易指令都可以调用函数,但是指标却不能调用指标,指标也不能调用交易指令。,编程入门,当前时间周期下所有k线的相关数据,按照时间从先到后的顺序排列而成的序列数据。每根k线中包含的数据如下:,bar数据的使用,bar数据的使用,bar数据是tb公式运行的基础。 bar数据是序列数据,可以回溯读取(图示)。 举例: 比较今天的最高价是否突破了昨天的最高价 表达式为:high high1 比较今天的最高价是否突破了前两天的最高价 表达式为:high high1 and highhigh2 或者:high high1 & highhigh2,40,bar数据的使用,41,序列变量,序列变量,序列变量,序列变量,序列变量,序列变量,序列变量,序列变量,序列变量,序列变量,序列变量,序列变量,n n-1 2 1 0,42,非序列变量,bar数据的使用,tb的公式一般由三段组成。 params numeric length(10); 公式参数段 vars numericseries ma; 公式变量段 begin ma = averagefc(close, length); 公式脚本段 end,tb公式结构,tb的执行流程 tb在历史数据测试中的运行机制和交易时间的运行机制有何区别? 值得注意的是 1、由于是历史数据,每根bar都是现成的,是没有tick的概念的。交易代码,在每根bar上运行一遍。 2、由于参数是不能动态改变的,所以,虽然也是程序代码的一部分,但没有必要在每根bar上都读取一次。只在第一根bar上读取参数,以后共用即可。 3、由于是历史数据,不会再发生改变,所以,不会出现信号时有时无的现象。 4、由于是历史数据,没有买卖盘的动态数据,所以,不会出现滑点,也不会出现成交不了的现象。,编程入门,tb运行机制,简单概括就是:从左到右,从上到下,tb的执行流程 tb在历史数据测试中的运行机制和交易时间的运行机制有何区别? 【在真实交易时间】 开盘后,分笔交易数据(tick)开始传过来。为了保持实时性,tb就必须对每个tick做出响应,就是在每个tick都运行一次程序代码。 每根最新的bar上,程序代码都被多次执行。这一点,和历史数据测试时明显不同。 这条bar的数据中,除了开盘价之外,其他的比如:收盘价、最高价、最低价都在随着每个tick的变动而变动。 如果交易代码中的开平仓条件中,用到了close、high、low,则有可能使信号时有时无。同样的一根bar上,由于主力的拉升,价格突然走高,符合了买入条件,该tick出现后,交易代码执行一次,发现符合买入条件,就发出买入指令。下一笔,价格又被打压下来,价格如此反复几次,就会在该bar上反复买入多次。从而形成反复开仓。如果该bar最终定型时,价格被打压回来了,超级图表上在该bar上是不会显示任何交易信号的,但实际上,却在该bar上买入了多次。,编程入门,建议客户重写用户函数 1、summation求和函数 从这个函数中你能学到if语句,for循环语句的用法,以及序列变量的用法。 2、average求平均函数 从这个函数中你能学到如何进行函数调用,并且把早先写的summation函数用一用,增强点成就感 3、extremes求极值函数 这个函数比较长,有74行代码。它几乎用到了所有的编程技巧。if语句,for语句,序列参数,序列变量,而且它还用了稍微高级的引用变量。如果你能写出这个函数,那么你在公式上就已经入门了。 建议客户重写两个指标,看看如何来使用函数 1、ma指标。学习如何来使用average函数返回的数据。 2、spread价差指标。学习如何使用多数据源调用。,编程入门,tb公式中有三种基本的数据类型 数值型(numeric) 字符型(string) 布尔型(bool) 为了对变量、参数进行回溯,又增加了序列类型 数值型序列变量/参数(numericseries) 字符型序列变量/参数(stringseries) 布尔型序列变量/参数(boolseries) 为了通过用户函数返回多个值,又增加了引用类型 数值型引用(numericref) 字符型引用(stringref) 布尔型引用(boolref),数据类型,参数在使用前必须进行声明,声明方法如下: params numeric length(10); string filename(“d:sample2.log“); bool outputtofile(false); 公式应用和用户函数的参数略有不同: 公式应用的参数只支持三种基本类型,用户函数的参数支持全部九种类型; 公式应用的参数一定要有初始值,而用户函数的参数可以没有默认值; 参数的值在公式的脚本段中只能引用,不能修改;,参数的声明和使用,变量的主要用处在于它可以存放计算或比较的结果,以方便在之后的脚本中直接引用运算的值,而无需重现计算过程。 变量在使用前必须进行声明,声明方法如下: vars numericseries ma; numeric stopline(30); 变量的赋值(变量类型和表达式的类型要一致) 变量名称 = 表达式; 例如:ma = averagefc(close,10);,变量的使用,控制语句,条件语句(if-else) if 语句 if - else 语句 if - else if 语句 if - else 嵌套 循环语句(forwhile) for 循环变量 = 初始值 to 结束值 for 循环变量 = 初始值 downto 结束值 while 循环,条件语句-if else语句,语法如下: if (condition) tb公式语句1; else tb公式语句2; 如果tb公式语句是单条,您可以省略,二条或者二条以上的语句必须使用。,for 语句 1,for语句是一个循环语句,重复执行某项操作,直到循环结束。语法如下: for 循环变量 = 初始值 to 结束值 tradeblazer公式语句; for循环的执行是从循环变量从初始值到结束值,按照步长为1递增,依次执行tradeblazer公式语句,结束值必须大于或等于初始值才有意义。,for 语句 2,如果希望for语句从大到小进行循环,可以使用以下的语法: for 循环变量 = 初始值 downto 结束值 tradeblazer公式语句; for-downto让循环变量从结束值每次递减1直到等于结束值,依次调用tradeblazer公式语句执行,初始值必须大于或等于结束值才有意义。,for语句求和及均线,sample: params numeric length(10); vars numeric sumvalue(0); numeric ma; numeric i; begin sumvalue = 0; for i = 0 to length - 1 sumvalue = sumvalue + closei; ma = sumvalue/length; commentary(“sumvalue=“+text(sumvalue); commentary(“ma=“+text(ma); end,叠加多个商品合约进行交易,tb可以在一个图表中插入多个商品合约,支持同时对多个商品合约数据源编写公式应用。具体的方法是在交易指令、bar数据及系统函数前加上数据源。tb中数据源的命名规则如下: data0:图表中最开始选择的商品合约 data1:第一个插入的商品合约 data2:第二个插入的商品合约 一个图表最多支持50个数据源; 调用方法: data1.a_sendorder() data2.buy(.) data3.close data4.marketposition,交易常用系统函数介绍,integer marketposition() - 获得当前的持仓状态 返回值为整型。返回值定义如下: -1 当前位置为持空仓 0 当前位置为持平 1 当前位置为持多仓 这个函数用来配合buy/sell指令工作,对a_sendorder无效。 integer barssinceentry() - 获得当前持仓的第一个建仓位置到当前位置的bar计数。 只有当marketposition != 0时,即有持仓的状况下,该函数才有意义,否则返回0; 在开仓bar上为0。,bool crossover (numericseries price1,numericseries price2) - 求price1是否上穿price2 返回值为布尔型。 price1和price2必须为数值型序列值。 bool crossunder (numericseries price1,numericseries price2) - 求price1是否下穿price2 返回值为布尔型。 price1和price2必须为数值型序列值。,信号消失问题,产生原因:使用变化的价格(如close)或是基于最新价close计算的技术指标,来作为交易的进场、出场或止损条件时,就会产生信号消失问题。 如果编写的公式策略中存在信号闪烁问题,在历史测试中会得出失真的测试结果,在实盘交易时,更会因为重复发单造成严重损失。 信号消失问题的一般解决办法: 延迟发单或用前一根k线的数据来做为判断条件 用能保持得住的价格来做为判断条件,用前一根k线做判断举例: condition = 交易条件 if (condition1) buy(1, open); 用high,low,open等做判断 if (highhigh1) buy(1,high1); ,信号消失问题,/ 名称: 使用参数和变量 / 类别: 公式应用 / 类型: 用户应用 / 输出: /- params string filename(“c:tbsample3.txt“); vars numeric change; begin change = close - close1; fileappend(filename,“date=“+datetostring(date) +“ time=“+timetostring(time) +“ close=“+text(close) +“ 涨跌:“+text(change); end,公式编写举例1,公式编写举例2,/ 名称: 双均线系统 params numeric length1(10); numeric length2(20); numeric lots(1); vars numericseries ma1; numericseries ma2; boolseries condbuy(false); boolseries condsell(false); begin ma1 = averagefc(close,length1); ma2 = averagefc(close,length2); plotnumeric(“ma1“,ma1); plotnumeric(“ma2“,ma2); condbuy = crossover(ma1,ma2); condsell = crossunder(ma1,ma2); if ( marketposition 1 and condbuy1 = true ) buy(lots,open); if ( marketposition -1 and condsell1 = true) sellshort(lots,open); end,公式编写举例3,/ 名称: 双均线止盈止损 params numeric length1(10); numeric length2(20); numeric lots(1); numeric takeprofit(1); / 百分比 numeric stoploss(20); vars numericseries ma1; numericseries ma2; boolseries condbuy(false); boolseries condsell(false); numeric minpoint; numeric myentryprice; numeric myexitprice; begin ma1 = averagefc(close,length1); ma2 = averagefc(close,length2); plotnumeric(“ma1“,ma1); plotnumeric(“ma2“,ma2); condbuy = crossover(ma1,ma2); condsell = crossunder(ma1,ma2); if ( marketposition 1 and condbuy1 = true ) buy(lots,open); if ( marketposition -1 and condsell1 = true) sellshort(lots,open);,minpoint = minmove * pricescale; myentryprice = avgentryprice; if (marketposition=1) if (high = myentryprice * (1 + takeprofit * 0.01) myexitprice = myentryprice * (1 + takeprofit * 0.01); if (open myexitprice) myexitprice = open; sell(0,myexitprice); else if ( low myentryprice + stoploss * minpoint) myexitprice = myentryprice + stoploss * minpoint; if (open myexitprice) myexitprice = open; buytocover(0,myexitprice); end,公式编写举例3,65,指标编写常见问题,指标编写完成后,还要注意在属性设置中进行相应的设置; 指标是在主图显示还是在子图显示; 指标的线型; 从v3转到v4的客户注意参数的位置 另外学习的例子可以参考: macd指标的写法(柱状图) sar指标(点图),帮助客户 理解测试报告,测试周期 测试周期应该足够长,一般为2年或更长时间,以便包含多个交易区间和趋势周期。 另一种选择方法是在测试周期应产生多笔交易。触发100次交易是最低标准。 在对单一市场进行测试和优化时,习惯上将整个数据分为三部分。首先使用中间部分来开发系统规则,然后用开头和结尾的数据对系统重新检查。用来开发规则的中间部分数据叫做“样本内”数据。我们需要使用“样本外”数据来避免测试期间的过度优化。,解读测试报告,净利润总额 净利润总额是毛利润和毛亏损之差。 盈利比率(胜率) 显然该数字越大越好。趋势跟随系统常见的胜率是30%50%,高于60%的比较少见。震荡系统的胜率通常较高。 平均每笔盈利/平均每笔亏损 平均每笔盈利等于毛利润除以盈利交易总数。平均每笔盈利与平均每笔亏损的比可以用来计算破产风险。 典型趋势跟随系统的返回值大于2。,解读测试报告,平均交易利润 净利润除以总交易数目。该数字取决于测试数据和交易系统规则。该数字当然越大越好。但如果数值为负或者太小,除非再在其他市场和其他时间框架上测试,否则不要用该策略交易。 最大单笔盈利(亏损) 超常趋势可以使我们得到一次大型的盈利交易。如果最大单笔盈利的利润超过净利润的50%,交易者就要小心了。 经验上的做法是将最大单笔盈利的利润从毛利润中删除。但是为了做一些对交易系统不利的调整,不要删除最大单笔亏损带来的亏损。 我们并不希望得到大型盈利交易的周期,而是在测试周期上带来最恶劣亏损的周期。,解读测试报告,最大连续亏损 最大连续亏损会对资金回撤产生巨大的影响。交易者应该仔细分析连续亏损出现的周期,以便理解在什么样的行情下自己的交易系统会产生大型亏损。 作为一条粗略的经验规则,交易者应该自问是否可以容忍两倍于报告中对于最大连续亏损交易给出的数字。这将告诉交易者如何设计资金管理方针,从而避免严重的资金回撒。 交易者还应自问,是否可以持有一笔亏损交易,持续如报告中所示的平均每笔亏损的长度。,解读测试报告,交易持续时间 交易持续时间这一块给出了平均获利和亏损交易的长度(盈利交易中的平均棒线数等于平均每笔盈利的长度)。 交易者应自问一下,如果持有头寸的持续时间如测试中所示平均盈利交易的长度,是否会感觉比较舒适?是否有纪律使自己的交易持续两倍于平均每笔盈利的长度?如果没有耐心,这将是一项困难的任务,而交易者将错过大型获利。 交易者还应自问一下,平均每笔盈利的长度是否与自己的交易周期相一致。如果平均交易的长度太长或太短,首先在更多数据上测试该系统,然后在其他市场上测试。如果对所得长度仍然不满意,那么就应当考虑更改交易系统了。,解读测试报告,程序化交易策略的优化,核心目标:获得平滑向上的资金曲线 对付资金曲线的下侧,而让市场去对付其上侧。 让账户资金的增长率最大化,而同时控制累积亏损的扩大。,优化策略,风险管理 亏损不等于风险 交易风险:由个别交易部位产生 (隔夜持仓风险,涨停跌停风险) 策略风险:由交易策略产生 (所有的策略都可能变得不赚钱) 投资组合风险:由多重策略,多重时间轴,多重市场产生,风险管理,优化策略,利用系统对参数进行优化(以文华为例) 过度优化风险:参数优化只是对历史数据而言,参数过度拟合(overfit) 过度拟合(overfit)是这样一种现象:一个假设在数据样本上能够获得比其他假设更好的拟合,但是在样本数据外的数据集上却不能很好的拟合数据。 由于样本中存在噪音,所以模型的拟合优度只能达到一定程度,这是理论能达到的最优拟合度。有些时候,当模型把噪音当成了信息进行拟合,使得拟合优度超过了理论的最优拟合度,过度拟合的模型实际上包含了错误的信息,预测能力很差。这种拟

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论