Strasmore Research
Edukasi Matt ConnorOleh Matt Connor · Diperbarui 2026-08-05

Cara Menghitung Implied Volatility

Implied volatility tidak memiliki solusi closed-form. Pelajari cara solver menentukannya dari harga opsi melalui iterasi, kode Python, dan jebakan yang perlu dihindari.

Implied volatility dihitung melalui iterasi, bukan dengan rumus. Tidak ada ekspresi bentuk tertutup yang dapat mengonversi kembali harga pasar opsi menjadi angka volatilitas. Karena itu, solver menebak suatu volatilitas, menghitung harga opsi dengan Black-Scholes, membandingkan harga model tersebut dengan kuotasi, lalu mengulangi proses hingga keduanya sesuai hingga ke sen terdekat. Berikut seluruh metodenya: fungsi pricing, loop pencarian dalam Python standard library, serta alasan dua vendor dapat menerbitkan angka yang berbeda untuk kontrak yang sama.

Mengapa implied volatility tidak memiliki rumus closed-form

Black-Scholes bekerja dalam satu arah. Masukkan spot price, strike price, waktu hingga jatuh tempo, interest rate, dan volatility, lalu model menghasilkan harga teoretis. Lima dari enam besaran tersebut dapat diamati. Volatility tidak. Volatility merupakan asumsi mengenai seberapa jauh harga saham akan bergerak antara saat ini dan jatuh tempo.

Trader membalik persoalan tersebut. Harga sudah terlihat di layar, sedangkan volatility menjadi variabel yang tidak diketahui. Implied volatility adalah input volatility yang membuat harga Black-Scholes sama dengan harga pasar opsi. Sigma, yaitu istilah volatility, berada di dalam fungsi distribusi normal sebanyak dua kali, masing-masing pada d1 dan d2. Tidak ada transformasi aljabar yang dapat mengisolasinya. Aljabar berhenti di titik itu. Pencarian numerik kemudian mengambil alih. Apa yang diukur implied volatility membahas interpretasinya; halaman ini membahas mekanismenya.

Dua sifat model membuat pencarian tersebut mudah. Harga model call option selalu naik ketika volatility naik, tanpa pengecualian, dan perubahannya berlangsung mulus. Besaran yang hanya bergerak naik dapat ditemukan dengan mempersempit bracket di sekelilingnya.

Solver berjalan satu kali untuk setiap kontrak

Outputnya adalah satu angka untuk setiap kontrak, bukan satu angka untuk setiap saham. Kontrak atas saham yang sama dalam jendela jatuh tempo yang sama dapat menghasilkan jawaban yang berbeda. Berikut setiap opsi Apple (AAPL) dengan sisa waktu 20 hingga 45 hari yang diperdagangkan pada 30 Juni 2026, dikelompokkan berdasarkan strike sebagai proporsi dari harga saham:

QuerySatu penyelesaian per kontrak: implied volatility AAPL berdasarkan zona strike, 30 Juni 2026
SQL tepat di balik setiap angka
WITH toFloat64(strike_price) / toFloat64(underlying_close) AS moneyness
SELECT multiIf(moneyness < 0.90, '0.80-0.90',
               moneyness < 0.95, '0.90-0.95',
               moneyness < 1.00, '0.95-1.00',
               moneyness < 1.05, '1.00-1.05',
               moneyness < 1.10, '1.05-1.10',
                                 '1.10-1.20') AS strike_vs_spot,
       round(100 * avg(toFloat64(implied_volatility)), 1) AS implied_vol_pct,
       count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
  AND date = toDate('2026-06-30')
  AND days_to_expiry BETWEEN 20 AND 45
  AND iv_converged = 1
  AND volume > 0
  AND moneyness BETWEEN 0.80 AND 1.20
GROUP BY strike_vs_spot
ORDER BY min(moneyness)
Run this yourself

Saat membaca ladder strike dari bawah ke atas, zona 0.80-0.90 menghasilkan 35.5%, zona 0.95-1.00 menghasilkan 28.1%, dan zona 1.10-1.20 menghasilkan 27.3%. Satu perusahaan, satu sesi, 6 jawaban. Lekukan pada kurva itu memiliki nama, yaitu volatility skew, dan satu volatilitas untuk setiap saham tidak dapat menggambarkannya.

Harga Black-Scholes yang harus dicocokkan solver

S adalah harga saham, K adalah strike, T adalah waktu hingga jatuh tempo dalam tahun, r adalah risk-free rate, dan N() adalah distribusi kumulatif normal standar, yaitu probabilitas bahwa hasil pengambilan acak dari distribusi normal standar berada di bawah titik tertentu. Python menyediakan fungsi tersebut dalam math.erf, sehingga interpreter saja sudah memadai.

