KAMA: Kaufman’s Adaptive Moving Average

Pawarison Tanyu
Algo Alchemist
Published in
2 min readJan 26, 2024

พอดีผมได้มีโอกาสไปอ่าน paper เกี่ยวกับ Kaufman’s Adaptive Moving Average (KAMA) ซึ่งใช้ในการตรวจจับการเปลี่ยนแปลงของราคาสินทรัพย์ เช่น หุ้น สินค้าโภคภัณฑ์ พันธบัตร และเงินตราต่างประเทศ

หลายๆคนน่าจะคุ้นเคยเกี่ยวกับ Simple Moving Average (SMA) และ Exponential Weight Moving Average (EWMA) ซึ่งเป็นวิธีการหาค่าเฉลี่ยเคลื่อนที่พื้นฐานที่ใช้กันทั่วไปในการ smooth ข้อมูลประเภท Time series กันอยู่เเล้ว

โดยในบทความนี้ ผมจะเล่าคร่าวๆว่ามันคืออะไร ทํางานอย่างไร เเละมีประโยชน์อย่างไร ซึ่งผมคิดว่ามันค่อนข้างน่าสนใจเเละทุกคนสามารถใช้ได้ฟรีใน Tradingview ครับ

Kaufman’s Adaptive Moving Average (KAMA)

KAMA เป็นเส้นค่าเฉลี่ยชนิดหนึ่งที่ถ่วงน้ำหนักด้วย Momentum ซึ่งเป็นวิธีการที่ซับซ้อนขึ้นไปอีกขั้นกว่า SMA หรือ EWMA อีกทั้งยังสามารถปรับตัวให้เข้ากับแนวโน้มและความผันผวนของราคาได้

KAMA จะให้น้ำหนักมากขึ้นเมื่อ Momentum ของราคาเร่งขึ้น และให้น้ำหนักน้อยลงเมื่อ Momentum ชะลอตัวลง นี่ช่วยให้ KAMA ตอบสนองต่อการเปลี่ยนแปลงของ Trend ได้เร็วขึ้น

ในขณะเดียวกัน KAMA จะลดน้ำหนักลงเมื่อความผันผวนเพิ่มขึ้น เพื่อหลีกเลี่ยงการให้น้ำหนักมากเกินไปกับค่าผิดปกติ (Outlier) ซึ่งช่วยให้ KAMA มีความ smooth ขึ้นเมื่อข้อมูลมีความผันผวนสูง (Dynamic ตาม Volatility ด้วย นั่นเองครับ)

ซึ่งโดยรวมแล้ว KAMA เป็นวิธีคำนวณค่าเฉลี่ยที่สามารถปรับตัวให้เข้ากับทั้ง Trend และ Volatility ของข้อมูลประเภท Time series ได้ดีกว่า SMA หรือ EWMA ครับ

Formula

period=10, period_fast=2, period_slow=30

1- Efficiency Ratio
Change = Abs(price - price(from 10-period))
Volatility = 10-period Rolling Sum (price - Previous price)
ER = Change / Volatility

2- Smoothing Constant
sc_fatest = 2/(period_fast + 1)
sc_slowest = 2/(period_slow + 1)
SC = (ER x (sc_fatest - sc_slowest) + sc_slowest ) ^ 2

3- KAMA
First value : close mean value over 10-period
Following values:
Current KAMA = Previous KAMA + SC x (price - Previous KAMA)
  1. Efficiency Ratio (ER) จะมีค่าระหว่าง 0 ถึง 1
  • ค่าที่ใกล้ 1 หมายถึง ราคาเปลี่ยนแปลงอย่างมีนัยสําคัญ ในขณะที่ความผันผวนในช่วงเวลา n ก่อนหน้าต่ำ
  • ค่าที่ใกล้ 0 หมายถึง ราคาเปลี่ยนแปลงเพียงเล็กน้อย เมื่อเทียบกับความผันผวนที่สูงในช่วงเวลา n ก่อนหน้า

หลังจากคํานวณ ER แล้ว ขั้นตอนต่อไปคือการคํานวณค่า Smoothing Constant ซึ่งจะใช้ในการคํานวณค่า KAMA ต่อไป

2. Smoothing Constant (SC)

ค่า period_fast และ period_slow จะถูกนํามาใช้ในส่วนนี้ ซึ่งคือค่า 2 และ 30 ครับค่าเหล่านี้คือค่า moving average แบบง่ายเท่านั้น

sc_fatest = 2/(period_fast + 1)
sc_slowest = 2/(period_slow + 1)

หลังจากคํานวณค่า sc_fatest และ sc_slowest ได้แล้ว เราก็จะนํามาแทนค่าในสูตรการคํานวณ Smoothing Constant (SC) หรือค่าคงที่สำหรับปรับเรียบนั่นเองครับ

SC = (ER x (sc_fatest - sc_slowest) + sc_slowest ) ^ 2

3. KAMA

เเละในส่วนสุดท้ายคือการนำค่าต่างๆที่เราคำนวณก่อนหน้า มาเข้าสูตรครับ

First value : close mean value over 10-period
Following values:
Current KAMA = Previous KAMA + SC x (price - Previous KAMA)
แตัวอย่าง เส้นสีเขียวคือ KAMA, เส้นสีม่วงคือ SMA

Conclusion

ทั้ง SMA หรือ EMA ล้วนเป็นรากฐานสำคัญ หรือกล่าวได้ว่าเป็นเทคนิคพื้นฐานที่ใช้ smoothing ราคา เพื่อใช้วิเคราะห์ต่อต่อไป

เเละ KAMA เพิ่มความซับซ้อนเข้าไปเพื่อปิดจุดอ่อนหลายๆอย่าง เช่น การคำนวณ ที่ Dynamic ไปตาม Volatility เเละ Momentum

อีกทั้งเรายังสามารถนำไอเดียวิธีการคิดไปปรับใช้ อย่าง efficiency ratio ไปทำ time series modeling เพราะมีค่าระหว่าง 0–1 ทำให้นำไปใช้ได้ง่าย เป็นต้นครับ

Python Implementation with ta-lib

import pandas as pd
import numpy as np
import datetime as dt

import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

from pandas_datareader import data as pdr
import yfinance as yfin

yfin.pdr_override()
datetime_end=dt.datetime.today().date()
df = pdr.get_data_yahoo('AMZN', start='2022–01–01', end=datetime_end)
df.head()

import talib

close = df['Adj Close']

kama_talib = talib.KAMA(close, timeperiod = 10)
df['kama_talib'] = kama_talib

--

--