设为首页收藏本站

 找回密码
 注册
查看: 4642|回复: 4

慧眼识模型之二 -- 未来数据(转) [复制链接]

Rank: 1

精华
0
UID
117135
积分
41
帖子
17
主题
4
阅读权限
10
注册时间
2013-3-20
最后登录
2013-4-13
发表于 2013-4-13 15:28:18 |显示全部楼层
量化投资首先需要交易模型,一个交易模型的好坏直接影响到投资业绩。很多量化投资者根本搞不清什么是好模型,坏模型。以为回测下来资金线漂亮的就是好模型,这大大错了。回测结果并不等于实盘结果。

模型首先分为真模型和假模型,真模型的回测结果和实盘是一致,最多是滑点的差异。假模型通过代码作弊,回测作弊获得漂亮的资金线。很多人认为只要在模型中没有未来函数就不会是假的了。这又大大错了,假模型的种类繁多,令人防不胜防。很多程序员并非故意也会做出假模型。下面将一一讲述假模型的种类。

第二. 未来数据
模型中如果使用了未来函数就是一个假模型,因为未来函数获得的未来数据在实盘中是不可能得到的。在金字塔和交易开拓者(TB)的模型中,程序员就是不用未来函数也可获得和未来函数一样的效果。我们来看下面一个简单的工作在5分钟K线下TB模型。

  1. Params
  2. Numeric FastLength(5);
  3. Numeric SlowLength(20);
  4. Vars
  5. NumericSeries fast;
  6. NumericSeries slow;
  7. Begin
  8. fast = Average(Close,FastLength);
  9. slow = Average(Close,SlowLength);
  10.   
  11. If(fast>slow && fast[1]<slow[1]) //金叉
  12. {
  13.     Buy(1,Close);
  14. }

  15. If(fast<slow && fast[1]>slow[1]) //死叉
  16. {
  17.     SellShort(1,Close);
  18. }
  19. End
复制代码
上面的TB模型工作在Tick模式下,也就是每来一个Tick将调用程序一次。程序中对当前K线数据的使用就构成对未来数据的使用。这样的模型回测结果要比实盘好,而且信号会闪烁。很多读者会问:为什么当前K线的数据就变成未来数据了?这是因为TB回测功能的缺陷,TB模型在实盘时工作在Tick模式下,但TB模型的回测是用分钟K线来回测的。

怎么把上面的假模型改成真模型呢?这里有两种风格,一种是程序员希望等到K线收盘后如果信号还保持着再下单。这样的话代码应该这样写:
  1. Params
  2. Numeric FastLength(5);
  3. Numeric SlowLength(20);
  4. Vars
  5. NumericSeries fast;
  6. NumericSeries slow;
  7. Begin
  8. fast = Average(Close,FastLength);
  9. slow = Average(Close,SlowLength);
  10.   
  11. If(fast[1]>slow[1] && fast[2]<slow[2]) //金叉
  12. {
  13.     Buy(1,Open);
  14. }

  15. If(fast[1]<slow[1] && fast[2]>slow[2]) //死叉
  16. {
  17.     SellShort(1,Open);
  18. }
  19. End
复制代码
还有一种风格就是信号一旦产生就下单,这样稍微复杂些,但也是可以实现的。
  1. Params
  2. Numeric FastLength(5);
  3. Numeric SlowLength(20);
  4. Vars
  5. NumericSeries fast;
  6. NumericSeries slow;
  7. NumericSeries fastL;
  8. NumericSeries slowL;
  9. NumericSeries fastH;
  10. NumericSeries slowH;
  11. Begin
  12. fast = Average(Close,FastLength);
  13. slow = Average(Close,SlowLength);
  14. fastL = Average(Low,FastLength);
  15. slowL = Average(Low,SlowLength);
  16. fastH = Average(High,FastLength);
  17. slowH = Average(High,SlowLength);
  18.   
  19. If(fastH>slowH && fast[1]<slow[1]) //金叉
  20. {
  21.     Buy(1,High);
  22. }

  23. If(fastL<slowL && fast[1]>slow[1]) //死叉
  24. {
  25.     SellShort(1,Low);
  26. }
  27. End
复制代码
上面的模型信号不会闪烁,也不会价格虚构。但缺点是回测结果会比实盘要差一些。

Rank: 1

精华
0
UID
109946
积分
42
帖子
20
主题
7
阅读权限
10
注册时间
2012-4-11
最后登录
2013-6-28
发表于 2013-4-13 16:50:47 |显示全部楼层
不错,讲的比较清楚

使用道具 举报

Rank: 1

精华
0
UID
116953
积分
19
帖子
9
主题
0
阅读权限
10
注册时间
2013-3-16
最后登录
2013-4-14
发表于 2013-4-14 14:51:17 |显示全部楼层
fastL = Average(Low,FastLength);

slowL = Average(Low,SlowLength);

fastH = Average(High,FastLength);

slowH = Average(High,SlowLength);


请问楼主,后面加的这几行起什么作用的,刚学TB,看不懂,见笑了。

使用道具 举报

Rank: 2

精华
0
UID
117937
积分
100
帖子
30
主题
0
阅读权限
30
注册时间
2013-4-9
最后登录
2013-4-14
发表于 2013-4-14 23:26:27 |显示全部楼层
是啊,不懂

使用道具 举报

Rank: 1

精华
0
UID
213134
积分
12
帖子
9
主题
2
阅读权限
10
注册时间
2015-7-8
最后登录
2019-1-22
发表于 2019-1-2 13:23:27 |显示全部楼层
是不是也可以条件判断都用上一根bar,交易都用当根bar?

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-3-29 08:44

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部