- 精华
- 0
- 在线时间
- 55 小时
- UID
- 117135
- 积分
- 41
- 帖子
- 17
- 阅读权限
- 10
- 注册时间
- 2013-3-20
- 最后登录
- 2013-4-13
- 精华
- 0
- UID
- 117135
- 积分
- 41
- 帖子
- 17
- 主题
- 4
- 阅读权限
- 10
- 注册时间
- 2013-3-20
- 最后登录
- 2013-4-13
|
发表于 2013-4-13 15:28:18
|显示全部楼层
量化投资首先需要交易模型,一个交易模型的好坏直接影响到投资业绩。很多量化投资者根本搞不清什么是好模型,坏模型。以为回测下来资金线漂亮的就是好模型,这大大错了。回测结果并不等于实盘结果。
模型首先分为真模型和假模型,真模型的回测结果和实盘是一致,最多是滑点的差异。假模型通过代码作弊,回测作弊获得漂亮的资金线。很多人认为只要在模型中没有未来函数就不会是假的了。这又大大错了,假模型的种类繁多,令人防不胜防。很多程序员并非故意也会做出假模型。下面将一一讲述假模型的种类。
第二. 未来数据
模型中如果使用了未来函数就是一个假模型,因为未来函数获得的未来数据在实盘中是不可能得到的。在金字塔和交易开拓者(TB)的模型中,程序员就是不用未来函数也可获得和未来函数一样的效果。我们来看下面一个简单的工作在5分钟K线下TB模型。-
- Params
- Numeric FastLength(5);
- Numeric SlowLength(20);
- Vars
- NumericSeries fast;
- NumericSeries slow;
- Begin
- fast = Average(Close,FastLength);
- slow = Average(Close,SlowLength);
-
- If(fast>slow && fast[1]<slow[1]) //金叉
- {
- Buy(1,Close);
- }
-
- If(fast<slow && fast[1]>slow[1]) //死叉
- {
- SellShort(1,Close);
- }
- End
复制代码 上面的TB模型工作在Tick模式下,也就是每来一个Tick将调用程序一次。程序中对当前K线数据的使用就构成对未来数据的使用。这样的模型回测结果要比实盘好,而且信号会闪烁。很多读者会问:为什么当前K线的数据就变成未来数据了?这是因为TB回测功能的缺陷,TB模型在实盘时工作在Tick模式下,但TB模型的回测是用分钟K线来回测的。
怎么把上面的假模型改成真模型呢?这里有两种风格,一种是程序员希望等到K线收盘后如果信号还保持着再下单。这样的话代码应该这样写:- Params
- Numeric FastLength(5);
- Numeric SlowLength(20);
- Vars
- NumericSeries fast;
- NumericSeries slow;
- Begin
- fast = Average(Close,FastLength);
- slow = Average(Close,SlowLength);
-
- If(fast[1]>slow[1] && fast[2]<slow[2]) //金叉
- {
- Buy(1,Open);
- }
-
- If(fast[1]<slow[1] && fast[2]>slow[2]) //死叉
- {
- SellShort(1,Open);
- }
- End
复制代码 还有一种风格就是信号一旦产生就下单,这样稍微复杂些,但也是可以实现的。- Params
- Numeric FastLength(5);
- Numeric SlowLength(20);
- Vars
- NumericSeries fast;
- NumericSeries slow;
- NumericSeries fastL;
- NumericSeries slowL;
- NumericSeries fastH;
- NumericSeries slowH;
- Begin
- fast = Average(Close,FastLength);
- slow = Average(Close,SlowLength);
- fastL = Average(Low,FastLength);
- slowL = Average(Low,SlowLength);
- fastH = Average(High,FastLength);
- slowH = Average(High,SlowLength);
-
- If(fastH>slowH && fast[1]<slow[1]) //金叉
- {
- Buy(1,High);
- }
-
- If(fastL<slowL && fast[1]>slow[1]) //死叉
- {
- SellShort(1,Low);
- }
- End
复制代码 上面的模型信号不会闪烁,也不会价格虚构。但缺点是回测结果会比实盘要差一些。 |
|