K线本身并没有什么价值,它只是一段数据的容器。从最底层的Tick数据流开始,根据时间周期划分成一段一段,每个周期内的第一个价格就是开盘价,最后一个价格就是收盘价,周期内最高的那个价格就是最高价,周期内最低的那个价格就是最低价,每个容器里面都储存着开高低收、成交量、时间等数据。这就是K线的由来,本篇我们将用上下影线战法,试着开发一个交易策略。
影线是K线中的虚线,在实体之上叫做上影线,在实体之下叫做下影线,它代表了当前最高价或最低价与收盘价或开盘价之间的差。之所以产生影线,是因为多空双方力量角逐造成的。交易就像是多头和空头两军对垒,多头力量完胜空头力量,就会形成一根光头光脚的大阳线,空头力量完胜多头力量,就会形成一根光头光脚的大阴线。如果多头向空头进攻后失败,就会形成上影线,如果空头向多头进攻后失败,就会形成下影线。 一般情况下,上影线越长,证明阻力就越大,多头即将由强势转变为弱势,未来价格可能会回调或者下跌。反之下影线越长,证明支撑力就越大,空头即将由强势转变为弱势,未来价格可能会反弹或者上涨。所以经典的K线理论告诉我们,在形形色色的K线图中,如果出现较长的上影线或下影线,就是市场即将转势的时候,这也是判断市场趋势转变的重要参考之一。
我们知道绝大部分K线都带有或多或少的上下影线,其中绝大多数对判断后市的意义不大,所以我们在设计策略的时候,不可能只要是带有上下影线的K线都作为一个信号,而是加入一定的过滤条件,降低开平仓频率,增加策略本身的胜率或盈亏比。那么我们可以判断上影线的长度,或者判断上影线与实体的比例来过滤信号,长上影线也被称为射击之星,相对来说长上影线比普通上影线更具有确定性,典型的例子是当市场经过长期较大涨幅之后,价格冲高但大幅回落,收出一根长上影阴线。
这种情况表明当前市场随时可能会出现上涨趋势的扭转,进入下降趋势。总的来讲,长上影线出现的概率较低,一旦出现上影线长于实体和下影线,就说明市场当时最强烈的上涨期望被彻底粉碎,后市转而下跌的概率较大。不过在使用长上影线判断行情的时候,需要有个前提,那就是市场之前已经经历过较大的涨幅,积累了较大的下跌能量。
反之,我们也可以判断下影响的长度,或者判断下影线与实体的比例来过滤信号,长下影线的出现表明多头力量异常强大,不仅阻止空单的进攻,还收复了失地。因此长下影线比普通下影线更具有确定性,典型的例子是当市场经过较大幅度的下跌之后,价格继续往下砸但大幅反弹,收出一根长下影阳线。
这种情况表明当前市场随时可能会出现下跌趋势的扭转,进入上涨趋势。总的来说,长下影线出现的概率较低,一旦出现下影线长于实体和上影线,就说明市场当时最强烈的上涨期望被彻底粉碎,后市转而上涨的概率较大。不过在使用长下影线判断行情的时候,也需要有个前提,那就是市场之前已经经历过较大的涨幅,积累了较大的上涨能量。
根据上面的K线理论,我们就可以试着开发一个长上下影线的策略。在开发策略之前,我们先弄清楚策略的逻辑,如下:
第一步:计算上影线长度UP
第二步:计算实体长度MIDDLE
第三步:计算下影线长度DOWN
多头开仓:下影线长度大于实体加上上影线的和的BN倍
空头开仓:上影线长度大于实体加上下影响的和的SN倍
多头平仓:上影线长度大于实体加上下影响的和的SN倍
空头平仓:下影线长度大于实体加上上影线的和的BN倍
注:BN和SN是系数,因为相对来说期货通常在上涨时涨的缓,下跌时跌的急,所以我们在做多或做空时分别给与不同的系数。
根据上面的策略逻辑,我们可以在优宽量化交易平台上实现交易策略。依次打开:youquant.com > 登录 > 控制中心 > 策略库 > 新建策略 > 点击右上角下拉菜单选择My语言,开始编写策略,注意看下面代码中的注释。
UP: HIGH - IFELSE(ISUP, CLOSE, OPEN); // 上影线
MIDDLE: IFELSE(ISUP, CLOSE, OPEN) - IFELSE(ISUP, OPEN, CLOSE); // K线实体
DOWN: IFELSE(ISUP, OPEN, CLOSE) - LOW; // 下影线
DOWN > (MIDDLE + UP) * BN, BK; // 多头开仓
UP > (MIDDLE + DOWN) * SN, SP; // 空头开仓
UP > (MIDDLE + DOWN) * SN, SK; // 多头平仓
DOWN > (MIDDLE + UP) * BN, BP; // 空头平仓
AUTOFILTER;
裸K简单直观,并且信息量丰富,是交易中最常见的基础数据和工具,长上下影线可以很好的衡量多头和空头的力量变化,并且其背后的原理也非常简单,这对初入门的量化新手非常友好。但是实战中的K线走势与理论并不会一模一样,也就是说我们在交易中追求的是一个大概率,而不是确定性。
(*backtest start: 2019-01-16 00:00:00 end: 2019-09-11 00:00:00 period: 15m exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}] args: [["ContractType","rb2001",126961]] *) UP: HIGH - IFELSE(ISUP, CLOSE, OPEN); // 上影线 MIDDLE: IFELSE(ISUP, CLOSE, OPEN) - IFELSE(ISUP, OPEN, CLOSE); // K线实体 DOWN: IFELSE(ISUP, OPEN, CLOSE) - LOW; // 下影线 DOWN > (MIDDLE + UP) * BN, BK; // 多头开仓 UP > (MIDDLE + DOWN) * SN, SP; // 空头开仓 UP > (MIDDLE + DOWN) * SN, SK; // 多头平仓 DOWN > (MIDDLE + UP) * BN, BP; // 空头平仓 AUTOFILTER;template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6