0. 本栏目因子汇总表
1. 因子简述
指数移动平均线(Exponential Moving Average, EMA)是一种重要的技术分析工具,它通过对价格数据进行加权平均计算,赋予近期数据更大的权重。相比简单移动平均线(SMA),EMA对市场变化的反应更加敏感,能更快地捕捉价格趋势的变化。
2. 因子计算逻辑
EMA的计算公式如下:
α = 2 n + 1 E M A t = α × P r i c e t + ( 1 − α ) × E M A t − 1 E M A f a c t o r = C l o s e − E M A σ n ( C l o s e ) \begin{align*} \alpha &= \frac{2}{n+1} \\ EMA_t &= \alpha \times Price_t + (1-\alpha) \times EMA_{t-1} \\ EMA_{factor} &= \frac{Close - EMA}{\sigma_n(Close)} \end{align*} αEMAtEMAfactor=n+12=α×Pricet+(1−α)×EMAt−1=σn(Close)Close−EMA
其中:
- n为移动平均周期
- α为平滑系数
- Price_t为t时刻的价格
- EMA_{t-1}为上一期的EMA值
- σ_n(Close)为n周期收盘价的滚动标准差
3. 因子应用场景
-
趋势跟踪:
- 价格上穿EMA,做多信号
- 价格下穿EMA,做空信号
-
趋势确认:
- EMA斜率反映趋势强度
- EMA形态判断趋势持续性
-
支撑阻力:
- EMA作为动态支撑位
- EMA作为动态阻力位
-
均线系统:
- 与其他周期EMA配合使用
- 构建黄金交叉、死亡交叉策略
4. 因子优缺点
优点:
- 反应灵敏:对价格变化的响应速度快
- 权重合理:近期数据权重更大
- 计算简单:实现容易,计算量小
- 应用广泛:适用于各类市场和周期
缺点:
- 滞后存在:作为滞后指标仍有一定延迟
- 假信号:在震荡市场易产生虚假信号
- 参数敏感:周期选择影响指标效果
- 单一维度:仅考虑价格信息
5. 因子代码实现
def EMA_factor(df, n=20):
"""
计算指数移动平均线(EMA)因子
参数:
df (DataFrame): 输入数据
- code: 证券代码,如'600036.SH'
- date: 日期,格式为'YYYY-MM-DD'
- close: 收盘价
n (int): 移动平均周期,默认20
返回:
DataFrame: 包含原有列和EMA因子值,理论取值范围(-∞,+∞),实际大多在[-3,3]之间
"""
import numpy as np
import pandas as pd
# 检查code格式
valid_codes = df['code'].str.match(r'^(?:\d{6}\.(SH|SZ)|[A-Z]+/[A-Z]+|\w+\.(IB|CFE|US))$')
if not valid_codes.all():
raise ValueError("Invalid code format found")
# 检查date格式
valid_dates = df['date'].str.match(r'^\d{4}-\d{2}-\d{2}$')
if not valid_dates.all():
raise ValueError("Invalid date format found, expected 'YYYY-MM-DD'")
# 排序(使用字符串比较)- 保持时间降序
df = df.sort_values(['code', 'date'], ascending=[True, False])
# 按code分组计算
def calculate_ema(group):
# 计算EMA
alpha = 2 / (n + 1)
ema = group['close'].ewm(alpha=alpha, adjust=False).mean()
# 计算n周期滚动标准差
rolling_std = group['close'].rolling(window=n).std()
# 计算因子值:使用滚动标准差标准化的价格偏离度
# 处理标准差为0的情况
group['EMA'] = np.where(
rolling_std != 0,
(group['close'] - ema) / rolling_std,
0
)
return group
# 按code分组计算因子
df = df.groupby('code', group_keys=False).apply(calculate_ema)
# 按照最终要求重新排序并重置索引
df = df.sort_values(['date', 'code'], ascending=[False, True]).reset_index(drop=True)
return df
测试数据:
6. 因子取值范围及其含义
EMA因子的取值范围理论上是(-∞,+∞),但实际上大多数值会落在[-3,3]区间内:
- 取值 > 2:表示价格显著高于EMA(超过2个标准差),强烈超买信号
- 取值在(1,2]之间:表示价格高于EMA一个标准差以上,偏多信号
- 取值在[-1,1]之间:表示价格在EMA一个标准差范围内波动,震荡区间
- 取值在[-2,-1)之间:表示价格低于EMA一个标准差以上,偏空信号
- 取值 < -2:表示价格显著低于EMA(超过2个标准差),强烈超卖信号
7. 因子函数参数建议
- n (移动平均周期):
- 默认值:20
- 建议范围:[5, 120]
- 参数说明:决定移动平均的平滑程度
- 选择建议:
- 日线数据常用周期:
- 短期:5、10、20日
- 中期:30、60日
- 长期:120、250日
- 小时线数据建议使用较小的周期:5-30
- 分钟线数据建议使用更小的周期:3-15
- 高波动市场使用较大的周期
- 低波动市场使用较小的周期
- 日线数据常用周期:
注意事项:
-
参数选择:
- 考虑市场特征
- 注意数据频率
- 避免过度优化
-
实战应用:
- 结合成交量分析
- 观察EMA形态
- 关注趋势强度
- 多周期配合使用
-
风险控制:
- 设置合理止损
- 确认信号有效性
- 注意市场环境
- 控制仓位大小