apt-get update && apt-get install -y python3

Tambahkan sudo di depan kedua perintah tersebut pada mesin yang tidak Anda akses sebagai root. Kemudian simpan kode berikut sebagai iv.py:

import math

def norm_cdf(x):
    return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))

def bs_call(S, K, T, r, sigma):
    if T <= 0.0 or sigma <= 0.0:
        return max(S - K, 0.0)
    d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
    d2 = d1 - sigma * math.sqrt(T)
    return S * norm_cdf(d1) - K * math.exp(-r * T) * norm_cdf(d2)

Itulah forward model secara lengkap. Masukkan nilai volatilitas, lalu dapatkan harga.

Cara menghitung implied volatility, langkah demi langkah

Bisection adalah metode pertama yang perlu dipelajari. Metode ini tidak dapat divergen dan tidak memerlukan kalkulus.

  1. Batasi jawaban antara 0,01 (1% per tahun) dan 5,0 (500%). Setiap opsi yang diperdagangkan berada dalam kisaran tersebut.
  2. Hitung harga opsi pada titik tengah kisaran.
  3. Jika harga model berada di atas kuotasi pasar, estimasi terlalu tinggi: turunkan batas atas kisaran ke titik tengah. Jika berada di bawah kuotasi, naikkan batas bawah.
  4. Berhenti setelah harga model berada dalam selisih satu sen dari kuotasi.
def implied_vol(price, S, K, T, r, lo=0.01, hi=5.0, tol=0.01):
    for _ in range(100):
        mid = 0.5 * (lo + hi)
        diff = bs_call(S, K, T, r, mid) - price
        if abs(diff) < tol:
            return mid
        if diff > 0.0:
            hi = mid
        else:
            lo = mid
    return 0.5 * (lo + hi)

# saham $100, strike $100, tiga bulan, suku bunga 4%, $5.00 pada layar
print(round(implied_vol(5.00, 100.0, 100.0, 0.25, 0.04), 4))

Jalankan python3 iv.py. Hasilnya sekitar 0,226, yang berarti implied volatility mendekati 22,6% per tahun untuk kuotasi hipotetis tersebut. Setiap iterasi membagi dua kisaran. Kisaran selebar 4,99 yang dibagi dua sebanyak dua puluh kali menjadi lebih sempit daripada 0,00001, sehingga batas 100 iterasi tidak pernah tercapai.

Mengapa Newton-Raphson lebih cepat konvergen, dan kapan metode ini gagal

Bisection mengabaikan informasi yang sudah dimiliki model. Vega adalah perubahan harga opsi untuk setiap unit volatilitas, dan Black-Scholes menyediakannya dalam bentuk tertutup. Newton-Raphson memperlakukannya sebagai kemiringan: ukur kesalahan penetapan harga, bagi dengan vega, lalu ubah tebakan sebesar hasil tersebut.

def bs_vega(S, K, T, r, sigma):
    d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
    return S * math.sqrt(T) * math.exp(-0.5 * d1 * d1) / math.sqrt(2.0 * math.pi)

def implied_vol_newton(price, S, K, T, r, sigma=0.5):
    for _ in range(20):
        v = bs_vega(S, K, T, r, sigma)
        if v < 1e-8:
            return None          # tidak ada kemiringan yang tersisa, kembalikan perhitungan ke bisection
        step = (bs_call(S, K, T, r, sigma) - price) / v
        sigma -= step
        if sigma <= 0.0:
            return None          # langkah terlalu jauh hingga menghasilkan nilai yang tidak masuk akal
        if abs(step) < 1e-6:
            return sigma
    return None

Untuk opsi near the money, metode ini mencapai hasil dalam tiga atau empat iterasi, dibandingkan sekitar belasan iterasi dengan bisection. Sumber kegagalannya berada pada penyebut: vega menyusut ketika strike semakin jauh dari harga saham. Untuk kontrak AAPL yang sama, rata-rata vega di setiap zona ditampilkan sebagai persentase dari pembacaan at the money:

QuerySaat langkah Newton bermasalah: vega AAPL berdasarkan zona strike, 30 Juni 2026
SQL tepat di balik setiap angka
WITH toFloat64(strike_price) / toFloat64(underlying_close) AS moneyness,
     (
         SELECT avg(toFloat64(vega))
         FROM global_markets.options_greeks
         WHERE underlying_symbol = 'AAPL'
           AND date = toDate('2026-06-30')
           AND days_to_expiry BETWEEN 20 AND 45
           AND iv_converged = 1
           AND volume > 0
           AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.025
     ) AS atm_vega
