第 12 章 趋势交易策略----SPL量化编程课
本文介绍了一种趋势交易策略,通过识别股价波峰波谷特征进行买卖决策。策略定义了波谷(低于前后M天的股价)和波峰(高于前后M天的股价)两个关键指标。买入条件为:最近波谷低于N天股价的5分位值,且当日股价超过波峰前股价。卖出条件为:股价跌破最近波谷或收益率超过50%。文中给出了指标函数的实现逻辑(返回1/-1/0分别表示买入/卖出/观望信号),并提供了策略回测框架,包括数据加载、信号生成、买卖执行及止盈
趋势就是市场运动的方向,在通常的情况下,市场不会朝某一个方向直来直去,市场运动的特征表现为震荡前行,酷似一系列前赴后继的波浪,具有明显的峰和谷。所谓趋势就是这些波峰和波谷依次上升或下降的方向。股价在上涨或下跌时通常会形成趋势,如果能抓住这些趋势,会带来不错的收益,本章就介绍一种常见的趋势交易策略。
在介绍策略之前先定义两个名词:
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 查看回测结果
更多推荐
所有评论(0)