0. 本栏目因子汇总表
1. 因子简述
考夫曼自适应移动平均线(Kaufman Adaptive Moving Average, KAMA)是由Perry Kaufman开发的一种自适应技术指标。它的独特之处在于能够根据市场波动性自动调整移动平均的敏感度,在趋势市场中减少滞后,在震荡市场中增加平滑度。这种自适应特性使其比传统移动平均线具有更好的市场适应性。
2. 因子计算逻辑
KAMA的计算过程包含多个步骤,核心是通过效率比率(ER)来动态调整平滑系数:
E R = ∣ C l o s e t − C l o s e t − n ∣ ∑ i = 1 n ∣ C l o s e i − C l o s e i − 1 ∣ S C = [ E R × ( F a s t S C − S l o w S C ) + S l o w S C ] 2 K A M A t = K A M A t − 1 + S C × ( C l o s e t − K A M A t − 1 ) \begin{align*} ER &= \frac{|Close_t - Close_{t-n}|}{\sum_{i=1}^n |Close_i - Close_{i-1}|} \\ SC &= [ER \times (Fast_{SC} - Slow_{SC}) + Slow_{SC}]^2 \\ KAMA_t &= KAMA_{t-1} + SC \times (Close_t - KAMA_{t-1}) \end{align*} ERSCKAMAt=∑i=1n∣Closei−Closei−1∣∣Closet−Closet−n∣=[ER×(FastSC−SlowSC)+SlowSC]2=KAMAt−1+SC×(Closet−KAMAt−1)
其中:
- ER为效率比率,范围[0,1]
- SC为平滑系数
- Fast_SC为快速平滑系数 = 2/(2+1)
- Slow_SC为慢速平滑系数 = 2/(30+1)
- n为效率比率周期(通常为10)
KAMA因子的计算:
K
A
M
A
f
a
c
t
o
r
=
C
l
o
s
e
−
K
A
M
A
σ
n
(
C
l
o
s
e
)
KAMA_{factor} = \frac{Close - KAMA}{\sigma_n(Close)}
KAMAfactor=σn(Close)Close−KAMA
其中:
- σ_n(Close)为n周期收盘价的滚动标准差
- n为与KAMA相同的周期参数
3. 因子应用场景
-
趋势跟踪:
- 价格上穿KAMA,产生做多信号
- 价格下穿KAMA,产生做空信号
-
市场环境识别:
- KAMA走势平缓,表明市场震荡
- KAMA走势陡峭,表明市场趋势强劲
-
动量分析:
- 价格与KAMA的距离反映动量强度
- KAMA斜率变化反映动量变化
-
组合应用:
- 与其他技术指标配合使用
- 用于多周期分析和市场结构判断
4. 因子优缺点
优点:
- 自适应性强:能根据市场状态自动调整灵敏度
- 滞后性小:在趋势市场中反应迅速
- 抗干扰性好:在震荡市场中保持平滑
- 应用灵活:可用于不同市场和时间周期
缺点:
- 计算复杂:相比简单移动平均计算量大
- 参数敏感:不同参数组合可能产生不同效果
- 信号延迟:在市场转折点可能存在一定延迟
- 过度平滑:有时可能错过重要的市场转折点
5. 因子代码实现
def KAMA_factor(df, n=10, fast_period=2, slow_period=30):
"""
计算考夫曼自适应移动平均线(KAMA)因子
参数:
df (DataFrame): 输入数据
- code: 证券代码,如'600036.SH'
- date: 日期,格式为'YYYY-MM-DD'
- close: 收盘价
n (int): 效率比率周期,默认10
fast_period (int): 快速EMA周期,默认2
slow_period (int): 慢速EMA周期,默认30
返回:
DataFrame: 包含原有列和KAMA因子值,理论取值范围(-∞,+∞),实际大多在[-3,3]之间
注意:
1. 返回数据包含所有输入列
2. 新增KAMA列为因子值
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_kama(group):
close = group['close'].values
# 计算方向变化
change = np.abs(close - np.roll(close, n))
# 计算波动
volatility = np.sum([np.abs(close[i] - close[i-1]) for i in range(1, len(close))], axis=0)
# 计算效率系数
er = np.where(volatility != 0, change / volatility, 0)
# 计算平滑系数
fast_sc = 2.0 / (fast_period + 1)
slow_sc = 2.0 / (slow_period + 1)
sc = (er * (fast_sc - slow_sc) + slow_sc) ** 2
# 计算KAMA
kama = np.zeros_like(close)
kama[0] = close[0]
for i in range(1, len(close)):
kama[i] = kama[i-1] + sc[i] * (close[i] - kama[i-1])
# 计算n周期滚动标准差
rolling_std = group['close'].rolling(window=n).std()
# 计算因子值:使用滚动标准差标准化的价格偏离度
# 处理标准差为0的情况
group['KAMA'] = np.where(
rolling_std != 0,
(group['close'] - kama) / rolling_std,
0
)
return group
df_copy = df_copy.groupby('code', group_keys=False).apply(calculate_kama)
# 按照最终要求重新排序并重置索引
df_copy = df_copy.sort_values(['code', 'date'], ascending=[True, False]).reset_index(drop=True)
return df_copy
测试数据:
6. 因子取值范围及其含义
KAMA因子的取值范围理论上是(-∞,+∞),但实际上大多数值会落在[-3,3]区间内:
- 取值 > 2:表示价格显著高于KAMA(超过2个标准差),强烈超买信号
- 取值在(1,2]之间:表示价格高于KAMA一个标准差以上,偏多信号
- 取值在[-1,1]之间:表示价格在KAMA一个标准差范围内波动,震荡区间
- 取值在[-2,-1)之间:表示价格低于KAMA一个标准差以上,偏空信号
- 取值 < -2:表示价格显著低于KAMA(超过2个标准差),强烈超卖信号
7. 因子函数参数建议
-
n (效率比率周期):
- 默认值:10
- 建议范围:[5, 30]
- 参数说明:用于计算效率比率和标准差标准化
- 选择建议:
- 日线数据建议使用10-20
- 小时线数据建议使用20-30
- 分钟线数据建议使用5-10
- 快速市场使用较小的n值
- 慢速市场使用较大的n值
-
fast_period (快速EMA周期):
- 默认值:2
- 建议范围:[2, 5]
- 参数说明:决定KAMA对快速市场变化的反应速度
- 选择建议:
- 日线数据建议使用2-3
- 小时线数据建议使用3-4
- 分钟线数据建议使用4-5
-
slow_period (慢速EMA周期):
- 默认值:30
- 建议范围:[20, 60]
- 参数说明:决定KAMA在慢速市场中的平滑程度
- 选择建议:
- 日线数据建议使用30-40
- 小时线数据建议使用40-50
- 分钟线数据建议使用20-30
注意事项:
- 参数选择应考虑市场特性:
- 波动率大的市场适合使用较大的参数值
- 流动性高的市场可以使用较小的参数值
- 建议通过回测验证最优参数:
- 在特定市场条件下进行参数优化
- 避免过度拟合,保持参数的稳定性
- 不同时间周期的数据应使用不同的参数设置