Pandas & NumPy Academy · บทเรียน

ค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล

ใช้การทำให้เรียบแบบเอ็กซ์โพเนนเชียลเพื่อให้น้ำหนักค่าล่าสุดมากขึ้นด้วย ewm(span=) ซึ่งเป็นเทคนิคมาตรฐานในการวิเคราะห์ทางการเงิน

บทเรียน 3 จาก 413 ขั้นตอน

ค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาของค่าเฉลี่ยเคลื่อนที่แบบธรรมดา

ค่าเฉลี่ยเคลื่อนที่แบบธรรมดาจะให้น้ำหนักข้อมูลสังเกตทั้ง n ค่าในหน้าต่างเท่ากัน ดังนั้นราคาจาก 30 วันที่แล้วจึงมีผลเท่ากับราคาของเมื่อวาน แต่สำหรับการคาดการณ์ค่าในระยะใกล้ ข้อมูลสังเกตล่าสุดให้ข้อมูลที่มีประโยชน์มากกว่าข้อมูลเก่า ค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล (EWMA) แก้ปัญหานี้ด้วยการกำหนด น้ำหนักที่ลดลงแบบเอ็กซ์โพเนนเชียล ให้กับข้อมูลเก่า โดยข้อมูลของเมื่อวานมีน้ำหนักมากที่สุด ข้อมูลของวันก่อนหน้ามีน้ำหนักน้อยลงเล็กน้อย และลดลงเช่นนี้ย้อนกลับไปจนถึงจุดเริ่มต้นของอนุกรม

import pandas as pd
import numpy as np

np.random.seed(42)
prices = pd.Series(
    100 + np.cumsum(np.random.normal(0.5, 2, 30)),
    index=pd.date_range('2024-01-01', periods=30)
)

df = pd.DataFrame({'price': prices})
df['SMA_7'] = df['price'].rolling(7).mean()
df['EWM_span7'] = df['price'].ewm(span=7).mean()
print(df.tail(5).round(2))

การทำงานของการให้น้ำหนักแบบ EWMA

EWMA คำนวณแต่ละค่าจากการถ่วงน้ำหนักระหว่างข้อมูลสังเกตปัจจุบันกับ EWMA ก่อนหน้า: EWM_t = alpha * x_t + (1 - alpha) * EWM_{t-1} alpha (ปัจจัยการปรับเรียบ) จะกำหนดว่าน้ำหนักลดลงเร็วเพียงใด โดย alpha ที่สูง (ใกล้ 1) จะตอบสนองต่อการเปลี่ยนแปลงล่าสุดอย่างรวดเร็ว (ปรับเรียบน้อย) ส่วน alpha ที่ต่ำ (ใกล้ 0) จะตอบสนองช้า (ปรับเรียบมาก) น้ำหนักเหล่านี้เป็นอนุกรมเรขาคณิต โดยค่าล่าสุดมีน้ำหนัก alpha ค่าก่อนหน้ามีน้ำหนัก alpha*(1-alpha) และลดลงต่อไปตามลำดับ

import numpy as np

# Manually show EWMA weights
alpha = 0.3
n_points = 8
weights = [alpha * (1 - alpha)**i for i in range(n_points)]

print(f'Alpha = {alpha}')
print(f'Weights (most recent first):')
for i, w in enumerate(weights):
    print(f'  t-{i}: {w:.4f}')
print(f'Sum of shown weights: {sum(weights):.4f} (converges to 1.0)')

เมธอด ewm() และพารามิเตอร์ span

Pandas ใช้ Series.ewm() เพื่อสร้าง EWMA พารามิเตอร์ที่เข้าใจได้ง่ายที่สุดคือ span ซึ่งมีความหมายคล้ายหน้าต่างค่าเฉลี่ยเคลื่อนที่แบบธรรมดา: alpha = 2 / (span + 1) span เท่ากับ 10 จะใกล้เคียงกับ SMA 10 ช่วง แต่ใช้น้ำหนักที่ลดลงแบบเอ็กซ์โพเนนเชียลแทนการให้น้ำหนักเท่ากัน ใช้ ewm(span=n).mean() เพื่อรับค่า EWMA และใช้ ewm(span=n).std() เพื่อคำนวณความผันผวนแบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล

import pandas as pd
import numpy as np

np.random.seed(0)
data = pd.Series(
    np.random.normal(100, 10, 50),
    index=pd.date_range('2024-01-01', periods=50)
)

