1.基本原理
股票价格多围绕某一价格上下波动。当股价远离基准价格超过一定幅度则可能形成长期趋势,而短期股价偏离基准价格过多则可能因过度偏离均值而形成大幅回撤甚至趋势终止。
由此以观察期内均线作为基准价格,以观察期内标准差的一定倍数作为开仓价或止盈价,采用移动止损方式进行止损构建此策略。
开仓条件
当日最高价 > 均价 + 开仓触发倍数 × 观察期内标准差最大值止盈条件
当天最高价 > 均价 + 止盈触发倍数 × 观察期内标准差最大值止损条件
同样结合了移动止损和固定止损两种止损模式;
当天最低价 < max(均价, 开仓价 - 止损触发倍数 × 开仓时观察期内标准差最大值)
均价:移动止损;开仓价 - 止损触发倍数 × 开仓时观察期内标准差最大值:固定止损
注意:考虑了开仓当天也触发了平仓信号的近似处理;
用观察期内标准差的最大值开仓的原因是:在震荡行情的时候,避免频繁开仓;更加稳定
2.策略实现
2.1 数据获取
import pandas as pd
import numpy as np
import tushare as ts
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
code = '002397'
length = 10 # 参考周期长度,用于确定计算标准差及移动平均的周期
open_trigger = 0.5 # 价格向上偏离均线0.5倍观察期内标准差的最大值开仓;
stopwin_trigger = 3 # 价格向上偏离均线3倍观察期内标准差的最大值止盈;
stoplose_trigger = 1 # 移动止损;跌破均值移动止损;固定止损:开仓价向下偏离观察期内标准差的最大值;
data = ts.get_k_data(code, '2012-01-01', '2017-01-01')
data.head()
date | open | close | high | low | volume | code | |
---|---|---|---|---|---|---|---|
0 | 2012-01-04 | 5.437 | 5.183 | 5.437 | 5.148 | 1512.0 | 002397 |
1 | 2012-01-05 | 5.084 | 4.955 | 5.084 | 4.800 | 3389.0 | 002397 |
2 | 2012-01-06 | 4.806 | 4.918 | 4.941 | 4.692 | 4425.0 | 002397 |
3 | 2012-01-09 | 4.797 | 4.970 | 4.980 | 4.679 | 2581.0 | 002397 |
4 | 2012-01-10 | 4.897 | 5.140 | 5.148 | 4.793 | 2586.0 | 002397 |
2.2 策略数据处理
data['pct_change'] = data['close'].pct_change()
# min_periods 每个窗口最少的观察值数量,小于这个值得窗口结果为Nan,值可以是int,默认是None,offset情况下默认为1
data['ma'] = data['close'].rolling(window=length, min_periods=3).mean()
data['std'] = data['close'].rolling(window=length, min_periods=3).std()
data.head()