系统交易论坛 - 开拓者期货自动交易平台's Archiver

oliverzrl 发表于 2010-7-11 09:04

请教眼球套利交易法可否在TB中实现

今天在上海中期期货程序化交易组组长的博客里看到这个策略,感觉有一定的可行性尝试编程测试时出现了一个问题,就是如何用TB筛选出当天涨幅最大和跌幅最大的主力合约
本门五大入门功夫之二:眼球套利交易法全攻略

        现在,距离下班还有半个小时的时间。既然群友们对眼球套利交易法表现出了极大的浓厚兴趣,那么,我也觉得的确需要对它进行一下梳理和总结。
        眼球套利交易法,其实并没有必要非要编写成为一个自动买卖的程序化交易模型。因为它实在是太简单了,简单的出奇,简单的令人难以致信。然而,它的简单性并不影响它的有效性和实用性,如下图所示,这是10万元本金,在最近三年内完全使用眼球交易法的盈利金额资金曲线图(隔夜仓重为50%)。


   下面,我们来看一下眼球套利法的多空、买卖规则。
   每天下午收盘前,建立套利对冲头寸,具体做法是:做多当日涨幅最大的品种、做空当日跌幅最大的品种,并且按照等价值的原则建立头寸,不考虑因保证金收取比例差异而带来的实际动用保证金不同的因素。
        次日开盘,如果获得暴利,什么是暴利?自己定义。我的定义是价差获利1%,即总体所动用保证金获得5%的收益率。一俟获得暴利,开盘就平!如果没有获得暴利,那么可以持有至暴利,或直接持有至收盘前再平。
        上图中的三条曲线,分别代表了开盘就平、收盘才平、暴利就平的收益情况,可以看出,如果偷懒,可以直接选择开盘就平,效果就不错。这套方法还有一个重大的意义,盘中不占用你的保证金,只是赌隔夜而已。因为是完全对冲的套利头寸,所以我觉得保证金动用的比例完全可以放大到50%以上的任意一个水平。
        你不必过于计较,眼球套利的原理是什么?如果你愿意听,我可以告诉你,那就是买强抛弱、强者恒强、弱者恒弱。如果你担心产生强弱的意外转换,那么在实际执行过程中,我觉得可以有一些变通的处理。比如:你做多涨幅排行榜的前三名、做空跌幅排行榜的后三名。这样操作,你的资金曲线可能会更加平滑。此外,操作上有一个强弱判断的细节标准。我并没有将这一点纳入绩效结果的评估,但我觉得可能是有效的。这个标准就是,某些低波动性的品种,一旦进入涨跌幅排行榜的时候,要小心,可能是一种假象。比如今天普遍大涨,结果玉米微跌0.5%,我们认为玉米最弱,其实可能玉米每天都这样。所以,即便明天市场反转,普遍大跌,结果玉米仍然是微跌,这样我们就无法起到套利对冲的作用。这可能是眼球套利交易法的唯一风险点所在,慎之、慎之。

oliverzrl 发表于 2010-7-11 09:11

曲线图大家搜索期市截拳道,到博客利就能看到.利润150%资金回撤比较小,最重要的是不占用日内交易保证金

rypan 发表于 2010-7-28 16:57

用TB估计难。

如果有全品种历史数据的话,用其它语言写个程序,比较简单的。

speed_fj 发表于 2010-7-28 19:15

这个策略我实际用过 要效果满意 还要加很多过滤条件

像最近的行情 你没有合适品种开空仓 全开多仓 无法对冲

rypan 发表于 2010-7-28 19:54

[quote]这个策略我实际用过 要效果满意 还要加很多过滤条件

