程序化交易中策略的实现测试和优化Word文档格式.docx
《程序化交易中策略的实现测试和优化Word文档格式.docx》由会员分享,可在线阅读,更多相关《程序化交易中策略的实现测试和优化Word文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
及时性是指,程序化交易中能够及时快速的跟踪市场变化,并能够迅速捕捉有利的趋势或波段,快速下单;
准确性是指能够准确评价交易机会,克服主观情绪偏差,妥善运用套利思想;
分散化是指在控制风险的条件下,引入投资组合的理念,靠概率而不是单个股票取胜。
程序化交易的缺点是相对于它的优点而言的。
首先就是严谨有余,而灵活不足,交易策略设定运行后一般不提倡随意的更改。
另外,由于由于程序化交易每次的交易量很大,对市场的冲击很大,一旦系统崩溃或者错误,对金融市场可能造成毁灭性的打击,如1987年美国的股灾,程序化交易就和组合保险一起被列为最大元凶。
最后,由于程序化交易的研究要求有较高的金融知识和软件背景,人才培育和硬件设施都需要大量的投资,更适合机构投资者,客观上造成了对一般个体投资者的不公平。
1.1.3国内外发展现状
程序化交易起源于20世纪70年代的美国,很多的观念和技术源于数理金融和计算机及网络技术。
据统计,伦敦股票交易所超过50%的交易额来自程序化交易,而美国市场则高达80%以上(数据来源于恒生银行2012年年度报告)。
此外,香港期货交易所的恒生指数期货和新加坡交易所的日经指数期货均采用程序化交易。
在欧美发达国家,大部分养老基金和信托基金公司都使用程序化策略处理大额度的交易来降低冲击成本,几乎所有的投资经理都使用程序化交易系统来辅助交易与资产管理。
但是在国内,由于期货市场产品结构太过单一、交易制度不够灵活、市场流动性较差、风险管理机制不够完善等限制,程序化交易发展缓慢,直到2000年国内才有一家期货公司成立了将推广程序化交易作为战略重点的程序化交易研究小组。
近年来,随着股指期货等金融衍生品的推出,程序化交易的研究和应用受到越来越多投资者特别是机构投资者的重视。
但是总体而言,国内的程序化交易系统大多是复制国外的,和国内金融市场的实际现状有不少差异,和发达国家的程序化交易水平也有很大差距,程序化交易的研究和本地化在中国有着很大的发展空间。
1.2交易策略的概述
1.2.1交易策略的核心意义
如果说把服务器,网络带宽等基础设施看做程序化交易的躯壳的话,交易策略就是程序化交易的大脑和灵魂。
它是投资者投资思想、投资经验、投资理念的体现,它决定了何时进场、何时出场、如何管理资金、怎样控制风险,它的好坏直接关系到一个程序化交易系统的性能。
1.2.2交易策略的分类
交易策略的分类有以下多种方式:
一,根据持仓时间长短不同,策略分为:
长线策略(指能够)、中线策略和短线策略。
二,根据交易频率的不同,策略分为:
日内高频交易和低频交易。
三,根据根据所参考技术指标的不同,策略又可分为以下类型:
大势型策略,指为大盘设计的专用策略,通常不在个股的分析研判中使用。
趋势型策略,这类策略一般用到至少两条线,当两条或以上线交叉时,策略发出买卖信号。
均线型策略:
这类策略是通过不同算法得到的平均线技术指标,通过不同期限的均线穿越的情况来发出买卖信号。
路径型策略:
这类策略也称为阻力支撑型策略,在期货或股票的价格走势图上,常有所谓的阻力位和支撑位(如下图),也即价格会在前期高点或低点价格处反弹的倾向(只是倾向,并不一定)。
因此根据投资者是否相信支撑位和阻力位坚守不破,这类策略又可分为趋势跟踪策略和反趋势策略,采用趋势跟踪策略的投资者相信价格会突破阻力位或支撑位(也即在接近阻力位时会继续上涨,在接近支撑位时会继续下跌),他们会在阻力位被突破时买入做多,在支撑位被突破时卖出做空。
在市场短期突破支撑位时,他们卖出以退出多头交易,在市场短期突破阻力位时,他们买入以退出空头交易。
而采用反趋势交易策略的投资者们则相信价格不会突破阻力位或支撑位(也即在接近阻力位时会反弹,在接近支撑位时也会反弹),他们会在支撑位附近买入做多,在阻力位附近卖出做空,从而赚取之间的差价。
能量型策略:
这类策略采用能量指标作为市场行情判断的依据,铜材采用情绪指标、心理线、成交量变异率、威廉多空力度线等能量指标来判断市场上多空力量(即买卖力量)的对比,判断多空双方的情绪是高亢还是沮丧。
如果多方力量强于空方力量,此时价格有下跌趋势,应做空;
相反,如果空方力量强于多方力量,此时价格有上涨趋势,应做多。
成交量型策略:
这类策略是指通过对与成交量存在联系的技术指标的判断来判断市场行情是利于空方还是多方,从而判断是做多还是做空。
超卖超卖型策略:
这种策略使用的指标大多为判断市场处于超买超卖状态,如果市场处于超买状态(对股票、期货等的过度买入),则股价随时可能下跌,应该做空;
相反如果处于超卖状态(对股票、期货等的过度卖出),则股价随时可能上升,应该做多。
常用的技术指标有:
CCI(即顺势指标,是专门用来测量股价是否已经超出常态分布范围)、KDJ(即随机指标,是利用价格波动的真实波幅来反映价格走势的强弱和超买超卖现象,在价格尚未上升或者下降之前发出买卖信号)、RSI(即相对强弱指标,是通过特定时期内股价的变动情况计算市场买卖力量对比,来判断股票价格本质强弱,推测股票价格未来变动方向)、CMO(即ChandeMomentumOsciliator,钱德动量摆动指标,是由图莎尔•钱德发明的,与其他动量指标摆动指标如相对强弱指标(RSI)和随机指标(KDJ)不同,钱德动量指标在计算公式的分子中采用上涨日和下跌日的数据。
在第三章的论述中,我们将介绍一个以此指标为基础编写的超买超卖型策略)等。
在本文中,我们将以最后一种分类为主,特别讨论笔者编写的常用并且适合股指期货市场的趋势型、均线型、路径型和超卖超卖型四种策略。
并对每个策略所依据的原理、代码实现、测试结果、优化结果、模拟交易结果做详细的说明和解释。
1.2.3研究平台、语言和市场概述
在本文中,我们使用的研究平台是深圳开拓者科技有限公司开发的交易开拓者软件。
这是一款移植于国外的程序化交易软件,是目前国内市场占有率仅次于文华财经的软件,但是其函数库以及系统自带公式应用比文华财经更为强大,交易稳定性方面也更为稳定。
策略编写语言是交易开拓者自带的TB语言,而基本市场则选择流动性比较好的股指期货市场(但是并不局限于此,很多策略还适合于其他市场,将在第三章描述中详细介绍)。
2,不同类型交易策略的实现、测试和优化
2.1交易策略的设计流程
在下面几节每个策略的开发中,我们都使用下图所示的设计流程:
首先,介绍策略所参考的技术指标,其核心思想,开仓平仓,止盈止损等条件;
其次,介绍策略的代码实现;
再次,介绍策略在股指期货市场中历史数据中的测试结果,最后针对市场的具体行情进行参数的优化(可能还包括结构的优化),最后我们会进入模拟盘利用当前真实数据进行检验,根据是否达到预期效果进行模型的修改和完善。
2.2趋势型策略
2.2.1空中花园策略
核心思想:
这是一个日内策略,主要是利用当日开盘的第一根K线是收阳还是收阴来判断日内趋势可能的运动方向,在当日高开或者低开时最有效。
这是最快的一种入场方式,尽管有着很高的出错概率,但是我们通过条件的判断和止盈止损的加入,努力使错误的判断带来的损失最小化,而使正确的判断带来的盈利最大化。
做多条件:
1,当日开盘价>
=昨日收盘价*(1+K);
2,当前Bar的最高价>
当日第一个Bar的最高价。
如果1和2同时满足,判断当前有上涨趋势,在当前Bar做多。
式中,K为浮动比例参数,用户自己根据实际情况设定。
做空条件:
=昨日收盘价*(1-K);
2,当前Bar的最低价>
当日第一个Bar的最高价如果1和2同时满足,判断当前有下跌趋势,在当前Bar做空。
止盈条件:
持多仓时,如果最高价>
=平均入场价*(1+止盈点)卖出平仓
持空仓时,如果最低价<
=平均入场价*(1--止盈点)买入平仓
止损条件:
持多仓时,如果最低价<
=平均入场价*(1-止损点)卖出平仓
持空仓时,如果最高价>
=平均入场价*(1+止损点)买入平仓
代码实现:
//------------------------------------------------------------------------
//简称:
HangingGarden
//名称:
//类别:
公式应用
//类型:
用户应用
//输出:
Params
Numericlots
(1);
//每次买卖手术
NumericbeginTime(930);
//交易开始时间9:
30
NumericendTime(1500);
//交易结束时间15:
00
Numericfloatby
(1);
//大于或低于这一波动幅度时,判断为上涨或下跌
NumericstopLoss(10);
//止损点
NumerictakeProfit
(2);
//止盈点
Numericoffset
(1);
//滑点设置
Vars
BoolSeriesrising(False);
BoolSeriesfalling(False);
NumericSeriesfirstHigh(0);
NumericSeriesfirstLow(0);
NumericMyEntryPrice;
//入市价格
NumericMyExitPrice;
//出市价格
NumericMinPoint;
//止损时最小变动单位
Numerici_offset;
//交易时可接受的价格浮动范围
Begin
If(Date!
=Date[1]andCurrentBar>
=2){//当前bar为当日开盘的第一根bar
firstHigh=High;
firstLow=Low;
if(Open>
=CloseD
(1)*(1+floatby/100))rising=True;
//判断收阳
if(Open<
=CloseD
(1)*(1-floatby/100))falling=True;
//判断收阴
}Else{
rising=rising[1];
falling=falling[1];
firstHigh=firstHigh[1];
firstLow=firstLow[1];
}
If(Time>
0.0001*beginTimeAndTime<
endTime*0.0001AndCurrentBar>
=2){//是否在交易允许时间内
MyEntryPrice=AvgEntryPrice;
//平均入场价
i_offset=offset*MinMove*PriceScale;
MinPoint=MinMove*PriceScale;
if(MarketPosition==0){//当前未持仓时
If(rising==TrueandHigh>
firstHigh){//做多条件满足,做多
Buy(lots,Open+i_offset);
PlotNumeric("
Open"
Open);
Return;
}
If(falling==TrueandLow<
firstLow){//做空条件满足,做空
SellShort(lots,Open-i_offset);
Open2"
}
}
if(MarketPosition==1){//当前持多仓时
//止盈
if(High>
=(MyEntryPrice*(1+TakeProfit*0.01))){
MyExitPrice=MyEntryPrice*(1+TakeProfit*0.01);
sell(0,Max(MyExitPrice,Open));
//PlotBool("
sellshort"
True);
Return;
//止损
if(Low<
=(MyEntryPrice-Stoploss*MinPoint)){
MyExitPrice=MyEntryPrice-Stoploss*MinPoint;
Sell(0,Min(MyExitPrice,Open));
//PlotBool("
true);
//做空条件满足,平多仓,开空仓
firstLow){
SellShort(lots,Open);
}
if(MarketPosition==-1){//持空仓时
if(low<
=(MyEntryPrice*(1-TakeProfit*0.01))){
MyExitPrice=MyEntryPrice*(1-TakeProfit*0.01);
BuyToCover(0,Min(MyExitPrice,Open));
if(high>
=(MyEntryPrice*(1+Stoploss*MinPoint))){MyExitPrice=MyEntryPrice*(1+Stoploss*MinPoint);
BuyToCover(0,Max(MyExitPrice,Open));
//做多条件满足,平空仓,开多仓
firstHigh){
Buy(lots,AvgEntryPrice);
}
End
测试结果:
我们测试采用的是股指1小时线,采用的数据是近三年数据(因为中国股指期货2010年上市),手续费的设置为交易总金额的3%%(远高于实盘中手续费(1%%左右),可以抵消其他因素造成的偏差,保证结果的有效性),保证金率设置的是10%,参数为默认参数,测试结果的表格如下:
优化过程:
我们将参数分别进行优化,
(这里加上参数从多少到多少,步长为多少,给出最后最好的结果)
优化后的交易测试结果为:
模拟交易:
这里补充上从什么时候到什么时候,用的是什么商品,盈利有多少
总结:
这个策略还适合什么商品,有什么优势和不足
2.3均线型策略
2.3.1MACD_MSN策略
MACD(MovingAverageConvergenceandDivergence)在均线策略中是一种最常用的指标,它是一种运用短期(通常为12日)移动平均线与长期(通常为26日)移动平均线之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标。
其计算公式为:
n日EMA=2/(n+1)×
当天收盘指数+(n-1)/(n+1)×
昨天的n日EMA
DIF(12,26)=12日EMA-26日EMA
DEA(N)=最近N日的DIF之和/N
N日MACD=(DIFF-DEA)×
2
本策略中根据对两个不同周期的MACD的计算,并且通过短周期MACD和长周期MACD的穿越情况,判断是做多还是做空。
前一个bar:
短周期MACD<
长周期MACD而当前bar:
短周期MACD>
长周期MACD。
为了让利润充分增长,该策略未加入止盈。
持多仓时:
如果当日开盘价低于前一日开盘价一定幅度,卖出平仓。
MACD_MSN
Numericlots
(2);
Numericshortlength
(2);
//短周期
Numericlonglength(13);
//长周期
NumericTakeProfit
(2);
//多少个点数时止盈
NumericStopLoss(10);
//多少个点数时止损
NumericSeriesshortMACD;
NumericSerieslongMACD;
NumericshortMACD1;
NumericShortMACD2;
NumericlongMACD1;
NumericlongMACD2;
Boolbuycondition(False);
Boolsellcondition(False);
Numericp;
NumericmyentryPrice(0);
NumericmyexitPrice(0);
NumericMinPoint(0);
Begin
If(CurrentBar>
Max(26,longlength)){//前Max(26,longlength)个bar不执行
myentryPrice=Q_AvgPrice;
//平均入场价
p=MinMove*PriceScale;
//最小变动幅度
shortMACD=calMACD3(26,12,shortlength);
//计算短周期MACD
//PlotNumeric("
shortMACD"
shortMACD);
longMACD=calMACD3(26,12,longlength);
//计算长周期MACD
longMACD"
longMACD);
shortMACD1=shortMACD[0];
//当前bar短周期MACD
shortMACD2=shortMACD[1];
//前一个bar短周期MACD
longMACD1=longMACD[0];
//当前bar长周期MACD
//判断做多条件是否满足
If(shortMACD1>
longMACD1andshortMACD2<
longMACD2)
{
buycondition=True;
sellcondition=false;
//判断做空条件是否满足
If(shortMACD1<
sellcondition=True;
buycondition=false;
//如果当前持多仓,当日开盘价低于止损点,止损
If((Open<
OpenD(1