df = pd.DataFrame({'value': data})
df['EWM_3'] = df['value'].ewm(span=3).mean()
df['EWM_10'] = df['value'].ewm(span=10).mean()
df['EWM_20'] = df['value'].ewm(span=20).mean()

print('Alpha values:')
for span in [3, 10, 20]:
    alpha = 2 / (span + 1)
    print(f'  span={span} → alpha={alpha:.3f}')
print(df.tail(5).round(2))

พารามิเตอร์ halflife

พารามิเตอร์ halflife กำหนดจำนวนช่วงเวลาที่ต้องใช้กว่าน้ำหนักจะลดลงครึ่งหนึ่ง หาก halflife=5 ค่าจาก 5 ช่วงเวลาก่อนจะมีน้ำหนักครึ่งหนึ่งของค่าปัจจุบัน ความสัมพันธ์คือ alpha = 1 - exp(log(0.5) / halflife) Halflife มักเข้าใจได้ง่ายกว่า span หรือ alpha เพราะแสดง “ความจำ” ของค่าเฉลี่ยในรูปแบบที่สื่อความหมายทางธุรกิจโดยตรง เช่น “ราคาจาก 2 สัปดาห์ก่อนควรมีอิทธิพลเพียงครึ่งหนึ่งของราคาวันนี้”

import pandas as pd
import numpy as np

np.random.seed(5)
prices = pd.Series(
    100 + np.cumsum(np.random.normal(0, 2, 30)),
    index=pd.date_range('2024-01-01', periods=30)
)

df = pd.DataFrame({'price': prices})
# halflife=5: weight halves every 5 days
df['EWM_hl5'] = df['price'].ewm(halflife=5).mean()
# halflife=14: weight halves every 14 days (longer memory)
df['EWM_hl14'] = df['price'].ewm(halflife=14).mean()

print(df.tail(5).round(2))

กำหนดพารามิเตอร์ alpha โดยตรง

คุณสามารถกำหนดปัจจัยการปรับเรียบโดยตรงด้วย ewm(alpha=) โดย Alpha ต้องมีค่ามากกว่า 0 และน้อยกว่า 1 ค่า alpha สูง เช่น 0.8 จะปรับเรียบน้อยมาก ทำให้ EWMA ติดตามสัญญาณดิบได้ใกล้ชิด ส่วน alpha ต่ำ เช่น 0.1 จะปรับเรียบมาก ทำให้ EWMA เปลี่ยนแปลงช้าและตามหลังการเปลี่ยนแปลงฉับพลัน การเลือก alpha ที่เหมาะสมขึ้นอยู่กับการแลกเปลี่ยนระหว่าง การตอบสนองไว (ตรวจจับการเปลี่ยนแปลงแนวโน้มจริงได้รวดเร็ว) กับ ความเสถียร (ละเว้นสัญญาณรบกวนแบบสุ่ม)

import pandas as pd
import numpy as np

np.random.seed(3)
data = pd.Series(
    [100]*20 + [120]*20,  # sudden level shift at row 20
    dtype=float
) + np.random.normal(0, 2, 40)

df = pd.DataFrame({'signal': data})
df['alpha_0.1'] = df['signal'].ewm(alpha=0.1).mean()  # slow
df['alpha_0.5'] = df['signal'].ewm(alpha=0.5).mean()  # medium
df['alpha_0.9'] = df['signal'].ewm(alpha=0.9).mean()  # fast

print('After the level shift (rows 20-25):')
print(df.iloc[18:26].round(2))

EWMA สำหรับความผันผวน: ewm().std()

ewm(span=).std() จะคำนวณ ส่วนเบี่ยงเบนมาตรฐานแบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล ซึ่งเป็นพื้นฐานของ แบบจำลองความผันผวน EWMA ที่ใช้ในการจัดการความเสี่ยงทางการเงิน (หรือที่เรียกว่าแบบจำลอง RiskMetrics ซึ่งมีปัจจัยการลดน้ำหนัก lambda=0.94) ความผันผวนแบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียลตอบสนองต่อการพุ่งขึ้นของความผันผวนได้เร็วกว่าค่าเบี่ยงเบนมาตรฐานแบบเลื่อน เนื่องจากให้น้ำหนักกับข้อมูลสังเกตที่มีความแปรปรวนสูงและเป็นข้อมูลล่าสุดมากกว่า

import pandas as pd
import numpy as np

np.random.seed(42)
# Simulate returns: quiet period then volatile period
returns = pd.Series(
    np.concatenate([
        np.random.normal(0, 0.01, 60),
        np.random.normal(0, 0.04, 60)  # 4x more volatile
    ]),
    index=pd.date_range('2024-01-01', periods=120)
)

