0. 本栏目因子汇总表
1. 因子简述
移动平均线(Moving Average, MA)是技术分析中最基础和最常用的指标之一。它通过计算一定时间窗口内的价格平均值来平滑价格波动,帮助识别市场趋势。MA可以过滤市场噪音,提供更清晰的价格走势,是构建交易策略的重要工具。
2. 因子计算逻辑
MA的计算公式如下:
M A t = 1 n ∑ i = 0 n − 1 C l o s e t − i M A f a c t o r = C l o s e − M A σ n ( C l o s e ) \begin{align*} MA_t &= \frac{1}{n} \sum_{i=0}^{n-1} Close_{t-i} \\ MA_{factor} &= \frac{Close - MA}{\sigma_n(Close)} \end{align*} MAtMAfactor=n1i=0∑n−1Closet−i=σn(Close)Close−MA
其中:
- n为移动平均的周期
- Close为收盘价
- σ_n(Close)为n周期收盘价的滚动标准差
3. 因子应用场景
-
趋势识别:
- 价格上穿MA,产生做多信号
- 价格下穿MA,产生做空信号
-
支撑阻力:
- MA线常作为动态支撑位
- MA线常作为动态阻力位
-
趋势强度:
- 价格与MA的距离反映趋势强度
- MA的斜率反映趋势速度
-
均线系统:
- 与其他周期MA配合使用
- 构建黄金交叉、死亡交叉等策略
4. 因子优缺点
优点:
- 简单直观:计算方法简单,容易理解
- 应用广泛:可用于各种市场和时间周期
- 稳定可靠:具有良好的统计学基础
- 适应性强:可根据需要调整参数
缺点:
- 滞后性:作为滞后指标,存在一定延迟
- 假信号:震荡市场可能产生虚假信号
- 参数依赖:不同参数可能产生不同结果
- 单一维度:仅考虑价格信息,忽略其他因素
5. 因子代码实现
def MA_factor(df, n=20):
"""
计算移动平均线(MA)因子
参数:
df (DataFrame): 输入数据
- code: 证券代码,如'600036.SH'
- date: 日期,格式为'YYYY-MM-DD'
- close: 收盘价
n (int): 移动平均周期,默认20
返回:
DataFrame: 包含原有列和MA因子值,理论取值范围(-∞,+∞),实际大多在[-3,3]之间
注意:
1. 返回数据包含所有输入列
2. 新增MA列为因子值
3. date列保持原有字符串格式'YYYY-MM-DD'
4. 数据将按code分组、date倒序排列
"""
import numpy as np
import pandas as pd
# 创建副本避免修改原始数据
df_copy = df.copy()
# 检查code格式
valid_codes = df_copy['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_copy['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_copy = df_copy.sort_values(['code', 'date'], ascending=[True, False])
# 按code分组计算
def calculate_ma(group):
# 计算简单移动平均
ma = group['close'].rolling(window=n).mean()
# 计算n周期滚动标准差
rolling_std = group['close'].rolling(window=n).std()
# 计算因子值
group['MA'] = np.where(
rolling_std != 0,
(group['close'] - ma) / rolling_std,
0
)
return group
df_copy = df_copy.groupby('code', group_keys=False).apply(calculate_ma)
# 按照最终要求重新排序并重置索引
df_copy = df_copy.sort_values(['code', 'date'], ascending=[True, False]).reset_index(drop=True)
return df_copy
参考数据:
6. 因子取值范围及其含义
MA因子的取值范围理论上是(-∞,+∞),但实际上大多数值会落在[-3,3]区间内:
- 取值 > 2:表示价格显著高于MA(超过2个标准差),强烈超买信号
- 取值在(1,2]之间:表示价格高于MA一个标准差以上,偏多信号
- 取值在[-1,1]之间:表示价格在MA一个标准差范围内波动,震荡区间
- 取值在[-2,-1)之间:表示价格低于MA一个标准差以上,偏空信号
- 取值 < -2:表示价格显著低于MA(超过2个标准差),强烈超卖信号
7. 因子函数参数建议
- n (移动平均周期):
- 默认值:20
- 建议范围:[5, 120]
- 参数说明:决定移动平均的平滑程度和滞后性
- 选择建议:
- 日线数据常用周期:
- 短期:5、10、20日
- 中期:30、60日
- 长期:120、250日
- 小时线数据建议使用较小的周期:5-30
- 分钟线数据建议使用更小的周期:3-15
- 高波动市场使用较大的周期
- 低波动市场使用较小的周期
- 日线数据常用周期: