- 精华
- 0
- 在线时间
- 301 小时
- UID
- 168489
- 积分
- 87
- 帖子
- 55
- 阅读权限
- 30
- 注册时间
- 2013-6-3
- 最后登录
- 2024-3-19
- 精华
- 0
- UID
- 168489
- 积分
- 87
- 帖子
- 55
- 主题
- 6
- 阅读权限
- 30
- 注册时间
- 2013-6-3
- 最后登录
- 2024-3-19
|
发表于 2014-9-12 19:45:32
|显示全部楼层
本帖最后由 zyqh160000897 于 2014-10-2 10:42 编辑
关于信号闪烁的问题
信号闪烁问题的出现,是由于引用函数的不确定性引起的。因为在当前K线没有走完的时候,你引用了收盘价、均价等等这些函数;而这些函数还没有最后确定,盘中由于价格的波动,刚刚符合了条件发出了交易信号,一会价格变化了,又变成不符合条件了。所以刚出现的信号消失了。这种信号闪烁反复的问题,对初涉自动化交易程序编写的人会产生极大的困惑。很多模型在测试时表现很好,真正拿到实盘就大跌眼镜,就是因为信号反复引起的。对于引用的价格,一般有下面几种:开盘价、最高价、最低价、均价、最新价和收盘价。这些常见的被引用的价格,一般有如下特性:
1、开盘价:具有唯一性,最稳定。引用该价格信号没有变动。
2、最高最低价:具有正向稳定,反向不稳定的特性。正向引用价格没有变动,反向引用价格有变动。
3、均价:均价包括很多种均价,如一般平均,移动平均,加权平均,高低价平均,开收价平均等等,这些均价大都是用收盘价编写的,引用这些价格由于数据变化,不管是正向引用还是反向引用,都会引起闪烁不定。
4、收盘价和最新价。收盘价在K线走完以后具有唯一性,没有走完之前等同于最新价。这个价格变动的范围最大,引起信号反复的可能性最大。
知道了引起信号闪烁的原因,就容易找到解决的办法。一是把上面提到的可能引起价格变动的函数改成不会变动的函数,如均价改成开盘价、最高最低价;二是在k线走完以后才发出买卖信号,使正在变动的函数变成已经完成的函数,如收盘价改成上一K线的收盘价,均价改成上一根K线的均价等等。
关于参数优化的问题
看论坛上很多人提到“参数优化”就如同遇到了洪水猛兽一样,但是模型的编写似乎大概根本就离不开参数优化。其实“参数优化”本质上就是在完成数据统计的任务,而数据统计的结果可分为有规律的一类和无规律的一类。如果参数优化的结果是呈有规律的山丘形态分布,那么这个参数就有优化的必要,优化结果可信程度就高;如果参数优化的结果是呈跳点式、毫无规律的分布,这个参数优化的结果就不可信。
比如;一个均线交易系统测试结果的最大利润和均线的关系一定是成一条抛物线形态分布的,这个参数就有优化的必要,优化结果可信度就高。
再如:某个交易系统的交易频率过高,某人用每天最多交易三次来限制交易频率并且优化了参数。这个优化结果就很让人怀疑,因为这个优化结果成跳点式无规律分布,最终导致的结果就是漏掉行情。
一个有效的交易系统就是一张网,而不是一根钓鱼线;这张网要确保不会漏掉每一条够大的鱼。恕本人拙见:压根就不存在“参数过度优化”的问题,只存在”可优化的参数“和”不可优化的参数“的问题。
一个交易品种只要它的波动规律不发生根本性的改变,一个有效的交易模型就不会长久失效。
关于偷价的问题
TB交易系统回测的数据是静态的收盘价模式,只有开、收、高、低四个价格,没有动态tick的概念。这就导致了系统在静态测试时,那个策略在前就先触发那个策略,所以不同的平仓策略前后次序不同时,会导致测试结果不同。而实盘数据是动态的,数据纷至沓来,动态的数据先触发那个策略,系统就会发出对应的交易委托。所以实盘对程序的触发方式与静态的测试是有很大不同的。
都知道使用了未来函数会偷价,其实偷价有好多种情况。比如说固定金额止损就会偷价,因为在回测时数据是静态的,那种策略排在前面就最先触发那个程序;当遇到K线跳空时,并且跳空幅度大于定额止损的幅度时,回测数据就会按照跳空的当跟K线的最高价或者最低价计算。如果这个最高价和最低价距离开仓价格的幅度仍然大于定额止损的幅度时,回测结果就产生了偷价现象。而在实盘过程中平仓信号产生的位置在当根K线走过之后会发生偷价位移(相反止盈会亏价)。虽然可以通过程序上的编写来解决这个问题,但是不同策略前后顺序的不同仍然会导致更隐蔽的偷价现象,只有在动态的图表中才能察觉。
以30跳止损100跳止盈为例:
Vars
Numeric MyEntryPrice; // 开仓均价
Numeric MyExitPrice; // 平仓价格
Begin
...
//----------------定额止损止盈模块------------------
MyEntryPrice=AvgEntryPrice;
If(MarketPosition==1) // 有多仓的情况
{
If(High>=MyEntryPrice+100*MinMove*PriceScale) // 多单止赢条件表达式
{
MyExitPrice=MyEntryPrice+100*MinMove*PriceScale;
If(Open>=MyExitPrice) MyExitPrice=Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
Sell(0,MyExitPrice);
...
End
总而言之,在静态的数据回测中,由于程序前后触发次序的不同,会产生多种偷价现象,这些偷价现象会对测试结果产生程度不同的影响,不过这些偷价现象比引用了未来函数对测试结果的影响要小得多。
信号闪烁的阶段很容易就能通过,而偷价现象却很难完全通过;除了程序编写的原因之外还有交易平台自身的原因,没有办法TB的回测功能目前只能做到这种程度。像有些出租公式的朋友说:本程序绝不存在未来函数、绝不偷价”。哈哈,未必;只要你通过回测报告的点状图找出那些可疑的交易,在对照K线图逐笔查看,很容易就能发现偷价的问题。
关于模型回测时间长短的问题
有人说模型对历史数据的回测,一般波段模型不少于5年,日内模型不少于一年半。我觉得不能简单的用时间的长短来衡量;回测的交易品种至少要经历一轮大牛市和一轮大熊市。这样的回测数据应该更有意义。像铁矿石、焦煤、玻璃、最短的也上市一年多了,基本上都是单边下跌的状态,数据回测的结果显然缺少牛市的特征。
|
-
总评分: 威望 + 1
查看全部评分
|