df = pd.DataFrame({'returns': returns})
df['rolling_vol'] = df['returns'].rolling(20).std()
df['ewm_vol'] = df['returns'].ewm(span=20).std()

print('Volatility comparison (transition at row 60):')
print(df.iloc[58:65].round(5))

MACD: การรวม EWMA สองชุด

MACD (Moving Average Convergence Divergence) เป็นตัวชี้วัดทางการเงินแบบดั้งเดิมที่สร้างจาก EWMA สองชุด โดยเป็นผลต่างระหว่าง EWMA แบบเร็ว (ช่วงสั้น) กับ EWMA แบบช้า (ช่วงยาว) ของราคา เมื่อ MACD ตัดผ่านศูนย์จากด้านล่าง จะเป็นสัญญาณว่าอาจมีแรงส่งขาขึ้น (สัญญาณซื้อ) ส่วนการตัดผ่านจากด้านบนจะเป็นสัญญาณของแรงส่งขาลง MACD เป็นตัวอย่างที่ดีของการใช้ EWMA สองชุดเพื่อสร้างตัวชี้วัดต่อยอด

import pandas as pd
import numpy as np

np.random.seed(7)
prices = pd.Series(
    100 + np.cumsum(np.random.normal(0.3, 2, 100)),
    index=pd.date_range('2024-01-01', periods=100)
)

df = pd.DataFrame({'price': prices})
df['EMA_12'] = df['price'].ewm(span=12).mean()  # fast
df['EMA_26'] = df['price'].ewm(span=26).mean()  # slow
df['MACD'] = df['EMA_12'] - df['EMA_26']
df['Signal'] = df['MACD'].ewm(span=9).mean()   # signal line

print('MACD values (last 8 rows):')
print(df[['price', 'MACD', 'Signal']].tail(8).round(2))

EWMA กับ Halflife ตามเวลา

Pandas 1.1 ขึ้นไปรองรับการระบุ halflife, span และ com เป็นส่วนต่างของเวลา (เช่น halflife='7D') เมื่อทำงานกับ DatetimeIndex วิธีนี้ทำให้ใช้ EWMA กับอนุกรมเวลาที่ช่วงเวลาไม่สม่ำเสมอได้อย่างถูกต้อง เช่น หากคุณมีข้อมูลรายชั่วโมงที่ขาดช่วงในวันหยุดสุดสัปดาห์ halflife เท่ากับ '7D' จะหมายความว่าน้ำหนักลดลงครึ่งหนึ่งทุก 7 วันตามปฏิทินจริง โดยไม่ขึ้นกับจำนวนแถวในช่วงเวลานั้น

import pandas as pd
import numpy as np

np.random.seed(0)
# Business-day data (no weekends)
biz_dates = pd.bdate_range('2024-01-01', periods=20)
prices = pd.Series(100 + np.cumsum(np.random.randn(20)), index=biz_dates)

# halflife as a time offset (7 calendar days)
ewm_7d = prices.ewm(halflife='7D', times=biz_dates).mean()
# halflife as row count (7 rows)
ewm_7rows = prices.ewm(halflife=7).mean()

df = pd.DataFrame({'price': prices, 'hl_7D': ewm_7d, 'hl_7rows': ewm_7rows})
print(df.round(2))

การเลือกระหว่าง EWMA, Rolling และ Expanding

สรุปว่าแต่ละวิธีเหมาะใช้เมื่อใด:

  • Rolling(n).mean(): ข้อมูลสังเกตล่าสุด n ค่ามีน้ำหนักเท่ากัน เหมาะกับตัวชี้วัดย้อนหลังแบบง่าย และกรณีที่ทุกช่วงเวลาล่าสุดมีความสำคัญเท่ากัน
  • ewm(span=n).mean(): ใช้น้ำหนักแบบเอ็กซ์โพเนนเชียล เหมาะที่สุดเมื่อต้องการการปรับเรียบที่ตอบสนองต่อการเปลี่ยนแปลงล่าสุดมากกว่า และมักใช้ในด้านการเงินกับการประมวลผลสัญญาณ
  • expanding().mean(): ข้อมูลประวัติทั้งหมดมีน้ำหนักเท่ากัน เหมาะที่สุดสำหรับ YTD หรือสถิติตลอดช่วงเวลาที่ไม่สามารถยอมให้ลืมข้อมูลเก่าได้

