Sprint / S1 Mekanika Return / P2.01

S1 wajib

Return aritmetika vs log-return

Dua cara menghitung return, dua tujuan agregasi berbeda. Memilih salah bukan soal selera — ia menentukan apakah angka yang kamu laporkan masuk akal secara ekonomi.

Konsep inti

Return sederhana (aritmetika) dari harga $P_{t-1}$ ke $P_t$ adalah

$$r_t = \frac{P_t}{P_{t-1}} - 1$$
(1)

sedangkan log-return adalah

$$\ell_t = \ln(1 + r_t) = \ln P_t - \ln P_{t-1}$$
(2)

Aturan pemakaiannya tegas:

$$r_p = \sum_{i=1}^{N} w_i\, r_i$$
(3)
$$1 + R = \prod_{t=1}^{T} (1 + r_t) \quad\Longleftrightarrow\quad R = \exp\!\Big(\textstyle\sum_t \ell_t\Big) - 1$$
(4)

Konsekuensinya: return aritmetika rata-rata selalu ≥ return geometrik rata-rata, dan selisihnya kira-kira setengah varians — inilah volatility drag:

$$\underbrace{\bar r_{\text{arith}} - \bar r_{\text{geo}}}_{\text{volatility drag}} \;\approx\; \tfrac{1}{2}\,\sigma^2$$
(5)

Lihat langsung di data

Grafik di bawah menunjukkan akumulasi nilai $1 pada SPY (volatilitas tinggi) dan portofolio 60/40 (volatilitas lebih rendah). Jalur yang lebih berguncang membayar drag lebih besar.

0.901.121.341.551.771.99 0.009.6719.329.038.748.358.0 nilai $1 bulan SPY (vol tinggi) · x=0.00, y=1.03SPY (vol tinggi) · x=3.00, y=1.02SPY (vol tinggi) · x=6.00, y=1.09SPY (vol tinggi) · x=9.00, y=1.18SPY (vol tinggi) · x=12.0, y=1.12SPY (vol tinggi) · x=15.0, y=1.16SPY (vol tinggi) · x=18.0, y=1.33SPY (vol tinggi) · x=21.0, y=1.39SPY (vol tinggi) · x=24.0, y=1.46SPY (vol tinggi) · x=27.0, y=1.62SPY (vol tinggi) · x=30.0, y=1.75SPY (vol tinggi) · x=33.0, y=1.77SPY (vol tinggi) · x=36.0, y=1.70SPY (vol tinggi) · x=39.0, y=1.61SPY (vol tinggi) · x=42.0, y=1.55SPY (vol tinggi) · x=45.0, y=1.61SPY (vol tinggi) · x=48.0, y=1.57SPY (vol tinggi) · x=51.0, y=1.66SPY (vol tinggi) · x=54.0, y=1.80SPY (vol tinggi) · x=57.0, y=1.83SPY (vol tinggi) · x=58.0, y=1.91Portofolio 60/40 (vol rendah) · x=0.00, y=1.02Portofolio 60/40 (vol rendah) · x=3.00, y=1.03Portofolio 60/40 (vol rendah) · x=6.00, y=1.10Portofolio 60/40 (vol rendah) · x=9.00, y=1.14Portofolio 60/40 (vol rendah) · x=12.0, y=1.13Portofolio 60/40 (vol rendah) · x=15.0, y=1.18Portofolio 60/40 (vol rendah) · x=18.0, y=1.29Portofolio 60/40 (vol rendah) · x=21.0, y=1.32Portofolio 60/40 (vol rendah) · x=24.0, y=1.34Portofolio 60/40 (vol rendah) · x=27.0, y=1.42Portofolio 60/40 (vol rendah) · x=30.0, y=1.50Portofolio 60/40 (vol rendah) · x=33.0, y=1.51Portofolio 60/40 (vol rendah) · x=36.0, y=1.46Portofolio 60/40 (vol rendah) · x=39.0, y=1.37Portofolio 60/40 (vol rendah) · x=42.0, y=1.33Portofolio 60/40 (vol rendah) · x=45.0, y=1.34Portofolio 60/40 (vol rendah) · x=48.0, y=1.32Portofolio 60/40 (vol rendah) · x=51.0, y=1.38Portofolio 60/40 (vol rendah) · x=54.0, y=1.43Portofolio 60/40 (vol rendah) · x=57.0, y=1.45Portofolio 60/40 (vol rendah) · x=58.0, y=1.51
SPY (vol tinggi)Portofolio 60/40 (vol rendah)
Akumulasi nilai $1 dari return bulanan riil (data Fama-French). Kurva digambar ulang saat kamu menggulir ke sini.

