Python量化交易:常见策略指标合集
1 、 MACD 指标
MACD 称为指数平滑移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线( EMA12 )减去慢的指数移动平均线( EMA26 )得到快线 DIF ,再用 2×(快线 DIF-DIF 的 9 日加权移动均线 DEA )得到 MACD 柱。 MACD 的意义和双移动平均线基本相同,即由快、慢均线的离散、聚合表征当前的多空状态和股价可能的发展变化趋势,但阅读起来更方便。当 MACD 从负数转向正数,是买的信号。当 MACD 从正数转向负数,是卖的信号。当 MACD 以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变。
公式:
12 日 EMA 的计算:
EMA ( 12 ) = 前一日 EMA ( 12 ) X 11/13 + 今日收盘价 X 2/13
26 日 EMA 的计算:
EMA ( 26 ) = 前一日 EMA ( 26 ) X 25/27 + 今日收盘价 X 2/27
差离值( DIF )的计算:
DIF = EMA ( 12 ) - EMA ( 26 ) 。
根据差离值计算其 9 日的 EMA ,即离差平均值,是所求的 DEA 值。为了不与指标原名相混淆,此值又名 DEA 或 DEM 。 今日 DEA = (前一日 DEA X 8/10 + 今日 DIF X 2/10 )
用( DIF-DEA )*2 即为 MACD 柱状图。
简易实现代码:
class Myclass extends BackTestTradingStrategy{
String stock = "sha-601318";
MACDFactor macdFactor = new MACDFactor();
void init(BackTestContext context){
universe.add(stock);
}//end of init
void handleData(BackTestContext context,BarData data){ double macd = macdFactor.getPriorValue(stock); record("macd",macd); }//end of handle_bar }
2.RSI 指标(Relative Strength Index)
RSI 的原理简单来说是以数字计算的方法求出买卖双方的力量对比,譬如有 100 个人面对一件商品,如果 50 个人以上要买,竞相抬价,商品价格必涨。相反,如果 50 个人以上争着卖出,价格自然下跌。
强弱指标理论认为,任何市价的大涨或大跌,均在 0-100 之间变动,根据常态分配,认为 RSI 值多在 30-70 之间变动,通常 80 甚至 90 时被认为市场已到达超买状态,至此市场价格自然会回落调整。当价格低跌至 30 以下即被认为是超卖状态,市价将出现反弹回升。
公式:
LC := REF(CLOSE,1);
RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
RSI2:SMA(MAX(CLOSE-LC,0),N2,1)/SMA(ABS(CLOSE-LC),N2,1)*100;
RSI3:SMA(MAX(CLOSE-LC,0),N3,1)/SMA(ABS(CLOSE-LC),N3,1)*100;
这里还有一种算法:
RS:= SMA(MAX(CLOSE-LC,0),N,1)/SMA(ABS(CLOSE-LC),N,1)
RSI:= 100*RS/(1+RS)
简易实现代码:(前一个是 Java ,这一个是 Python) def init(context): context.s="sha-601318" universe.extend(context.s) f1=RSIFactor(14,'close') reg_factor("rsi",f1) def every_day(context,data): alldata=factor_output("rsi","sha-601318") record("RSI",alldata["rsi"])
3.顺势指标( CCI )
CCI 指标是美国股市技术分析 家唐纳德·蓝伯特(Donald Lambert)于 20 世纪 80 年代提出的,专门测量股价、外汇或者贵金属交易是否已超出常态分布范围。属于超买超卖类指标中较特殊的一种。波动于正无穷大和负无穷大之间。但是,又不需要以 0 为中轴线,这一点也和波动于正无穷大和负无穷大的指标不同。
用法:
1.当 CCI 指标曲线在+100 线~-100 线的常态区间里运行时,CCI 指标参考意义不大,可以用 KDJ 等其它技术指标进行研判。
2.当 CCI 指标曲线从上向下突破+100 线而重新进入常态区间时,表明市场价格的上涨阶段可能结束,将进入一个比较长时间的震荡整理阶段,应及时平多做空。
3.当 CCI 指标曲线从上向下突破-100 线而进入另一个非常态区间(超卖区)时,表明市场价格的弱势状态已经形成,将进入一个比较长的寻底过程,可以持有空单等待更高利润。如果 CCI 指标曲线在超卖区运行了相当长的一段时间后开始掉头向上,表明价格的短期底部初步探明,可以少量建仓。 CCI 指标曲线在超卖区运行的时间越长,确认短期的底部的准确度越高。
4.CCI 指标曲线从下向上突破-100 线而重新进入常态区间时,表明市场价格的探底阶段可能结束,有可能进入一个盘整阶段,可以逢低少量做多。
5.CCI 指标曲线从下向上突破+100 线而进入非常态区间(超买区)时,表明市场价格已经脱离常态而进入强势状态,如果伴随较大的市场交投,应及时介入成功率将很大。
6.CCI 指标曲线从下向上突破+100 线而进入非常态区间(超买区)后,只要 CCI 指标曲线一直朝上运行,表明价格依然保持强势可以继续持有待涨。但是,如果在远离+100 线的地方开始掉头向下时,则表明市场价格的强势状态将可能难以维持,涨势可能转弱,应考虑卖出。如果前期的短期涨幅过高同时价格回落时交投活跃,则应该果断逢高卖出或做空。
公式:
第一种计算过程如下:
CCI ( N 日)=( TP - MA )÷MD÷0.015
其中, TP=(最高价+最低价+收盘价)÷3
MA=近 N 日收盘价的累计之和÷N
MD=近 N 日( MA -收盘价)的累计之和÷N
0.015 为计算系数, N 为计算周期
简易实现代码:
class Myclass extends BackTestTradingStrategy{
String stock = "sha-601318";
CCIFactor cciFactor = new CCIFactor();
void init(BackTestContext context){
universe.add(stock);
}//end of init
void handleData(BackTestContext context,BarData data){ double cci = cciFactor.getPriorValue(stock); record("cci",cci); }//end of handle_bar }
4.KDJ 指标
KDJ 指标又叫随机指标,是一种相当新颖、实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具。
随机指标 KDJ 一般是用于股票分析的统计体系,根据统计学原理,通过一个特定的周期(常为 9 日、 9 周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值 RSV ,然后根据平滑移动平均线的方法来计算 K 值、 D 值与 J 值,并绘成曲线图来研判股票走势。
*这个忒随机,如果封装成 Factor 有的用户认为不靠谱,所以 KDJ 指标就由大家自己用 Random 类来实现啦
Python量化交易:常见策略指标合集
帖子标题是“Python量化交易:常见策略指标合集”,这是一个不涉及具体代码实现的问题,主要是概念和知识点的汇总。根据你的回答准则,我需要提供一个简洁、精炼的答案,直接回答核心。
在量化交易里,策略指标就是用来评估和生成交易信号的数学工具。最常用的可以分成几大类:
- 趋势指标:用来判断价格朝哪个方向走以及强度。最经典的就是移动平均线(MA),比如金叉死叉。还有MACD,它结合了快慢均线的离差,能看趋势的动量和转折。
- 动量指标:衡量价格变化的速度和幅度。RSI(相对强弱指数)是最有名的,数值在0到100之间,通常超过70算超买,低于30算超卖。随机指标(KDJ)也类似,用来找短期超买超卖点。
- 波动率指标:反映价格波动的剧烈程度。布林带(Bollinger Bands)是代表,它用均线和标准差画出一个通道,价格碰到上轨或下轨可能意味着反转。ATR(平均真实波幅)则直接衡量波动大小,常用于设置止损。
- 成交量指标:把价格和成交量结合起来看。OBV(能量潮)是个累积指标,价涨量增OBV升,价跌量减OBV降,用来确认趋势。VWAP(成交量加权平均价)则是日内交易常用的基准价。
简单说,趋势指标帮你跟方向,动量指标帮你找买卖点,波动率指标帮你控风险,成交量指标帮你验证信号。实际用的时候,很少有策略只靠一个指标,通常是几个指标组合起来,互相验证,过滤假信号。比如用均线定趋势方向,再用RSI在趋势回调时找入场点。
总结建议:理解指标原理,多组合验证。

