Kama 是如何计算的?

Kama 计算参数及数据限制说明。

Kama 是如何计算的?

直接答案

Kama 通常被计算为一种可变的、自适应的移动平均线。在最常见的公式中,每一个新的 Kama 值使用了三个要素:(1)前一个 Kama 值,(2)随时间变化的平滑因子,以及(3)当前价格。该平滑因子取决于价格在最近一个回溯窗口内的“效率”程度——通常以净价格变化与总绝对变化之比来衡量。

由于在实际应用中存在不同的名称和变体,最稳妥的验证方法是检查你所使用的指标设置中的确切定义(例如,回溯长度和平滑常数)。以下计算展示了一种广泛使用且稳定的结构;如果你的平台所用的 Kama 具有不同的参数名称或略有不同的效率公式,其计算步骤类似,但常数可能不同。

机制与定义

描述其机制的一种实用方法是将其视为一种递归平滑过程。

  1. 选择输入价格序列
    Kama 是基于价格的时间序列计算得出的。“价格”可以有多种定义方式(例如收盘价、典型价格或其他衍生序列)。你选择的输入必须与你希望复现的实现方式一致。

令 P[t] 表示在时间 t 的选定价格。

  1. 设置回溯窗口和平滑边界
    典型的 Kama 使用以下参数:
  • 回溯长度:N(用于判断效率的周期数)
  • 快速平滑设置:通常以较小的“快速”周期或常数表示
  • 慢速平滑设置:通常以较大的“慢速”周期或常数表示

在许多实现中,平滑边界会被转换为两个常数:

  • 由快速和慢速周期推导出的 SC_fast 和 SC_slow

具体的映射方式取决于实现方式。一种常见方法使用指数平滑风格的常数形式:

  • SC_fast = 2 / (fastPeriod + 1)
  • SC_slow = 2 / (slowPeriod + 1)
  1. 计算过去 N 个周期的效率比率
    在回溯窗口内,比较两个量:
  • 净变化:|P[t] − P[t−N]|
  • 绝对变动总和:sum_{i=0..N−1} |P[t−i] − P[t−i−1]|

然后计算效率比率 ER:

  • ER = netChange / sumAbsMoves

当价格从起点到终点的移动相对于窗口内的“来回”波动更强烈时,ER 值更高。当 ER 接近 0 时,表示价格走势杂乱;当 ER 接近 1 时,表示价格移动更直接。

实现中需明确处理的一个细节是:如果 sumAbsMoves 为零(例如,价格在整个窗口内未变),则 ER 可能被设为 0,或需特别处理以避免除零错误。你应该复制所用来源中的相同规则。

  1. 将 ER 转换为动态平滑常数
    然后使用 ER 和平滑边界计算变量平滑常数 SC[t]。一种常见结构为:
  • SC[t] = (ER × (SC_fast − SC_slow) + SC_slow)^2

指数(通常为 2)是常用公式的一部分;如果你的实现使用不同的指数,则必须使用相同的指数。

  1. 递归更新 Kama
    最后,Kama 的更新公式为:
  • Kama[t] = Kama[t−1] + SC[t] × (P[t] − Kama[t−1])

这种形式使 Kama 以取决于 SC[t] 的幅度“向”当前价格拉动。SC 越大,调整越快;SC 越小,调整越慢。

  1. 初始化
    Kama 需要一个初始值 Kama[0](或 Kama[N−1],取决于索引方式)。许多实现使用第一个可用点的价格或简单移动平均作为初始化。如果你想独立验证计算,请确认你所测试的指标定义中的确切初始化规则。

证据或示例(含明确假设)

以下是一个基于明确假设的小型数值演示。这不是实时市场数据;它展示了你可以用自己的序列重复的计算结构。

示例假设:

  • 输入价格 P 为收盘价。
  • 回溯长度 N = 3。
  • fastPeriod = 2,slowPeriod = 30,因此:
    • SC_fast = 2/(2+1) = 0.666666…
    • SC_slow = 2/(30+1) = 0.064516…
  • SC[t] 中的指数为 2。
  • 前一个 Kama 值为 Kama[t−1] = 100。

假设在时间 t 时有:

  • P[t−2] = 99
  • P[t−1] = 101
  • P[t] = 100

步骤 A:净变化

  • netChange = |P[t] − P[t−N]| = |100 − 99| = 1

步骤 B:绝对变动总和
对于 N = 3,需要计算 |P[t]−P[t−1]| + |P[t−1]−P[t−2]| + |P[t−2]−P[t−3]|。但我们的小序列只显示了两个前值。为保持演示一致,扩展窗口以包含 P[t−3]。

令 P[t−3] = 98。
现在计算:

  • |P[t] − P[t−1]| = |100 − 101| = 1
  • |P[t−1] − P[t−2]| = |101 − 99| = 2
  • |P[t−2] − P[t−3]| = |99 − 98| = 1
  • sumAbsMoves = 1 + 2 + 1 = 4

步骤 C:ER

  • ER = netChange / sumAbsMoves = 1 / 4 = 0.25

步骤 D:动态平滑常数

  • SC[t] = (ER × (SC_fast − SC_slow) + SC_slow)^2
    先计算 (SC_fast − SC_slow):
  • 0.666666… − 0.064516… = 0.602150…
    再计算线性项:
  • ER × (SC_fast − SC_slow) + SC_slow
    = 0.25 × 0.602150… + 0.064516…
    = 0.150537… + 0.064516…
    = 0.215053…
    平方:
  • SC[t] ≈ (0.215053…)^2 ≈ 0.0463

步骤 E:更新 Kama

  • Kama[t] = Kama[t−1] + SC[t] × (P[t] − Kama[t−1])
    = 100 + 0.0463 × (100 − 100)
    = 100

在此构造示例中,当前价格等于前一个 Kama 值,因此更新量为零。如果 P[t] 与 Kama[t−1] 不同,则会看到由 SC[t] 缩放的非零调整。

此例说明了核心思想:如果 ER 增加(价格在 N 个周期内变得更直接),SC[t] 会趋向 SC_fast,使 Kama 响应更快;如果 ER 下降(波动更杂乱),SC[t] 会趋向 SC_slow,使 Kama 更平滑。

限制与风险

  1. 参数不匹配
    Kama 依赖于 N、快/慢设置以及指数和边缘情况(如除零)的处理规则。如果你复制了公式但未从你的指标中复制确切的参数映射,你将得到不同的数值结果。

  2. 输入价格定义
    不同平台对“价格”的定义不同。如果一个使用收盘价,另一个使用衍生价格(例如高低收均价),则整个输出序列都会改变。

外汇和差价合约交易具有重大风险。FoxiForex的信息仅用于教育,不构成个人财务建议。赞助内容会被清楚标注。