像最近的行情 你没有合适品种开空仓 全开多仓 无法对冲
[size=2][color=#999999]speed_fj 发表于 2010-7-28 19:15[/color] [url=http://www.tradeblazer.net/forum/redirect.php?goto=findpost&pid=52588&ptid=8834][img]http://www.tradeblazer.net/forum/images/common/back.gif[/img][/url][/size][/quote]

程序化交易不应该加入认为判断吧

speed_fj 发表于 2010-7-28 20:56

我的意思是 我没写程序
因为TB不知道如何一个程序控制多个品种

我是个人判断交易作个实验 得出的经验

rypan 发表于 2010-8-7 16:21

实践才能出真知。我就觉得这个方法不太靠谱。测试的结果是亏钱的。

另外TB的多品种测试可真是累人啊。

rypan 发表于 2010-8-7 16:22

[list]
Vars
        String LogFile("d:\\Eyes.csv");
        String LogLine("");
        Numeric R0;
        Numeric R1;
        Numeric R2;
        Numeric R3;
        Numeric R4;
        Numeric R5;
        Numeric R6;
        Numeric R7;
        Numeric R8;
        Numeric R9;
        Numeric R10;
        Numeric R11;
        Numeric R12;
        Numeric R13;
        Numeric R14;
        Numeric R15;
        Numeric R16;
        Numeric R17;
        NumericSeries Close0;
        NumericSeries Close1;
        NumericSeries Close2;
        NumericSeries Close3;
        NumericSeries Close4;
        NumericSeries Close5;
        NumericSeries Close6;
        NumericSeries Close7;
        NumericSeries Close8;
        NumericSeries Close9;
        NumericSeries Close10;
        NumericSeries Close11;
        NumericSeries Close12;
        NumericSeries Close13;
        NumericSeries Close14;
        NumericSeries Close15;
        NumericSeries Close16;
        NumericSeries Close17;
        Numeric MaxUp;
        Numeric MaxDown;
        Numeric MaxUpInd(0);
        Numeric MaxDownInd(0);
        Numeric UpNext;
        Numeric DownNext;
Begin
        Close0 = data0.Close;
        Close1 = data1.Close;
        Close2 = data2.Close;
        Close3 = data3.Close;
        Close4 = data4.Close;
        Close5 = data5.Close;
        Close6 = data6.Close;
        Close7 = data7.Close;
        Close8 = data8.Close;
        Close9 = data9.Close;
        Close10 = data10.Close;
        Close11 = data11.Close;
        Close12 = data12.Close;
        Close13 = data13.Close;
        Close14 = data14.Close;
        Close15 = data15.Close;
        Close16 = data16.Close;
        Close17 = data17.Close;
        R0 = (data0.Close - Close0[1]) / Close0[1];
        R1 = (data1.Close - Close1[1]) / Close1[1];
        R2 = (data2.Close - Close2[1]) / Close2[1];
        R3 = (data3.Close - Close3[1]) / Close3[1];
        R4 = (data4.Close - Close4[1]) / Close4[1];
        R5 = (data5.Close - Close5[1]) / Close5[1];
        R6 = (data6.Close - Close6[1]) / Close6[1];
        R7 = (data7.Close - Close7[1]) / Close7[1];
        R8 = (data8.Close - Close8[1]) / Close8[1];
        R9 = (data9.Close - Close9[1]) / Close9[1];
        R10 = (data10.Close - Close10[1]) / Close10[1];
        R11 = (data11.Close - Close11[1]) / Close11[1];
        R12 = (data12.Close - Close12[1]) / Close12[1];
        R13 = (data13.Close - Close13[1]) / Close13[1];
        R14 = (data14.Close - Close14[1]) / Close14[1];
        R15 = (data15.Close - Close15[1]) / Close15[1];
        R16 = (data16.Close - Close16[1]) / Close16[1];
        R17 = (data17.Close - Close17[1]) / Close17[1];
       
        //最大升幅
        MaxUpInd = 0;
        MaxUp = r0;
        if(r1 > MaxUp) {
                MaxUpInd = 1;
                MaxUp = r1;
        }
        if(r2 > MaxUp) {
                MaxUpInd = 2;
                MaxUp = r2;
        }
        if(r3 > MaxUp) {
                MaxUpInd = 3;
                MaxUp = r3;
        }
        if(r4 > MaxUp) {
                MaxUpInd = 4;
                MaxUp = r4;
        }
        if(r5 > MaxUp) {
                MaxUpInd = 5;
                MaxUp = r5;
        }

        if(r6 > MaxUp) {
                MaxUpInd = 6;
                MaxUp = r6;
        }

        if(r7 > MaxUp) {
                MaxUpInd = 7;
                MaxUp = r7;
        }

        if(r8 > MaxUp) {
                MaxUpInd = 8;
                MaxUp = r8;
        }

        if(r9 > MaxUp) {
                MaxUpInd = 9;
                MaxUp = r9;
        }

        if(r10 > MaxUp) {
                MaxUpInd = 10;
                MaxUp = r10;
        }

        if(r11 > MaxUp) {
                MaxUpInd = 11;
                MaxUp = r11;
        }

        if(r12 > MaxUp) {
                MaxUpInd = 12;
                MaxUp = r12;
        }

        if(r13 > MaxUp) {
                MaxUpInd = 13;
                MaxUp = r13;
        }

        if(r14 > MaxUp) {
                MaxUpInd = 14;
                MaxUp = r14;
        }

        if(r15 > MaxUp) {
                MaxUpInd = 15;
                MaxUp = r15;
        }

        if(r16 > MaxUp) {
                MaxUpInd = 16;
                MaxUp = r16;
        }

        if(r17 > MaxUp) {
                MaxUpInd = 17;
                MaxUp = r17;
        }

        //最大跌幅
        MaxDownInd = 0;
        MaxDown = r0;
        if(r1 < MaxDown) {
                MaxDownInd = 1;
                MaxDown = r1;
        }
        if(r2 < MaxDown) {
                MaxDownInd = 2;
                MaxDown = r2;
        }
        if(r3 < MaxDown) {
                MaxDownInd = 3;
                MaxDown = r3;
        }
        if(r4 < MaxDown) {
                MaxDownInd = 4;
                MaxDown = r4;
        }

        if(r6 < MaxDown) {
                MaxDownInd = 6;
                MaxDown = r6;
        }

        if(r7 < MaxDown) {
                MaxDownInd = 7;
                MaxDown = r7;
        }

        if(r8 < MaxDown) {
                MaxDownInd = 8;
                MaxDown = r8;
        }

        if(r9 < MaxDown) {
                MaxDownInd = 9;
                MaxDown = r9;
        }

        if(r10 < MaxDown) {
                MaxDownInd = 10;
                MaxDown = r10;
        }

        if(r11 < MaxDown) {
                MaxDownInd = 11;
                MaxDown = r11;
        }

        if(r12 < MaxDown) {
                MaxDownInd = 12;
                MaxDown = r12;
        }

        if(r13 < MaxDown) {
                MaxDownInd = 13;
                MaxDown = r13;
        }

        if(r14 < MaxDown) {
                MaxDownInd = 14;
                MaxDown = r14;
        }

        if(r15 < MaxDown) {
                MaxDownInd = 15;
                MaxDown = r15;
        }

        if(r16 < MaxDown) {
                MaxDownInd = 16;
                MaxDown = r16;
        }

        if(r17 < MaxDown) {
                MaxDownInd = 17;
                MaxDown = r17;
        }
        if(MaxUp > 0.02 || MaxDown < -0.02){
                return;
        }
       
        //最大升幅上买入
        if(MaxUpInd == 0){
                UpNext = (data0.NextOpen() - data0.Close) / data0.Close;
        }else If(MaxUpInd == 1){
                UpNext = (data1.NextOpen() - data1.Close) / data1.Close;
        }else If(MaxUpInd == 2){
                UpNext = (data2.NextOpen() - data2.Close) / data2.Close;
        }else If(MaxUpInd == 3){
                UpNext = (data3.NextOpen() - data3.Close) / data3.Close;
        }else If(MaxUpInd == 4){
                UpNext = (data4.NextOpen() - data4.Close) / data4.Close;
        }else If(MaxUpInd == 5){
                UpNext = (data5.NextOpen() - data5.Close) / data5.Close;
        }else If(MaxUpInd == 6){
                UpNext = (data6.NextOpen() - data6.Close) / data6.Close;
        }else If(MaxUpInd == 7){
                UpNext = (data7.NextOpen() - data7.Close) / data7.Close;
        }else If(MaxUpInd == 8){
                UpNext = (data8.NextOpen() - data8.Close) / data8.Close;
        }else If(MaxUpInd == 9){
                UpNext = (data9.NextOpen() - data9.Close) / data9.Close;
        }else If(MaxUpInd == 10){
                UpNext = (data10.NextOpen() - data10.Close) / data10.Close;
        }else If(MaxUpInd == 11){
                UpNext = (data11.NextOpen() - data11.Close) / data11.Close;
        }else If(MaxUpInd == 12){
                UpNext = (data12.NextOpen() - data12.Close) / data12.Close;
        }else If(MaxUpInd == 13){
                UpNext = (data13.NextOpen() - data13.Close) / data13.Close;
        }else If(MaxUpInd == 14){
                UpNext = (data14.NextOpen() - data14.Close) / data14.Close;
        }else If(MaxUpInd == 15){
                UpNext = (data15.NextOpen() - data15.Close) / data15.Close;
        }else If(MaxUpInd == 16){
                UpNext = (data16.NextOpen() - data16.Close) / data16.Close;
        }else If(MaxUpInd == 17){
                UpNext = (data17.NextOpen() - data17.Close) / data17.Close;
        }
        //双边手续费
        UpNext = UpNext - 2 * 0.00015;
       
        //最大跌幅上卖出
        if(MaxDownInd == 0){
                DownNext = (data0.Close - data0.NextOpen()) / data0.Close;
        }else If(MaxDownInd == 1){
                DownNext = (data1.Close - data1.NextOpen()) / data1.Close;
        }else If(MaxDownInd == 2){
                DownNext = (data2.Close - data2.NextOpen()) / data2.Close;
        }else If(MaxDownInd == 3){
                DownNext = (data3.Close - data3.NextOpen()) / data3.Close;
        }else If(MaxDownInd == 4){
                DownNext = (data4.Close - data4.NextOpen()) / data4.Close;
        }else If(MaxDownInd == 5){
                DownNext = (data5.Close - data5.NextOpen()) / data5.Close;
        }else If(MaxDownInd == 6){
                DownNext = (data6.Close - data6.NextOpen()) / data6.Close;
        }else If(MaxDownInd == 7){
                DownNext = (data7.Close - data7.NextOpen()) / data7.Close;
        }else If(MaxDownInd == 8){
                DownNext = (data8.Close - data8.NextOpen()) / data8.Close;
        }else If(MaxDownInd == 9){
                DownNext = (data9.Close - data9.NextOpen()) / data9.Close;
        }else If(MaxDownInd == 10){
                DownNext = (data10.Close - data10.NextOpen()) / data10.Close;
        }else If(MaxDownInd == 11){
                DownNext = (data11.Close - data11.NextOpen()) / data11.Close;
        }else If(MaxDownInd == 12){
                DownNext = (data12.Close - data12.NextOpen()) / data12.Close;
        }else If(MaxDownInd == 13){
                DownNext = (data13.Close - data13.NextOpen()) / data13.Close;
        }else If(MaxDownInd == 14){
                DownNext = (data14.Close - data14.NextOpen()) / data14.Close;
        }else If(MaxDownInd == 15){
                DownNext = (data15.Close - data15.NextOpen()) / data15.Close;
        }else If(MaxDownInd == 16){
                DownNext = (data16.Close - data16.NextOpen()) / data16.Close;
        }else If(MaxDownInd == 17){
                DownNext = (data17.Close - data17.NextOpen()) / data17.Close;
        }       
        DownNext = DownNext - 2 * 0.00015;       
       
       
        LogLine = LogLine + DateToString(Date()) + ",";
        LogLine = LogLine + text(MaxUp) + ",";
        LogLine = LogLine + text(UpNext) + ",,";
        LogLine = LogLine + text(MaxDown) + ",";
        LogLine = LogLine + text(DownNext) + ",,";
        LogLine = LogLine + text(UpNext + DownNext);
       
        FileAppend(LogFile, LogLine);
       
End
[/list]

01011012 发表于 2010-8-9 12:25

请教下怎么测试多品种?

rypan 发表于 2010-8-9 15:42

在某个超级图表上插入其它品种

efrog 发表于 2010-10-25 11:12

顶 rypan的努力!

stock1123 发表于 2011-2-18 21:12

期市截拳道是朱琳靖先生的新著吗???

selffinder 发表于 2011-7-12 09:48

[b]回复 [url=http://www.tradeblazer.net/forum/redirect.php?goto=findpost&pid=64375&ptid=8834]12#[/url] [i]stock1123[/i] [/b]是的,就是这部书让我认识了TB,虽然在排版上有些瑕疵但也是国内程序化交易方面的开山之作了。

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.