การแสดงภาพ EWMA เทียบกับ SMA

การวาด EWMA และ SMA ลงบนกราฟอนุกรมเวลาพร้อมกัน ทำให้เห็นความแตกต่างด้านการตอบสนองได้อย่างชัดเจน EWMA ตอบสนองต่อการเปลี่ยนแปลงระดับอย่างฉับพลันได้เร็วกว่า เพราะไม่ได้ “ลืม” ค่าที่สังเกตได้ก่อนหน้านี้ทั้งหมด — EWMA ที่มีช่วงสั้นจะปรับทิศทางได้เร็วกว่า SMA ที่มีหน้าต่างตามชื่อเท่ากัน จึงทำให้ EWMA เหมาะกับการประยุกต์ใช้ด้านการพยากรณ์ ซึ่งการจับทิศทางแนวโน้มให้ได้อย่างรวดเร็วมีคุณค่ามากกว่าการลดสัญญาณรบกวนให้ได้สูงสุด

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
prices = pd.Series(
    np.concatenate([
        100 + np.cumsum(np.random.normal(0.3, 1.5, 50)),
        130 + np.cumsum(np.random.normal(-0.3, 1.5, 50))
    ]),
    index=pd.date_range('2024-01-01', periods=100)
)

df = pd.DataFrame({'price': prices})
df['SMA_10'] = df['price'].rolling(10).mean()
df['EWMA_10'] = df['price'].ewm(span=10).mean()

df.plot(figsize=(12, 5), title='SMA vs EWMA — EWMA reacts faster to trend reversals')
plt.ylabel('Price')
plt.axvline(x=df.index[50], color='red', linestyle='--', label='Trend change')
plt.legend()
plt.show()

EWMA ในการประยุกต์ใช้ทางธุรกิจ

นอกเหนือจากการเงินแล้ว ยังมีการใช้ EWMA อย่างแพร่หลายในด้านการวิเคราะห์ผลิตภัณฑ์และการดำเนินงาน เช่น การปรับเรียบมูลค่าตลอดอายุการใช้งานของลูกค้า (พฤติกรรมล่าสุดช่วยทำนายการใช้จ่ายในอนาคตได้ดีกว่าพฤติกรรมในอดีต) การติดตามเวลาแฝงของเซิร์ฟเวอร์ (ตัวชี้วัดเวลาแฝงที่ปรับเรียบแบบเอ็กซ์โพเนนเชียลจะตรวจจับสัญญาณเตือนที่ผิดพลาดได้เร็วกว่าค่าเฉลี่ยแบบเคลื่อนที่) และการพยากรณ์ความต้องการสินค้าคงคลัง (ยอดขายในช่วงไม่กี่สัปดาห์ล่าสุดควรมีน้ำหนักมากกว่าข้อมูลเมื่อหกเดือนก่อน) หลักการทั่วไปคือ ทุกที่ที่ความใหม่ของข้อมูลมีความสำคัญ EWMA จะให้ผลดีกว่าการหาค่าเฉลี่ยแบบง่าย

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียลจากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า ewm(span=) ใช้น้ำหนักที่ลดลงแบบเอ็กซ์โพเนนเชียลเพื่อให้ค่าที่สังเกตได้ล่าสุดมีความสำคัญมากกว่า พารามิเตอร์ alpha ควบคุมการตอบสนอง (ค่าสูง = เร็ว ค่าต่ำ = เรียบ) และพารามิเตอร์ halflife แสดงระยะความจำในรูปแบบที่มีความหมายทางธุรกิจ EWMA ให้ผลดีกว่า SMA เมื่อการตรวจจับการกลับทิศทางของแนวโน้มอย่างรวดเร็วเป็นสิ่งสำคัญ ต่อไป เราจะสำรวจการคำนวณอันดับและเปอร์เซ็นไทล์ภายในกลุ่มโดยใช้ groupby().rank() และ pd.qcut

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “ค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล”

ใช้การทำให้เรียบแบบเอ็กซ์โพเนนเชียลเพื่อให้น้ำหนักค่าล่าสุดมากขึ้นด้วย ewm(span=) ซึ่งเป็นเทคนิคมาตรฐานในการวิเคราะห์ทางการเงิน คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. หน้าต่างเลื่อน
  2. หน้าต่างสะสม
  3. ค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักเอ็กซ์โพเนนเชียล
  4. อันดับและเปอร์เซ็นไทล์ภายในกลุ่ม
← กลับไปที่ Pandas & NumPy Academy