Widget interaktif di bawah menghitung rata-rata aritmetika, geometrik, dan drag dari data yang sama. Geser bobot dan lihat selisih itu berubah:

Kalkulator Return — Aritmetika vs Log

Data bulanan riil, 59 bulan. Bandingkan agregasi cross-sectional (aritmetika) vs agregasi waktu (geometrik/log).

0.60
MetrikSPYIEFPortofolio
Return aritmetika rata-rata/bln
Return geometrik/bln (chaining)
Selisih (aritmetika − geometrik)

— selisih itu ≈ ½·σ² (volatility drag), dihitung di sini, bukan dikutip.

Sumber data: yfinance (Yahoo Finance), auto_adjust=True, resample ME. Snapshot SHA256 awal: c3788c9915c908ef. Rentang: 2019-02 → 2023-12.

Jebakan: menjumlahkan return aritmetika bulanan lalu menganggapnya return tahunan. Pada data di atas, $12 \times \bar r$ (aritmetika) melebihi return geometrik tahunan yang sebenarnya — semakin besar volatilitas, semakin besar selisihnya. Pelaporan kinerja multi-periode wajib memakai chaining geometrik; memakai jumlah aritmetika menggelembungkan angka yang kamu klaim.

Replikasi di Python

Semua angka di atas bisa kamu reproduksi. Salin kode ini (tombol copy di kanan atas blok) dan jalankan:

python · replikasi P2.01
import numpy as npimport pandas as pd class=class="tok-s">"tok-c"># r = return bulanan sederhana (aritmetika)r = pd.Series([0.012, -0.008, 0.021, 0.004]) class=class="tok-s">"tok-c"># 1) Return geometrik kumulatif (chaining lintas waktu)R_geo = (1 + r).prod() - 1 class=class="tok-s">"tok-c"># 2) Ekivalen via penjumlahan log-returnR_log = np.exp(np.log1p(r).sum()) - 1assert abs(R_geo - R_log) < 1e-12 class=class="tok-s">"tok-c"># 3) Volatility drag: rata-rata aritmetika >= geometrikam  = r.mean()                 class=class="tok-s">"tok-c"># aritmetika / bulangm  = (1 + r).prod()**(1/len(r)) - 1drag = am - gm                 class=class="tok-s">"tok-c"># ~ 0.5 * var(r)print(fclass="tok-s">"aritmetika={am:.4%}  geometrik={gm:.4%}  drag={drag:.4%}")print(fclass="tok-s">"0.5*var    ={0.5*r.var(ddof=1):.4%}  (aproksimasi drag)")

Validasi yang terlihat

Perhitungan chaining dianggap benar hanya bila produk geometrik cocok dengan penjumlahan log-return hingga toleransi mesin. Validator sengaja menyertakan satu input yang dibuat gagal agar kamu melihat bentuk kegagalannya:

Uji pemahaman

1. Kamu punya return bulanan 12 aset dan ingin return portofolio bulan ini. Operasi yang benar?

2. Return kumulatif setahun dari return bulanan dihitung dengan...

3. Selisih antara rata-rata return aritmetika dan geometrik kira-kira sama dengan...

Latihan

ExerciseHitung return geometrik bulanan SPY

Dengan data return bulanan SPY yang sama, hitung return geometrik rata-rata per bulan (bukan aritmetika). Masukkan jawabanmu dalam desimal.

Starter code (salin ke editor Python-mu):

Lihat solusi
r = returns_spy_bulanan  # dari data
T = len(r)
gm = (1 + r).prod()**(1/T) - 1   # return geometrik per bulan
print(gm)  # ~ 0.00697

💡 Gunakan (1+r).prod()**(1/T) - 1, bukan r.mean(). Bandingkan dengan angka 'Portofolio' di widget.

Status

wajib Unit ini prasyarat untuk P2.02 (geometric chaining) dan P2.10 (validasi rekonsiliasi). Selesaikan validasi di atas sebelum lanjut.