Rata-Rata Bergerak Berbobot Eksponensial
Terapkan penghalusan eksponensial agar nilai terbaru memiliki bobot lebih besar dengan ewm(span=), teknik standar dalam analisis keuangan.
Rata-Rata Bergerak Berbobot Eksponensial adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Masalah dengan Rata-Rata Bergerak Sederhana
Rata-rata bergerak sederhana memperlakukan semua n observasi dalam jendela secara setara — harga dari 30 hari lalu berkontribusi sama besar dengan harga kemarin. Namun, untuk memprediksi nilai jangka pendek, observasi terkini lebih informatif daripada observasi lama. Rata-Rata Bergerak Berbobot Eksponensial (EWMA) mengatasi hal ini dengan memberikan bobot yang menurun secara eksponensial pada observasi lama: nilai kemarin memiliki bobot terbesar, nilai sehari sebelumnya memiliki bobot sedikit lebih kecil, dan seterusnya hingga ke awal deret.
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))Cara Kerja Pembobotan EWMA
EWMA menghitung setiap nilai sebagai kombinasi berbobot dari observasi saat ini dan EWMA sebelumnya: EWM_t = alpha * x_t + (1 - alpha) * EWM_{t-1}. Alpha (faktor penghalusan) menentukan seberapa cepat bobot berkurang — alpha besar (mendekati 1) merespons perubahan terkini dengan cepat (lebih sedikit penghalusan), sedangkan alpha kecil (mendekati 0) merespons dengan lambat (lebih banyak penghalusan). Bobot tersebut membentuk deret geometri: nilai terkini memiliki bobot alpha, nilai sebelumnya memiliki bobot alpha*(1-alpha), dan seterusnya.
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)')Metode ewm() dan Parameter span
Pandas menerapkan EWMA melalui Series.ewm(). Parameter yang paling intuitif adalah span, yang sebanding dengan jendela rata-rata bergerak sederhana: alpha = 2 / (span + 1). Span sebesar 10 kira-kira setara dengan SMA 10 periode, tetapi dengan bobot yang menurun secara eksponensial, bukan bobot yang sama. Gunakan ewm(span=n).mean() untuk memperoleh EWMA, dan ewm(span=n).std() untuk volatilitas berbobot eksponensial.
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))Parameter halflife
Parameter halflife menentukan jumlah periode yang diperlukan agar bobot berkurang setengahnya. Jika halflife=5, nilai dari 5 periode lalu memiliki setengah bobot nilai saat ini. Hubungannya adalah: alpha = 1 - exp(log(0.5) / halflife). Halflife sering kali lebih intuitif daripada span atau alpha karena secara langsung menyatakan 'memori' rata-rata dalam istilah bisnis — misalnya, 'harga dari 2 minggu lalu seharusnya memiliki pengaruh setengah dari harga hari ini'.
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))Parameter alpha Secara Langsung
Anda juga dapat menetapkan faktor penghalusan secara langsung dengan ewm(alpha=). Alpha harus berada di antara 0 dan 1 (tidak termasuk keduanya). Alpha tinggi seperti 0.8 menghasilkan penghalusan yang sangat sedikit — EWMA mengikuti sinyal mentah dengan dekat. Alpha rendah seperti 0.1 menghasilkan penghalusan yang kuat — EWMA berubah secara perlahan dan tertinggal dari perubahan mendadak. Pemilihan alpha yang tepat bergantung pada keseimbangan antara responsivitas (mendeteksi perubahan tren nyata dengan cepat) dan stabilitas (mengabaikan derau acak).
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 untuk Volatilitas: ewm().std()
ewm(span=).std() menghitung deviasi standar berbobot eksponensial. Ini merupakan dasar dari model volatilitas EWMA yang digunakan dalam manajemen risiko keuangan (juga dikenal sebagai model RiskMetrics dengan faktor peluruhan lambda=0.94). Volatilitas berbobot eksponensial merespons lonjakan volatilitas lebih cepat daripada std bergulir sederhana karena memberikan bobot lebih besar pada observasi dengan varians tinggi yang terkini.
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: Menggabungkan Dua EWMA
MACD (Moving Average Convergence Divergence) adalah indikator keuangan klasik yang dibangun dari dua EWMA. MACD merupakan selisih antara EWMA cepat (rentang pendek) dan EWMA lambat (rentang panjang) dari harga. Ketika MACD melintasi nol dari bawah, hal ini menandakan kemungkinan momentum naik (sinyal beli); jika melintasi dari atas, hal ini menandakan momentum turun. MACD adalah contoh sempurna penerapan dua EWMA untuk menghasilkan indikator turunan.
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 dengan Halflife Berbasis Waktu
Pandas 1.1+ mendukung penetapan halflife, span, dan com sebagai offset waktu (misalnya halflife='7D') saat bekerja dengan DatetimeIndex. Ini memungkinkan penerapan EWMA yang tepat pada deret waktu yang intervalnya tidak seragam — misalnya, jika Anda memiliki data per jam dengan jeda pada akhir pekan, halflife '7D' berarti bobot benar-benar berkurang setengah setiap 7 hari kalender, terlepas dari jumlah baris dalam periode tersebut.
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))Memilih antara EWMA, Rolling, dan Expanding
Ringkasan kapan masing-masing digunakan:
- Rolling(n).mean(): semua n observasi terkini memiliki bobot yang sama — cocok untuk metrik sederhana yang mengikuti periode sebelumnya dan ketika semua periode terkini sama pentingnya.
- ewm(span=n).mean(): berbobot eksponensial — paling sesuai jika Anda menginginkan penghalusan yang lebih responsif terhadap perubahan terkini, dan umum digunakan dalam keuangan serta pemrosesan sinyal.
- expanding().mean(): seluruh data historis memiliki bobot yang sama — paling sesuai untuk statistik YTD atau sepanjang waktu ketika data lama tidak boleh dilupakan.
Memvisualisasikan EWMA dan SMA
Menampilkan EWMA dan SMA secara bersamaan pada grafik deret waktu membuat perbedaan responsivitas keduanya terlihat jelas. EWMA bereaksi lebih cepat terhadap perubahan tingkat yang tiba-tiba karena tidak "melupakan" semua pengamatan sebelumnya — EWMA dengan rentang pendek akan berbelok lebih cepat daripada SMA dengan jendela nominal yang sama. Hal ini membuat EWMA lebih sesuai untuk aplikasi peramalan ketika menangkap arah tren dengan cepat lebih penting daripada pengurangan derau secara maksimal.
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 dalam Aplikasi Bisnis
Di luar bidang keuangan, EWMA banyak digunakan dalam analitik produk dan operasional: penghalusan nilai umur pelanggan (perilaku terbaru memprediksi pengeluaran mendatang dengan lebih baik daripada perilaku lama), pemantauan latensi server (metrik latensi yang dihaluskan secara eksponensial mendeteksi alarm palsu lebih cepat daripada rata-rata bergerak), dan peramalan permintaan persediaan (penjualan dalam beberapa minggu terakhir harus lebih berbobot daripada data dari enam bulan lalu). Prinsip umumnya adalah: di mana pun keterkinian penting, EWMA mengungguli perataan sederhana.
Pemeriksaan Singkat
Uji pemahaman Anda tentang rata-rata bergerak berbobot eksponensial dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini, Anda mempelajari bahwa: ewm(span=) menerapkan bobot yang meluruh secara eksponensial sehingga pengamatan terbaru lebih berpengaruh, alpha mengendalikan responsivitas (tinggi = cepat, rendah = halus), dan parameter halflife menyatakan memori dalam istilah yang bermakna bagi bisnis. EWMA mengungguli SMA ketika pendeteksian pembalikan tren secara cepat menjadi hal penting. Selanjutnya, kita akan mempelajari penghitungan peringkat dan persentil dalam kelompok menggunakan groupby().rank() dan pd.qcut.
Belajar Python dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Rata-Rata Bergerak Berbobot Eksponensial” gratis?
Ya — teks lengkap “Rata-Rata Bergerak Berbobot Eksponensial” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Rata-Rata Bergerak Berbobot Eksponensial”?
Terapkan penghalusan eksponensial agar nilai terbaru memiliki bobot lebih besar dengan ewm(span=), teknik standar dalam analisis keuangan. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Rata-Rata Bergerak Berbobot Eksponensial” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Jendela Bergulir
- Jendela Meluas
- Rata-Rata Bergerak Berbobot Eksponensial
- Peringkat dan Persentil dalam Grup