程序化交易策略实现与实例详解

上传人:枫** 文档编号:567914325 上传时间:2024-07-22 格式:PPT 页数:72 大小:1.77MB
返回 下载 相关 举报
程序化交易策略实现与实例详解_第1页
第1页 / 共72页
程序化交易策略实现与实例详解_第2页
第2页 / 共72页
程序化交易策略实现与实例详解_第3页
第3页 / 共72页
程序化交易策略实现与实例详解_第4页
第4页 / 共72页
程序化交易策略实现与实例详解_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《程序化交易策略实现与实例详解》由会员分享,可在线阅读,更多相关《程序化交易策略实现与实例详解(72页珍藏版)》请在金锄头文库上搜索。

1、1程序化交易策略实现与实例详解程序化交易策略实现与实例详解蔡云华蔡云华深圳开拓者科技有限公司深圳开拓者科技有限公司内容安排内容安排通过实例讲解 持仓交易系统的策略与实现 日内交易系统的策略与实现2持仓交易系统的设计要素持仓交易系统的设计要素设计思路:趋势跟踪;设计原则:捕捉主要的波段行情;设计细节:减少盘整时的连续亏损和最大资金回撤。总的原则:Cut loss short, Let profit run截短亏损,让利润奔跑截短亏损,让利润奔跑! 双均线交叉系统双均线交叉系统DMACS交易规则:如果短期均线上穿长期均线,做多,如原来持有空单,则先平空单,再建多仓如果短期均线下穿长期均线,做空,如

