1.5 重叠因子:考夫曼自适应移动平均线(Kaufman Adaptive Moving Average, KAMA)概念与Python实战

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=1nCloseiClosei1ClosetClosetn=[ER×(FastSCSlowSC)+SlowSC]2=KAMAt1+SC×(ClosetKAMAt1)

其中:

  • 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)CloseKAMA

其中:

  • σ_n(Close)为n周期收盘价的滚动标准差
  • n为与KAMA相同的周期参数

3. 因子应用场景

  1. 趋势跟踪:

    • 价格上穿KAMA,产生做多信号
    • 价格下穿KAMA,产生做空信号
  2. 市场环境识别:

    • KAMA走势平缓,表明市场震荡
    • KAMA走势陡峭,表明市场趋势强劲
  3. 动量分析:

    • 价格与KAMA的距离反映动量强度
    • KAMA斜率变化反映动量变化
  4. 组合应用:

    • 与其他技术指标配合使用
    • 用于多周期分析和市场结构判断

4. 因子优缺点

优点:

  1. 自适应性强:能根据市场状态自动调整灵敏度
  2. 滞后性小:在趋势市场中反应迅速
  3. 抗干扰性好:在震荡市场中保持平滑
  4. 应用灵活:可用于不同市场和时间周期

缺点:

  1. 计算复杂:相比简单移动平均计算量大
  2. 参数敏感:不同参数组合可能产生不同效果
  3. 信号延迟:在市场转折点可能存在一定延迟
  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. 因子函数参数建议

  1. n (效率比率周期):

    • 默认值:10
    • 建议范围:[5, 30]
    • 参数说明:用于计算效率比率和标准差标准化
    • 选择建议:
      • 日线数据建议使用10-20
      • 小时线数据建议使用20-30
      • 分钟线数据建议使用5-10
      • 快速市场使用较小的n值
      • 慢速市场使用较大的n值
  2. fast_period (快速EMA周期):

    • 默认值:2
    • 建议范围:[2, 5]
    • 参数说明:决定KAMA对快速市场变化的反应速度
    • 选择建议:
      • 日线数据建议使用2-3
      • 小时线数据建议使用3-4
      • 分钟线数据建议使用4-5
  3. slow_period (慢速EMA周期):

    • 默认值:30
    • 建议范围:[20, 60]
    • 参数说明:决定KAMA在慢速市场中的平滑程度
    • 选择建议:
      • 日线数据建议使用30-40
      • 小时线数据建议使用40-50
      • 分钟线数据建议使用20-30

注意事项:

  1. 参数选择应考虑市场特性:
    • 波动率大的市场适合使用较大的参数值
    • 流动性高的市场可以使用较小的参数值
  2. 建议通过回测验证最优参数:
    • 在特定市场条件下进行参数优化
    • 避免过度拟合,保持参数的稳定性
  3. 不同时间周期的数据应使用不同的参数设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI量金术师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值