趋势就是市场运动的方向,在通常的情况下,市场不会朝某一个方向直来直去,市场运动的特征表现为震荡前行,酷似一系列前赴后继的波浪,具有明显的峰和谷。所谓趋势就是这些波峰和波谷依次上升或下降的方向。股价在上涨或下跌时通常会形成趋势,如果能抓住这些趋势,会带来不错的收益,本章就介绍一种常见的趋势交易策略。
在介绍策略之前先定义两个名词:

1.最近的波谷:股价低于之前和之后 M 天的股价。

2.波谷前的波峰:最近的波谷之前股价高于之前和之后 M 天的股价。

买入策略为:

1.最近的波谷低于最近 N 天股价的 5 分位(5分位是指将数据从小到大排序,然后五等分,取第1个分界值);

2.当天的股价高于波谷前的波峰;

同时满足上述两个条件,则下单买入,如下图:

..

卖出策略:

1.股价低于最近的波谷。

2.收益率超过 R。

满足上述两个条件中的任何一个,就全部卖出。

..

我们来编写趋势交易指标,当最近的波谷低于最近 M 天股价的 5 分位并且当天的股价高于波谷前的波峰时,指标返回1;当股价低于最近的波谷时指标返回-1,其余返回0。

定义指标参数:

A 序表,K线数据
y 指标返回列。1买入信号,-1卖出信号
n 252数字,买入策略中的时间周期,如
m 数字, 计算波谷的时间周期,如3
k k=5数字,买入策略中股价的分位数,缺省

在indicator.splx中编写指标函数:

A B
…… ……
45 func VPTR(A, $y, n, m, k=5)

=A.run( if( #>n, (

cp=收盘[-n+1:0], mc=cp.median(:k)(1),

vp=cp.pselect@z(#<=n-m && ~<~[-m:-1].min()&& ~<~[1:m].min() ) ,

pp=cp.pselect@z(#<=vp && ~>~[-m:-1].max()&& ~>~[1:m].max() ),

vc=cp(vp), pc=cp(pp),

${y}=if( vc<mc && 收盘>pc:1, 收盘<vc:-1; 0 )

)))

调用指标,加入平仓条件收益率超过R就强制卖出,R取0.5,编写策略代码:

A B
1 >call("init.splx")
2 2024 =date(A2,1,1)
3 =workday(B2,-300,HOLIDAY) =date(A2,12,31)
4 600690 =Load@C(A4, A3,B3)
5
6 =B4.derive(:Y)
7 =VPTR(A6, Y, 252, 3)
8
9 =Begin(A6)
10 =A9.select(日期>=B2)
11 for A10 =H=昨日.持仓
12 =卖出=if(昨日.Y==-1,SellOff( ~, H,收盘 )) | SellAll( ~, H, 0.5)
13 =if(昨日.Y==1 && H.len()<=0, 买入|=Buy( ~,100,收盘))
14 =Loop()
15 =Summary(A10) =Display(A15)

这里时间周期n取值较大,A3中要多读一些数据。

B12 中加入止盈平仓条件。

B15 查看回测结果

..

Logo

专业量化交易与投资者大本营

更多推荐