2、原来持有多单,则先平多单,再建空单短周期:10长周期:20交易头寸暂为1手4 双均线指标双均线指标DualMAParamsNumeric Length1(10);Numeric Length2(20);BeginPlotNumeric(MA1,AverageFC(Close,Length1);PlotNumeric(MA2,AverageFC(Close,Length2);End5 DMACS版本版本1Params Numeric Length1(10);Numeric Length2(20); Numeric Lots(1); Vars NumericSeries MA1; NumericS

3、eries MA2; BoolSeries condBuy(false);BoolSeries condSell(false);Begin MA1 = AverageFC(Close,Length1); MA2 = AverageFC(Close,Length2); condBuy = CrossOver(MA1,MA2);condSell = CrossUnder(MA1,MA2);If (condBuy1=true) Buy(Lots,Open); If (condSell1=true) SellShort(lots,Open); End 6 DMACS_V1主要交易品种测试结果主要交易品

4、种测试结果品种品种测试佣金测试佣金测试时间段测试时间段净利润净利润最大回撤最大回撤净利润净利润/最大回撤最大回撤Cu0004%1998.07.30-526451-1300574.05ZN0004%2007.03.26-114012-310793.66RU0004%1998.11.05-279287-533185.23RB0004%2009.03.27-14724-83621.76A90004%1998.12.10-25723-113882.25M90004%2000.07.17-19923-157251.26Y90004%2006.01.09-27494-647510.04L90004%200

5、7.07.31-37485-194691.92CF0004%2004.06.01-78075-470571.66SR0004%2006.01.06-37522-182062.06TA0004%2006.12.18-63531-114455.55ER0004%2009.04.20-1727-27720.62 DMACS V1存在的问题存在的问题盈利单利润回吐太多。必须增加追踪止赢的设置 增加追踪止赢增加追踪止赢以天胶做多为例: 假如,我们在开盘价30000元/吨买入; 追踪止盈 300点(300X5=1500元/吨);盈利峰值价盈利峰值价止损点止损点31000295003150030000320

6、003050032500310003300031500 增加参数TrailingStop,默认值设为400;增加变量MinPoint,用来保存最小变动单位。MinPoint = MinMove*PriceScale;增加序列变量HigherAfterEntry,LowerAfterEntry用来保存开仓后的最高价或最低价。因为我们的入场是以开盘价入场,所以可以实现开仓Bar的止损,但开仓Bar的最高价,不能计入开仓后的最高价,而只能以进场价作为开仓后的最高价。 进场位置和盈利峰值价计算进场位置和盈利峰值价计算 开盘价开盘价最低价最低价追踪止损价追踪止损价盈利峰值价盈利峰值价止止损损没没被被止止

7、损损 开盘价进场的追踪止损开盘价进场的追踪止损 开盘价开盘价(进场价(进场价)最低价最低价追踪止损价追踪止损价以进场价作为盈利峰值价以进场价作为盈利峰值价止止损损 DMACS_V2(1)Params Numeric Length1(10);Numeric Length2(20); Numeric TrailingStop(400);Numeric Lots(1); Vars NumericSeries MA1; NumericSeries MA2; BoolSeries condBuy(false);BoolSeries condSell(false);Numeric MinPoint;Num

8、eric MyPrice;NumericSeries HigherAfterEntry;NumericSeries LowerAfterEntry;Begin If(BarsSinceEntry = 1)HigherAfterEntry = Max(HigherAfterEntry1,High1);LowerAfterEntry = Min(LowerAfterEntry1,Low1);13 DMACS_V2(2)MinPoint = MinMove * PriceScale;MA1 = AverageFC(Close,Length1); MA2 = AverageFC(Close,Lengt

9、h2); condBuy = CrossOver(MA1,MA2);condSell = CrossUnder(MA1,MA2); If (condBuy1=true)Buy(Lots,Open);HigherAfterEntry = Open;LowerAfterEntry = HigherAfterEntry;If (condSell1=true)SellShort(lots,Open);HigherAfterEntry = Open;LowerAfterEntry = Open;14 DMACS_V2(3)Commentary(HigherAfterEntry=+Text(HigherA

10、fterEntry);Commentary(LowerAfterEntry=+Text(LowerAfterEntry);If(MarketPosition=1)If(Low = HigherAfterEntry - TrailingStop*MinPoint)MyPrice = HigherAfterEntry - TrailingStop*MinPoint;If(Open = LowerAfterEntry + TrailingStop*MinPoint)MyPrice = LowerAfterEntry + TrailingStop*MinPoint;If(Open MyPrice) M

11、yPrice = Open;BuyToCover(Lots,MyPrice);End 15 DMACS_V2主要交易品种测试结果主要交易品种测试结果品种品种测试佣金测试佣金测试时间段测试时间段净利润净利润最大回撤最大回撤净利润净利润/最大回撤最大回撤Cu0004%1998.07.30-555589-96350 4.05-5.76 ZN0004%2007.03.26-107320-23125 3.66-4.64 RU0004%1998.11.05-272302-42767 5.23-6.36 RB0004%2009.03.27-17813 -8362 1.76-2.13 A90004%1998.

12、12.10-27533 -9206 2.25-2.99 M90004%2000.07.17-20093 -16138 1.26-1.24 Y90004%2006.01.09-28617 -38430 0.04-0.74 L90004%2007.07.31-38360 -19469 1.92-1.97 CF0004%2004.06.01-111640-16353 1.66-6.82 SR0004%2006.01.06-39489 -13079 2.06-3.02 TA0004%2006.12.18-67949 -11445 5.55-5.93 ER0004%2009.04.20-1727 -27

13、72 0.62 DMACS_V2测试总结测试总结绝大多数品种,改进后效果都非常显著。以铜为例,净利润提高了29138元,最大回撤则大幅下降了33707元。前面我们采用的是固定400点的追踪止损,但对于不同品种或者同一品种的不同历史时段来说,采用统一的追踪止损标准,显然是不太合理的。因此,我们决定采用当时价格的一定比例来进行追踪止损。为简单设计,我们就以开仓后的盈利峰值价的一定比例作为止损价格。具体追踪止损的比例,可以进行一定的参数优化 DMACS_V3参数部分修改为百分比:Numeric TrailingStop(100);追踪止损的相应部分改为:If(Low = LowerAfterEntr

14、y * (1 + TrailingStop/1000)MyPrice = LowerAfterEntry * (1 + TrailingStop/1000); DMACS_V3主要交易品种测试结果主要交易品种测试结果品种品种测试佣金测试佣金测试时间段测试时间段净利润净利润最大回撤最大回撤净利润净利润/最大回撤最大回撤Cu0004%1998.07.30-530855-105099 4.05-5.05 ZN0004%2007.03.26-139032-25499 3.66-5.45 RU0004%1998.11.05-298379-49184 5.23-6.06 RB0004%2009.03.27

15、-16863 -8362 1.76-2.01 A90004%1998.12.10-29034 -9436 2.25-3.07 M90004%2000.07.17-18542 -14856 1.26-1.25 Y90004%2006.01.09-27099 -39836 0.04-0.68 L90004%2007.07.31-30384 -15256 1.92-1.99 CF0004%2004.06.01-103724-24027 1.66-4.31 SR0004%2006.01.06-36902 -18547 2.06-1.99 TA0004%2006.12.18-62602 -11581 5

16、.55-5.41 ER0004%2009.04.20-1597 -2911 0.62-0.55 DMACS_V3测试总结测试总结测试结果发现,在不优化参数的情况下,和V1版比还是有一定效果,但和V2版比差别不大。仔细分析原因,我们会发现,追踪止损的回落百分比参数的设置对结果影响很大。百分比参数设置得大,则盈利回吐比例也大,但大的波段基本能捕捉到。百分比参数设置得小,则盈利大部分能拿住,但一波大的行情,有可能中途就出场了。 进一步的策略改进进一步的策略改进进一步的分析,我们还可以发现一些交易进场后不久就有一定的盈利,但最后却以亏损收场; 而赚钱的单,往往进场后,就马上开始盈利; 新的出场策略新的

17、出场策略基于这种思路,我们完全可以在进场后,设定一个较紧的初始止损,一旦行情朝不利的方向变动,我们即止损出场,等待下次入场机会;如果止损后,行情又恢复原有趋势,我们可制定相应的再入场规则,以免错失大的波段行情;而一旦单子开始盈利,达到一定比例,我们立即将止损位调整到保本的位置;如行情继续朝有利于我们的方向发展,通过追踪止赢策略,将止损价不断上移(或下移)。 出场部分设计出场部分设计我们使用三种类型的止损设置:进场后设置初始止损;有一定盈利后设置保本止损;盈利增大后使用追踪止盈;为此,设置三个止损参数: Numeric InitialStop(20); / 初始止损(千分之N)Numeric B

18、reakEvenStop(30); / 保本止损(千分之N)Numeric TrailingStop(50); / 追踪止损(千分之N)三种止损的代码可以放在一起处理,取最有利的价格作为止损(赢)价。 为了实现追踪止赢,我们有必要记录进场后,赢利最高时的价格(赢利峰值价);设置两个序列变量,分别保存多头赢利峰值价和空头赢利峰值价:NumericSeries HigherAfterEntry;/ 多头盈利峰值价NumericSeries LowerAfterEntry; / 空头盈利峰值价传递和比较赢利峰值价If(BarsSinceEntry = 1)HigherAfterEntry = Max

19、(HigherAfterEntry1,High1);LowerAfterEntry = Min(LowerAfterEntry1,Low1); ElseHigherAfterEntry = HigherAfterEntry1;LowerAfterEntry = LowerAfterEntry1; 多头止损部分的代码多头止损部分的代码/ 初始止损StopLine = EntryPrice * (1-InitialStop/1000);/ 达到保本止损条件,将止损位上移到保本的价位If (HigherAfterEntry = EntryPrice * (1+BreakEvenStop/1000)S

20、topLine = EntryPrice;/ 追踪止损的价位超过保本止损价,止损价随盈利峰值价的上升同步提高If (StopLine HigherAfterEntry*(1-TrailingStop/1000)StopLine = HigherAfterEntry*(1-TrailingStop/1000);Commentary(止损价:+Text(StopLine);/ 止损触发If(Low = StopLine)MyPrice = StopLine;If(Open MyPrice) MyPrice = Open;Sell(Lots,MyPrice);bLongStoped = True;/

21、 止损后设置标志Commentary(Long Position Stoped at +text(MyPrice); 重新进场规则重新进场规则首先判断大趋势有没有改变?趋势没变,何时再进场?行情再创新高(低)时,再次进场;是否创新高(低),跟出场前赢利峰值价比较。 如何判断大趋势有没有改变?根据均线交叉情况;如果当前K线均线未交叉,则趋势取决于上一次均线交叉的方向;代码如下:if ( condBuy = false and condSell = false )condBuy = condBuy1;condSell = condSell1; 如何区分初次入场和再次入场?增加两个序列变量分别记录多

22、头止损情况和空头止损情况,进场时根据这两个值来判断是初次进场,还是再次进场,进场后重置这两个值。BoolSeries bLongStoped(false); / 多头止损情况BoolSeries bShortStoped(false);/ 空头止损情况止损触发时,进行记录 If(Low = StopLine)MyPrice = StopLine;If(Open = 1)HigherAfterEntry = Max(HigherAfterEntry1,High1);LowerAfterEntry = Min(LowerAfterEntry1,Low1);ElseHigherAfterEntry

23、= HigherAfterEntry1;LowerAfterEntry = LowerAfterEntry1; 初次进场代码初次进场代码初次进场做多初次进场做空重置标志重置标志 重新进场代码重新进场代码 止损处理的细节止损处理的细节无论初次进场还是再次进场,进场后都是把进场价作为开仓后的盈利最高价或最低价。两者的区别之处在于:初次进场,因为是开盘价进场,可以在开仓Bar实现止损;而再次入场,因为在历史K线中,无法确定入场点和最高价最低价在时间次序上的关系,从而无法实现在开仓BAR的止损。因此,必须在记录开仓后最高和最低后,加上Return指令,从而忽略掉后面的止损部分公式。 DMACS_V4主

24、要交易品种测试结果主要交易品种测试结果品种品种佣金佣金测试时间段测试时间段净利润净利润最大回撤最大回撤净利润净利润/最大回撤最大回撤Cu0004%1998.07.30-578005-49193 4.05-5.76-11.75 ZN0004%2007.03.26-118715-19238 3.66-4.64-6.17 RU0004%1998.11.05-278181-23831 5.23-6.36-11.67 RB0004%2009.03.27-21989 -4459 1.76-2.13-4.93 A90004%1998.12.10-27657 -7495 2.25-2.99-3.69 M900

25、04%2000.07.17-25721 -7517 1.26-1.24-3.42 Y90004%2006.01.09-71157 -21730 0.04-0.74-3.27 L90004%2007.07.31-23312 -18363 1.92-1.97-1.27 CF0004%2004.06.01-55066 -28690 1.66-6.82-1.92 SR0004%2006.01.06-35647 -8515 2.06-3.02-4.18 TA0004%2006.12.18-47150 -6714 5.55-5.93-7.02 ER0004%2009.04.20-1727 -2772 0.

26、62 测试结果测试结果(铜铜)用30分钟指数图测试,参数进行优化。手续费万分之四,每次操作1手。 测试结果测试结果(铜铜)用30分钟指数图测试,参数进行优化。手续费万分之四,每次操作1手。 测试结果测试结果(胶胶)用30分钟指数图测试,参数进行优化。手续费万分之四,每次操作1手。 测试结果测试结果(胶胶)用30分钟指数图测试,参数进行优化。手续费万分之四,每次操作1手。 测试结果测试结果(塑料塑料)用30分钟指数图测试,参数进行优化。手续费万分之四,每次操作1手。 测试结果测试结果(塑料塑料)用30分钟指数图测试,参数进行优化。手续费万分之四,每次操作1手。 测试结果测试结果(白糖白糖)用30

27、分钟指数图测试,参数进行优化。手续费万分之四,每次操作1手。 测试结果测试结果(白糖白糖)用30分钟指数图测试,参数进行优化。手续费万分之四,每次操作1手。 实例二:实例二:RangeBreak系统系统这是个日内交易系统,收盘一定平仓;RangeBreak基于昨日振幅和今日开盘价的关系。昨日振幅=昨日最高价-昨日最低价上轨 = 今日开盘价+N*昨日振幅下轨 = 今日开盘价-N*昨日振幅当价格突破上轨,买入开仓。当价格跌穿下轨,卖出开仓。RangeBreak指标指标ParamsNumeric PercentOfRange(0.3);VarsNumeric DayOpen;Numeric preD

28、ayRange;Numeric UpperBand;Numeric LowerBand;BeginDayOpen = OpenD(0);preDayRange = HighD(1) - LowD(1);UpperBand = DayOpen + preDayRange*PercentOfRange;LowerBand = DayOpen - preDayRange*PercentOfRange;PlotNumeric(UpperBand,UpperBand);PlotNumeric(LowerBand,LowerBand);PlotNumeric(MidLine,DayOpen);EndRan

29、geBreak指标指标RBS_V1(1)vParamsvNumeric PercentOfRange(0.3);vNumeric ExitOnCloseMins(14.59);vVarsvNumeric DayOpen;vNumeric preDayRange;vNumeric UpperBand;vNumeric LowerBand;vNumeric MyPrice;vBeginvDayOpen = OpenD(0);vpreDayRange = HighD(1) - LowD(1);vUpperBand = DayOpen + preDayRange*PercentOfRange;vLow

30、erBand = DayOpen - preDayRange*PercentOfRange;vIf(MarketPosition!=1 & High=UpperBand) vMyPrice = UpperBand;vIf(Open MyPrice) MyPrice = Open;vBuy(1,MyPrice);vReturn;vRBS_V1(2)vIf(MarketPosition!=-1 & Low=LowerBand)vvMyPrice = LowerBand;vIf(Open =ExitOnCloseMins/100)vvSell(1,Open);vBuyToCover(1,Open);

31、vvSetExitOnClose;vEnd必须考虑的特殊情况必须考虑的特殊情况v如果前一日涨停或跌停,则会出现范围很小。v解决方案:v设定一个范围的最小值,假定为当前价格的0.2%。代码中的改动代码中的改动vParamsv Numeric MinRange(0.2);vVarsv NumericSeries DayOpen;v Numeric preDayHigh;v Numeric preDayLow; v NumericSeries preDayRange;vBeginv preDayHigh = HighD(1);v preDayLow = LowD(1);v If(Date!=Date

32、1)v v DayOpen = Open;v preDayRange = preDayHigh - preDayLow;v If(preDayRange Open*MinRange*0.01) v preDayRange = Open*MinRange*0.01;v Elsev v DayOpen = DayOpen1;v preDayRange = preDayRange1;v 增加止损增加止损v有可能通道会比较宽,难道非要等到反转才平仓?v考虑增加止损设置,有2种方案:v1、亏损固定点数。v2、亏损当前价格的百分比。v考虑到商品价格变化的差异,我们采取第二种方式。止损部分代码止损部分代码v

33、 先增加一个变量StopLine,用来保存止损位置。v下面是做多时的止损代码:vIf(MarketPosition=1)vvStopLine = AvgEntryPrice-DayOpen*StopLossSet*0.01;vIf(Low = StopLine)vvMyPrice = StopLine;vIf(Open = StopLine)vvMyPrice = StopLine;vIf(Open MyPrice) MyPrice = Open;vBuyToCover(Lots,MyPrice);vv入场时间的考虑入场时间的考虑v突破的时效性,发生在上午和下午意义是不同的。v不同的商品时效属

34、性不尽相同v为此我们增加最后交易时间参数,可供优化测试来确定最佳值。 实现代码实现代码v增加参数:vNumeric LastTradeMins(14.00);v开仓条件处增加一个时间条件。vIf(MarketPosition!=1 & High=UpperBand & Time LastTradeMins/100)vv/ 多头开仓vvIf(MarketPosition!=-1 & Low=LowerBand & Time 1)vvHigherAfterEntry = max(HigherAfterEntry1,High1);vLowerAfterEntry = min(LowerAfterEn

35、try1,Low1);vv跟踪止损的编码可配合前面的止损编码一起控制。vIf(HigherAfterEntry=AvgEntryPrice+DayOpen*TrailingStart*0.01)vvStopLine = HigherAfterEntry - DayOpen*TrailingStop*0.01;vElse / 止损vvStopLine = AvgEntryPrice-DayOpen*StopLossSet*0.01;vvvIf(Low = StopLine)vvMyPrice = StopLine;vIf(Open =UpperBand & High HigherAfterEnt

36、ry & Time MyPrice) MyPrice = Open;vBuy(1,MyPrice);vbLongStoped = False;vReturn;vv v/ 做空再次入场代码:vIf(bShortStoped & MarketPosition=0 & Low=LowerBand & Low LowerAfterEntry & Time LastTradeMins/100 & bInBoardRange=false)vvMyPrice = Min(LowerAfterEntry,LowerBand) - MinPoint;vIf(Open MyPrice) MyPrice = Ope

37、n;vSellShort(1,MyPrice);vbShortStoped = False;vReturn;v涨跌停的控制涨跌停的控制接近涨跌停板不应开仓。若有持仓,价格到达涨跌停板马上平仓。判断是否接近涨跌停判断是否接近涨跌停v我们新建一个布尔变量bInBoardRange,默认值设置为False。vbInBoardRange = v(Open Q_UpperLimit - DayOpen*StopLossSet*0.02);v在开仓条件中加入(bInBoardRange=false)涨跌停板平仓涨跌停板平仓v为了在价格达到涨跌停价马上平仓,我们需要在增加如下代码:v做多时:vIf(Open

38、 = Q_UpperLimit) Sell(1,Open);v做空时:vIf(Open = Q_LowerLimit) BuyToCover(Lots,Open);交易次数控制交易次数控制增加失败次数限制,防止单日亏损无限制扩大。增加二个变量记录失败的次数。NumericSeries LongFailureCnts;NumericSeries ShortFailureCnts;增加一个参数设置最大次数。Numeric FailureLimit(2);实现代码实现代码v在脚本开始部分增加序列变量值的向后传递处理。v在平仓时增加是否亏损的判断,如果亏损则将计数+1.If(PositionProfi

39、t 0 ) LongFailureCnts = LongFailureCnts + 1;v在开仓时增加次数限定。 LongFailureCnts FailureLimit 测试结果测试结果(股指股指)用1分钟指数图测试,参数未进行优化。手续费每手300元,每次操作1手。 测试结果测试结果(天胶天胶)用1分钟指数图测试,参数未进行优化。手续费万分之四,每次操作1手。 测试结果测试结果(铜铜)用1分钟指数图测试,参数未进行优化。手续费万分之四,每次操作1手。 测试结果测试结果(铜铜)参数优化后,收益曲线更好。谢谢大家!谢谢大家!u公司网站:u新浪微博: 0755-83410021u上海办事处:021-68366255u我的手机:1350168324372

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号