SPL 量化系列实践:趋势交易策略
股价在上涨时通常会形成趋势,如果能抓住这些趋势,通常会带来不错的收益,本文就介绍一种常见的趋势交易策略。
在介绍买入策略之前先定义一些名词:
1. 最近的波谷:股价低于之前和之后 N 天的股价。
2. 波谷前的波峰:最近的波谷之前股价高于之前和之后 N 天的股价。
买入策略:
1. 最近的波谷低于最近 M 天股价的 5 分位;
2. 当天的股价高于波谷前的波峰;
同时满足上述两个条件,买入信号 signal=1。
卖出策略:
1. 股价低于最近的波谷。
2. 收益率超过 R。
满足上述两个条件中的任何一个,卖出信号 signal=-1。
SPL 代码
A | B | C | |
1 | =file("daily/300750.csv").import@tc() | ||
2 | =A1.select(trade_date>=20200101&&trade_date<=20240506) | ||
3 | =A2.derive(if(#>1, close/ pre_close *factor[-1], close/pre_close):factor) | ||
4 | =hfq_fst=A3(1),A3.derive(round(factor/hfq_fst.factor*hfq_fst.close,2): hfq_close) | ||
5 | =A4.(hfq_close) | ||
6 | =windown=252 | ||
7 | =extrem_itv=3 | ||
8 | =inrate=0.5 | ||
9 | =to(windown+1,A4.len()) | ||
10 | =[] | ||
11 | for A9 | =A5.to(A11-windown+1,A11) | |
12 | =B11.median(:5).~ | ||
13 | =B11.pselect@z1(#<=windown-extrem_itv&&~<~[-extrem_itv:-1].min()&&~<=~[1,extrem_itv].min()) | ||
14 | =B11(B13) | ||
15 | =B11.pselect@z1(#<=B13&&~>~[-extrem_itv:-1].max()&&~>=~[1:extrem_itv].max()) | ||
16 | =B11(B15) | ||
17 | =A5(A11) | ||
18 | if B14<B12&&B17>B16 | =A10.insert(0,1) | |
19 | else if B17<B14 | =A10.insert(0,-1) | |
20 | else | =A10.insert(0,0) | |
21 | =ps=0,bprice=0,A4(A9).derive(A10(#):signal,if(ps==0&&signal==1,(ps=1,bprice=hfq_close,1),if(ps!=0&&(signal==-1||hfq_close/bprice>1+inrate),(ps=0,-1),0)):flag,if(flag!=0,100,0):shares) |
A4:复权收盘价。
A6-A8:设置参数,本例中N=3,M=252,R=0.5。
A11代码块:从第253天循环,当满足买入条件时,记录signal=1,满足卖出条件时,记录signal=-1,因为这里无法确定具体的买入点,所以无法计算收益率,signal这一信号不包含收益率超过R的卖出点。
A21:利用买卖信号signal,并计算出下单信号flag和下单量(100股),当空仓且signal=1时,flag=1买入;当signal=-1或收益率超过50%且有仓位时,flag=-1卖出。
SPL不仅拥有书写便捷的循环函数,也可以像Python,Java等语言那样用for循环完成复杂的循环计算,比如本例中的A11代码块,可以在循环中清楚的写出每一个计算步骤,完成计算任务。
根据A21的数据画出买卖信号图:
红色圆点是买入点,绿色方点是卖出点。
过滤出A21数据中flag不为0的行,调用回测接口即可得到回测收益率图和回测指标。
回测收益率图:
回测指标:
indicators | value |
累计收益率 (cumulative rate of return) | 6.78% |
年化收益率 (annualized rate of return) | 3.5% |
年化波动率 (annual volatility) | 23.08% |
夏普比率 (sharpe ratio) | 0.02 |
最大回撤 (maximum drawdown) | 37.34% |
投入现金 (cash invested) | 43355.99 |
总资产 (total assets) | 46294.99 |
仓位占比 (stock holding ratio) | 83.11% |
盈利次数 (profit times) | 2 |
亏损次数 (losses times) | 8 |
英文版