SELECT multiIf(moneyness < 0.90, '0.80-0.90',
               moneyness < 0.95, '0.90-0.95',
               moneyness < 1.00, '0.95-1.00',
               moneyness < 1.05, '1.00-1.05',
               moneyness < 1.10, '1.05-1.10',
                                 '1.10-1.20') AS strike_vs_spot,
       round(100 * avg(toFloat64(vega)) / atm_vega, 1) AS vega_pct_of_atm,
       count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
  AND date = toDate('2026-06-30')
  AND days_to_expiry BETWEEN 20 AND 45
  AND iv_converged = 1
  AND volume > 0
  AND moneyness BETWEEN 0.80 AND 1.20
GROUP BY strike_vs_spot
ORDER BY min(moneyness)
Run this yourself

Zona sayap hanya memiliki sebagian kecil dari sensitivitas tersebut: 33.1% dari vega at the money di zona 0.80-0.90, dan 31.6% di zona 1.10-1.20. Membagi kesalahan penetapan harga dengan angka sekecil itu menghasilkan langkah yang sangat besar. Tebakan dapat terdorong ke bawah nol, saat model tidak lagi memberikan hasil yang berarti. Solvers produksi menggabungkan kedua metode tersebut. Mereka terlebih dahulu membuat bracket, lalu menyempurnakan hasilnya dengan Newton. Vega membahas greek tersebut.

Mengapa dua sumber melaporkan implied volatility yang berbeda

Modelnya bersifat publik dan perhitungannya sudah baku. Jadi, perbedaan berasal dari input.

  • Mid versus last. Solver memerlukan satu harga. Kontrak dengan kuotasi bid $2.00 dan offer $2.20 memiliki midpoint $2.10, sedangkan last print mungkin $2.02 dari 90 menit sebelumnya. Untuk kontrak seperti itu, selisih harga 10 sen lebih besar dampaknya daripada selisih satu poin volatility.
  • Dividen dan carry. Fungsi di atas menghitung harga European call atas saham yang tidak membayar dividen. Dividen sebelum expiry menurunkan forward price. Setiap trading desk menggunakan penyesuaian dan suku bunganya sendiri.
  • Early exercise pada opsi American. Opsi saham tunggal di AS dapat dieksekusi kapan saja. Hak tersebut memiliki nilai yang tidak dapat ditampung oleh formula European. Solver yang mengabaikannya akan memasukkan selisih itu ke dalam volatility. Binomial tree menghitung nilai hak eksekusi tersebut secara langsung.
  • Kuotasi stale. Strike yang terakhir diperdagangkan pada hari Selasa masih dapat menampilkan kuotasi. Solver menganggap input yang diterimanya sebagai kondisi yang benar.

Convergence membuat dua faktor terakhir terlihat. Panel di bawah mengambil delapan saham populer pada 30 Juni 2026, menghitung kontrak yang diperdagangkan dengan sisa waktu 20 hingga 45 hari, lalu melaporkan volatility at the money dan proporsi kontrak yang solvenya mencapai convergence:

QueryImplied volatility at the money dan konvergensi solver, delapan nama, 30 Juni 2026
SQL tepat di balik setiap angka
WITH abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) AS distance_from_spot
SELECT underlying_symbol AS symbol,
       round(100 * avgIf(toFloat64(implied_volatility), iv_converged = 1 AND distance_from_spot < 0.05), 1) AS atm_iv_pct,
       round(100 * countIf(iv_converged = 1) / count(), 1) AS solved_pct,
       count() AS contract_count
FROM global_markets.options_greeks
WHERE date = toDate('2026-06-30')
  AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'SPY', 'KO', 'JNJ')
  AND days_to_expiry BETWEEN 20 AND 45
  AND volume > 0
GROUP BY symbol
HAVING countIf(iv_converged = 1 AND distance_from_spot < 0.05) > 0
ORDER BY atm_iv_pct DESC
Run this yourself

TSLA mencatat pembacaan at the money tertinggi di antara 8 nama, yaitu 47.7%, dibandingkan dengan 14.4% untuk SPY yang berada di posisi terendah. Pada chain TSLA, 97.8% kontrak yang diperdagangkan menghasilkan jawaban yang mencapai convergence. Sisanya adalah strike ketika harga yang diberikan kepada solver berada di luar rentang yang dapat direplikasi oleh volatility apa pun, termasuk kuotasi di bawah intrinsic value atau crossed market. Apakah angka seperti itu tergolong tinggi merupakan pertanyaan terpisah: apakah IV 30% tergolong tinggi membahasnya, sedangkan expected move mengonversinya menjadi rentang dalam dolar.

