Kama 是如何计算的?
直接答案
Kama 通常被计算为一种可变的、自适应的移动平均线。在最常见的公式中,每一个新的 Kama 值使用了三个要素:(1)前一个 Kama 值,(2)随时间变化的平滑因子,以及(3)当前价格。该平滑因子取决于价格在最近一个回溯窗口内的“效率”程度——通常以净价格变化与总绝对变化之比来衡量。
由于在实际应用中存在不同的名称和变体,最稳妥的验证方法是检查你所使用的指标设置中的确切定义(例如,回溯长度和平滑常数)。以下计算展示了一种广泛使用且稳定的结构;如果你的平台所用的 Kama 具有不同的参数名称或略有不同的效率公式,其计算步骤类似,但常数可能不同。
机制与定义
描述其机制的一种实用方法是将其视为一种递归平滑过程。
- 选择输入价格序列
Kama 是基于价格的时间序列计算得出的。“价格”可以有多种定义方式(例如收盘价、典型价格或其他衍生序列)。你选择的输入必须与你希望复现的实现方式一致。
令 P[t] 表示在时间 t 的选定价格。
- 设置回溯窗口和平滑边界
典型的 Kama 使用以下参数:
- 回溯长度:N(用于判断效率的周期数)
- 快速平滑设置:通常以较小的“快速”周期或常数表示
- 慢速平滑设置:通常以较大的“慢速”周期或常数表示
在许多实现中,平滑边界会被转换为两个常数:
- 由快速和慢速周期推导出的 SC_fast 和 SC_slow
具体的映射方式取决于实现方式。一种常见方法使用指数平滑风格的常数形式:
- SC_fast = 2 / (fastPeriod + 1)
- SC_slow = 2 / (slowPeriod + 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,或需特别处理以避免除零错误。你应该复制所用来源中的相同规则。
- 将 ER 转换为动态平滑常数
然后使用 ER 和平滑边界计算变量平滑常数 SC[t]。一种常见结构为:
- SC[t] = (ER × (SC_fast − SC_slow) + SC_slow)^2
指数(通常为 2)是常用公式的一部分;如果你的实现使用不同的指数,则必须使用相同的指数。
- 递归更新 Kama
最后,Kama 的更新公式为:
- Kama[t] = Kama[t−1] + SC[t] × (P[t] − Kama[t−1])
这种形式使 Kama 以取决于 SC[t] 的幅度“向”当前价格拉动。SC 越大,调整越快;SC 越小,调整越慢。
- 初始化
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 更平滑。
限制与风险
-
参数不匹配
Kama 依赖于 N、快/慢设置以及指数和边缘情况(如除零)的处理规则。如果你复制了公式但未从你的指标中复制确切的参数映射,你将得到不同的数值结果。 -
输入价格定义
不同平台对“价格”的定义不同。如果一个使用收盘价,另一个使用衍生价格(例如高低收均价),则整个输出序列都会改变。