如题,在判断开仓条件时,如使用High > BollingerUp类似表述,是否存在未来函数?单个bar的high在回测时,开盘即是知道的,是否应该根据上一个Bar的high[1]来作为判断语句?
这是TB植入的一个高级AI么,回答得太牛了
我就是个小白,初阶入门水平,也就是跟着刘老师的去年的量化零基础课程开始正式接触、跟着学习量化,差不多满打满算1年时间还不到吧,自己是个啥段位,我自己心里最清楚了。
很生动
HIGH肯定是未来函数的,但不影响策略,核心是购买价格。如果以HIGH大于上轨作为信号,那么买价就必须是HIGH,而不能是open或者close,不然就偷价了。 实盘时,每个bar的走完前,HIGH和low都是动态变化的,不影响。
买价怎么会是high呢,不是应该是上轨吗,突破上轨做多?
(1)HIGH肯定是未来函数的
这句话用了【肯定】2个字,说明了这位同学,对于TB的机制没有深入思考研究,策略代码运行时有2种状态:
(1-1)历史回测状态:回测状态下,执行OnBar、OnBarClose这2个事件域的代码时,TB机制的前提条件就是默认了整根Bar已经完全走完的那一刻。如果不承认这一点,那么你说High、Low肯定是未来函数,我觉得似乎也有一些道理。反之,如果你承认了TB的回测机制,换句话说就是在回测的时候,OnBar、OnBarClose这两个事件域的执行时间点,就是发生在整个Bar走完的那一刻,并且回测的时候只执行1次。那么我就要请问同学,既然整根Bar已经走完了,何来【未来】一说?当然我在前一个回答你的问题的时候,也谈了一下【OnBarOpen】事件域,如果回测的时候,调用High、Low,大概率是未来数据,即使我内心想说就是未来数据,我也不敢像你这样,说话那么肯定、那么绝对、那么武断,我保留余地地说,大概率是未来数据。
(1-2)实盘状态:
实盘状态下,执行OnBar、OnBarClose这2个事件域与回测时的执行机制就不一样了,简单来说Bar没有走完之前,每个Tick都会触发执行OnBar1次,整根Bar走完后,下根Bar出现后,在下根Bar的OnBarOpen执行前,执行这根Bar的OnBarClose,且执行1次。之所以那么啰嗦,是因为你的逻辑在很多细节上的认知都是错误的。
话题拉回来继续:
实盘中OnBar事件域会在每个tick触发时执行1次,即使这根Bar没有走完,调用High()、Low()取到的也是最新状态下的最高价和最低价,但是随着行情变化每个Tick调用High、Low的值可能会发生变化。而你的【肯定是未来数据】的说法,说明你已经把回测和实盘的不同机制,张冠李戴了,你认为实盘中OnBar能够像历史回测那样,在OnBar中直接拿到整根Bar走完后的未来的最高价、最低价。这种思维明显是错误的,既不符合客观规律,也不是TB在实盘时的机制。只能说,你的对TB一些核心、基础、重要的机制,一知半解,张冠李戴。
(2)但不影响策略
既然你都认为High、Low【肯定】是未来数据了,而且你的交易决策又是和High、Low息息相关的。先说观点,这种思维方式首先是错误的,甚至会误导一大批新人。换句话说,你在告诉所有人,我有个未卜先知的算命先生,提前知道未来数据,很准,我的交易决策就是依据这个未来数据做出的,大家别怕,相信我,不影响策略的有效性,量化就是这个样子的,有时候一定会用到未来数据的,你瞧High、Low不就是吗?
我只能说,这种思维方式,太可怕了,他的可怕的之处在于传播性的误导。
(3)核心是购买价格。
当我看到这里,我在想,你前面的表述是不是表述不准确,无法表达出内心真实的一些核心、本质的认知输出,当然你也可以说是我不懂你,抠字眼啥的。因为,我看见你提到【核心】2字,感觉这下你在往核心、深入的地方阐述。
(3)如果以HIGH大于上轨作为信号,那么买价就必须是HIGH,
但是,看到这里,突然感觉又回到了青铜的味道。
先看一下你第一次发帖的原话:【如使用High > BollingerUp类似表述,是否存在未来函数?】
你第一次的原话仅仅描述了,你的交易条件,但是并没有阐述你的执行交易的方法。换句话说,你并没有阐述清楚你完整的策略逻辑的想法,同时内心潜意识已经觉得存在未来函数。但是毕竟你的表述不完整,我也不能随意猜测。
那么这次为什么说一下回到了青铜的感觉呢?因为这次你补充了你的错误的交易方法,用代码描述如下:
OnBar(ArrayRef<Integer> indexs){
If(High > BollingerUp){ //你的交易条件
//Buy(1, High); //你的交易执行,这个是错误的
Buy(1, Max(Open + 委托偏移跳数, BollingerUp + 委托偏移跳数)); //建议的交易执行
}
}
关键是,这里你还用了【必须是High】,这种充满自信、绝对化的用语。先不说这点,就说实盘状态下,每个tick的High可能会不断抬高,意思就是说实盘中High是会发生变化,所以这种写法会造成回测报告的绩效与实盘绩效不一致。
(4)而不能是open或者close,不然就偷价了。
【偷价】这个事情,先不展开举例,我就简单说一点,我对于【偷价】的判断原则、标准:当你想要使用某根Bar的价格数据的时候,你需要从时间、空间2个维度,去思考,在这个时机点上,使用这个价格:是否合理?是否公平?如果不合理,不公平,那么在我的认知判断里面就是发生【偷价】了。
但是我相信,不管是刘老师也好、还是王老师也好,没有哪一位老师教过你,突破型策略的Buy函数的买入价格里面,使用Close吧?至于Open的使用你可能把【突破型策略】与【收盘确认型策略】再次张冠李戴了,因为在【收盘确认型】的策略里面,交易条件中往往使用前1根已经走完确认的历史Bar的数据,如果这个数据一旦满足开仓条件的话,就在新Bar开盘的时候立即开仓买入了,所以会出现Buy(1, Open)的写法。
你可能还会问,【突破型策略】的建议写法中,为什么要用Max(Open + 委托偏移跳数, BollingerUp + 委托偏移跳数),里面出现了Open,这是一种特殊情况下突破开仓,发生在新Bar跳空高开突破的时候,一般连续报价,没有跳空高开的突破,大概率使用的是【BollingerUp + 委托偏移跳数】布林上轨+委托偏移去报价买入的。所以用了Max()函数让程序自动动态选择使用哪种报价。
(5)实盘时,每个bar的走完前,HIGH和low都是动态变化的,不影响。
从这句话来看,你似乎也知道一些TB实盘的机制,所以你的问题就是,对于机制的一知半解,张冠李戴。性格上又太自信。所以我上次建议你了,提问的时候,重点放在描述自己的策略需求是什么?要讲清楚描述客观内容,讲不清楚放代码也行。另外说说自己感到困惑的地方,想不通顺的地方又是什么?不要先入为主事先已经加入太多自己的主观臆断的结论,还是错误的,但是你也不讲是依据什么客观数据、怎么推导出来的错误结论。然后自己还会去拼凑、寻找各种不同环境下的一些表面现象,进一步强化支持自己的错误认知,相当于先下结论,然后尽量搜集各种支持你观点的证据,但是这些证据你自己也没有经过仔细分析、筛选,只要看见某些表观现象能支持就可为我所用。
【问1】:直接使用HIGH、LOW是否会有未来函数?
【答1】:你在【OnBarOpen】事件域中使用【High】【Low】大概率是用了未来数据,因为回测的时候,除了【光头阴线】【光脚阳线】【一字线】这些小概率的K线的【最高价】【最低价】会出现在【OnBarOpen】时刻。所以你在【OnBar】和【OnBarClose】事件域中使用【High】【Low】,回测的时候,就不会引用到未来数据。
【问2】:在判断开仓条件时,如使用High > BollingerUp类似表述,是否存在未来函数?
【答2】:同【答1】,在【OnBarOpen】中【使用High > BollingerUp判断条件】,会存在引用了未来数据的问题,在【OnBar】和【OnBarClose】中【使用High > BollingerUp判断条件】,就不存在引用了未来数据的问题。
【问3】:单个bar的high在回测时,开盘即是知道的
【答3】:首先单根Bar在开盘的时候,确切的说是不可能知道最终的High值,即使【光头阴线】也是最终走完才确认【最高价发生在Open时刻】。所以你所谓的【单个bar的high在回测时,开盘即是知道的】的描述,本身就是一种思维上的有意在使用未来数据,而不是【High】【Low】函数自身是否具有未来属性的问题。
【问4】:是否应该根据上一个Bar的high[1]来作为判断语句?
【答4】:你的很多前提条件,本身就有很多逻辑上的问题,有些涉及【偷价】、有些涉及【信号闪烁】。所以我觉得你提问的方式,应该改一改。客观描述清楚策略需求到底是什么?是【突破后立即入场】?还是【上根Bar走完确认后才入场】?以及入场条件、入场价格又是什么?总之,重点是客观描述清楚自己的需求,而不是潜意识怀疑【Low】【High】是否有【未来属性】。
这个可以,把onbaropen也单独拉出来说明了
确实在历史bar里,使用除了open以外的bar数据都是未来数据的行为。
现阶段没有强制优化的机制,只能在自行开发的时候主动避免
High > BollingerUp没问题,High < BollingerUp 不行
Low < BollingerDown 没问题,Low > BollingerDown 不行
close,openint怎么用都不行
vol<常量,会消失。vol>常量,难以判断满足条件时间的价格。
open,怎么用都行
回测模式下,开盘是不知道最高价的
两种解决方式
1.使用昨日最高比较
2.使用跨周期,在小级别判断,交易信号落地到小级别
不对吧,历史数据的k线,是完整的,也就是说,有开盘价也有最高价。
建议去看视频教程,所谓的单向价high,low是可以用来比较的,但有各种需要注意。
历史k线是以收盘状态跑程序的。你这个开盘是什么意思?