Kontrak yang sama, dihitung ulang setiap sesi

Tidak ada data implied volatility yang disimpan. Nilainya dihitung ulang berdasarkan harga yang tampil di layar. Di bawah ini adalah kontrak AAPL dengan volume perdagangan tertinggi yang jatuh tempo pada 17 Juli 2026, ditelusuri sejak 1 Juni hingga jatuh tempo. Strike dan tanggal jatuh temponya tidak berubah:

QuerySatu kontrak AAPL, diselesaikan ulang setiap sesi hingga expiry 17 Juli 2026
SQL tepat di balik setiap angka
WITH (
         SELECT ticker
         FROM global_markets.options_greeks
         WHERE underlying_symbol = 'AAPL'
           AND date = toDate('2026-06-30')
           AND expiration_date = toDate('2026-07-17')
           AND iv_converged = 1
           AND volume > 0
         ORDER BY volume DESC
         LIMIT 1
     ) AS pinned_contract
SELECT date,
       round(100 * avg(toFloat64(implied_volatility)), 1) AS implied_vol_pct,
       round(avg(days_to_expiry)) AS days_to_expiry
FROM global_markets.options_greeks
WHERE ticker = pinned_contract
  AND date BETWEEN toDate('2026-06-01') AND toDate('2026-07-17')
  AND iv_converged = 1
  AND volume > 0
GROUP BY date
ORDER BY date
Run this yourself

Selama 29 sesi, hasil perhitungan dibuka pada 25.1% dengan sisa waktu 46 hari dan berakhir pada 26.6% dengan sisa waktu 4 hari. Setiap titik pada garis tersebut merupakan satu kali pengulangan loop di atas menggunakan kuotasi sesi itu. Halaman per ticker kami memublikasikan perhitungan yang sama: implied volatility AAPL menghitungnya setiap hari untuk seluruh chain, sehingga pembaca dapat mereproduksi angka apa pun di sana menggunakan kode pada halaman ini.

FAQ tentang perhitungan implied volatility

Apakah ada rumus untuk implied volatility?

Tidak ada. Black-Scholes memetakan volatility ke harga, tetapi pemetaan tersebut tidak memiliki invers elementer karena sigma muncul dua kali di dalam distribusi normal. Setiap angka implied volatility yang Anda temui, di sini maupun di tempat lain, dihasilkan oleh solver iteratif.

Berapa banyak iterasi yang diperlukan?

Setiap tahap bisection membagi dua rentang, sehingga rentang 0,01 hingga 5,0 menyusut hingga di bawah 0,00001 dalam dua puluh tahap. Untuk mencocokkan kuotasi hingga sen terdekat, biasanya diperlukan sekitar selusin tahap. Newton-Raphson dapat mencapai hasil tersebut dalam tiga atau empat tahap ketika berada near the money, tetapi langkahnya dapat berperilaku tidak stabil ketika vega kecil.

Mengapa broker dan vendor data saya menampilkan implied volatility yang berbeda?

Mereka memasukkan input yang berbeda ke dalam solver. Perbedaan yang umum meliputi mid quote dibandingkan dengan last trade, asumsi suku bunga dan dividen, serta apakah model memperhitungkan early exercise untuk opsi Amerika. Pada strike dengan volume perdagangan rendah, satu kuotasi yang sudah usang saja dapat mengubah hasil beberapa poin.

Apakah call dan put pada strike yang sama menghasilkan implied volatility yang sama?

Secara teori, ya. Put-call parity menghubungkan keduanya pada strike dan expiry yang sama. Dalam praktiknya, kedua kuotasi ditetapkan secara independen. Karena itu, angka hasil perhitungannya dapat sedikit berbeda. Hal ini menjadi salah satu alasan rata-rata seluruh option chain berbeda antarvendor.

Dapatkah saya menghitung implied volatility tanpa market data?

Ya, untuk kuotasi hipotetis. Kode di atas menerima harga, strike, spot, waktu hingga expiry, dan suku bunga yang semuanya dimasukkan secara manual. Mencocokkan angka vendor secara live merupakan bagian yang lebih sulit. Anda harus menggunakan input yang sama dengan yang digunakan vendor.


Setiap panel di sini menyimpan SQL yang mendasarinya. Buka salah satunya, lalu jalankan perhitungan yang sama pada chain live di terminal Strasmore.

#implied volatility#options#black-scholes#python#how-to