Bài 11: Định giá Path-dependent Option với Monte Carlo Simulation

Path-dependent Option là gì? Khám phá sức mạnh của Monte Carlo trong định giá Asian Option, Lookback Option và Barrier Option qua các ví dụ số chi tiết và hướng dẫn Python từng bước.

Bài 10. Monte Carlo đã giới thiệu nền tảng lý thuyết của phương pháp Monte Carlo từ Luật số lớn, Định lý giới hạn trung tâm, đến cách mô phỏng giá tài sản bằng GBM dưới độ đo trung hòa rủi ro $\mathbb{Q}$. Chúng ta cũng đã thử định giá European Option bằng phương pháp Monte Carlo và so sánh với công thức Black-Scholes.

Trong bài này, chúng ta dùng chính bộ công cụ đó để định giá những sản phẩm mà cây nhị phâncông thức Black-Scholes không thể xử lý được, đó là Path-dependent Option, những quyền chọn mà payoff phụ thuộc vào toàn bộ đường đi của giá tài sản, không chỉ giá tại ngày đáo hạn.

Trong bài viết này:

1. Path-dependent Option là gì?

1.1. Sự khác biệt cốt lõi với Vanilla Option

Ta đã biết giá trị của một European Option chỉ phụ thuộc vào một điểm duy nhất, giá tài sản tại ngày đáo hạn $S_T$. Dù cổ phiếu có trải qua những biến động thế nào trong suốt kỳ hạn, người giữ quyền chọn kiểu Âu chỉ quan tâm đến giá cuối cùng:

\[C_{\text{european}} = e^{-rT}\,\mathbb{E}^{\mathbb{Q}}\!\left[\max(S_T - K,\ 0)\right] \tag{11.1}\]

Path-dependent Optionpayoff phụ thuộc vào toàn bộ đường đi của giá tài sản từ ngày bắt đầu đến ngày đáo hạn $T$. Nói cách khác, hai đường đi giá có thể kết thúc tại cùng một mức $S_T$, nhưng cho ra payoff hoàn toàn khác nhau. Hãy minh họa bằng một ví dụ số đơn giản sau đây.


Ví dụ: Giả sử giá cổ phiếu hiện tại $S_0 = 100$, giá thực hiện $K = 100$, với $T = 3$ bước thời gian, và hai kịch bản đường đi giá như sau:

Steps Path A Path B
$t = 0$ $100$ $100$
$t = 1$ $121$ $80$
$t = 2$ $90$ $143$
$t = 3$ ($T$) $110$ $110$
Bảng 1: Ví dụ mô phỏng GBM 2 kịch bản đường đi của giá.

Cả hai đường mô phỏng đều kết thúc tại mức giá $S_T = 110$, vì vậy European Call cho cùng payoff $\max(110 - 100, 0) = 10$. Nhưng với Path-dependent Option, ta lần lượt có:

  • Lookback Option với payoff phụ thuộc vào giá thấp nhất
    • Path A: $S_{\min} = 90$, $\text{payoff} = 110 - 90 = 20$
    • Path B: $S_{\min} = 80$, $\text{payoff} = 110 - 80 = 30$
  • Asian Option với payoff phụ thuộc vào giá trung bình
    • Path A: $\bar{S}_A = (121 + 90 + 110)/3 = 107$, $\text{payoff} = \max(107 - 100, 0) = 7$
    • Path B: $\bar{S}_B = (80 + 143 + 110)/3 = 111$, $\text{payoff} = \max(111 - 100, 0) = 11$
  • Barrier Option với payoff bị mất hiệu lực nếu giá vượt hàng rào $H = 125$
    • Path A: $S_{\max} = 121 < 125$, hàng rào chưa bị chạm, $\text{payoff} = 10$
    • Path B: $S_{\max} = 143 > 125$, hàng rào đã bị chạm, $\text{payoff} = 0$

Kết quả rất rõ ràng, dù $S_T$ giống nhau, payoff của các Path-dependent Option hoàn toàn khác nhau tùy theo lịch sử đường đi của giá. Đây chính là sự khác biệt cốt lõi với quyền chọn thông thường.


1.2. Tại sao cần Monte Carlo?

payoff phụ thuộc vào toàn bộ đường đi, ta cần một phương pháp có thể mô phỏng và lưu trữ lịch sử giá đầy đủ. Monte Carlo là công cụ tự nhiên nhất để làm điều này.

Từ công thức (10.13) GBM dưới độ đo $\mathbb{Q}$, trong Bài 10. Monte Carlo, ta có:

\[S_{t + \delta t} = S_t \exp\!\left[\left(r - \frac{\sigma^2}{2}\right)\delta t + \sigma\sqrt{\delta t}\, Z\right], \quad Z \sim \mathcal{N}(0,1) \tag{11.2}\]

Bằng cách lặp lại công thức này qua $m$ bước thời gian, ta thu được toàn bộ đường đi của giá tài sản. Sau đó, dù quy tắc tính payoff phức tạp đến đâu, từ lấy trung bình, cực trị, đến hàng rào có điều kiện, ta đều có đủ dữ liệu để tính toán. Giá quyền chọn cuối cùng là trung bình của tất cả payoff được chiết khấu về hiện tại theo Luật số lớn:

\[\hat{V} = e^{-rT}\,\frac{1}{n}\sum_{i=1}^{n} f\!\left(S_0^{(i)}, S_{\delta t}^{(i)}, \ldots, S_T^{(i)}\right) \tag{11.3}\]

Về mặt thực thi code, Monte Carlo thể hiện ưu điểm nổi bật: cấu trúc mô phỏng hoàn toàn không đổi, chỉ hàm $f$ thay đổi theo từng loại quyền chọn. Thêm một dòng code np.min() tính cực trị, hay np.mean() tính trung bình, là ta đã chuyển từ loại quyền chọn này sang loại quyền chọn khác.

1.3. Bộ tham số chung

Dưới đây là bộ tham số sẽ được dùng thống nhất xuyên suốt bài, cả trong ví dụ tính toán thủ công và phần thực hành code Python, để so sánh giữa các loại quyền chọn:

  • Giá cổ phiếu ban đầu ($S_0$): 100
  • Giá thực hiện ($K$): 100
  • Lãi suất phi rủi ro ($r$): 5% / năm
  • Độ biến động ($\sigma$): 20% / năm
  • Kỳ hạn ($T$): 1 năm
  • Số bước thời gian ($m$): 4 bước, $\delta t = 0.25$ năm
  • Số kịch bản Python ($n$): 10 000

Để tham chiếu, European Call tương đương được định giá bởi công thức Black-Scholes là:

\[C_{\text{European}} = S_0 N(d_1) - K e^{-rT} N(d_2) \approx \mathbf{10.45}\]

Đây sẽ là mốc so sánh chuẩn xuyên suốt bài để thấy rõ Path-dependent Option đắt hay rẻ hơn Vanilla Option tương ứng và tại sao.

2. Lookback Option: Quyền nhìn lại quá khứ

Lookback Option là loại quyền chọn cho phép người mua được quyền nhìn lại toàn bộ lịch sử giá và chọn thời điểm mua/bán tốt nhất. Vì đặc quyền tốt như vậy, phí quyền chọn cũng đắt hơn European Option đáng kể.

2.1. Hai dạng phổ biến nhất

Floating Strike Lookback Call, quyền chọn mua kiểu giá thực hiện thả nổi, cho phép nhà đầu tư luôn mua được ở đáy. Nhà đầu tư có quyền mua tài sản cơ sở tại mức giá thấp nhất trong suốt kỳ hạn, và bán ra tại mức giá cuối cùng.

\[C_{\text{lookback-float}} = e^{-rT} \mathbb{E}^{\mathbb{Q}}\!\left[S_T - \min_{0 \leq t \leq T} S_t\right] \tag{11.4}\]

Không có toán tử $\max$, vì $S_T \geq \min S_t$ luôn đúng, payoff luôn dương.

Floating Strike Lookback Put, quyền chọn bán kiểu giá thực hiện thả nổi, cho phép nhà đầu tư luôn bán được ở đỉnh. Ý tưởng ở đây là: tôi không biết khi nào thị trường đạt đỉnh, nhưng khi kết thúc kỳ hạn, tôi muốn được tính toán lợi nhuận dựa trên mức giá cao nhất mà cổ phiếu từng chạm tới.

\[P_{\text{lookback-float}} = e^{-rT} \mathbb{E}^{\mathbb{Q}}\!\left[\max_{0 \leq t \leq T} S_t - S_T\right] \tag{11.5}\]

Lookback Option còn có dạng Fixed Strike, giá thực hiện cố định, với payoff được định nghĩa với call \(\max(\max_{0 \le t \le T} S_t - K, 0)\) hay put \(\max(K - \min_{0 \leq t \leq T} S_t, 0)\). Khác với loại thả nổi phổ biến hơn trong thực tế, loại cố định có thể khiến người mua bị lỗ phí quyền chọn.

Dưới đây là mô phỏng quỹ đạo giá và payoff của Lookback Option tương ứng. Bạn đọc có thể kéo thanh Resimulate để thay đổi kịch bản giá hoặc các thanh kéo khác để thay đổi tham số của quyền chọn.


Lookback call (floating): payoff = ST − Smin    Lookback put (floating): payoff = Smax − ST    "perfect hindsight" — buy at the lowest, sell at the highest
Price path S(t)
Running Sᴍᴀx
Running Sᴍɪɴ
Sᴛ vs Sᴍɪɴ at expiry
ST
terminal price
Smin
path minimum
Call payoff
Sᴛ − Sᴍɪɴ
Put payoff
Sᴍᴀx − Sᴛ
Hình 1: Mô phỏng quỹ đạo giá và payoff Lookback Option tương ứng.

2.2. Thực hành tính toán thủ công

Để nắm rõ cơ chế trước khi lập trình, dưới đây là ví dụ minh họa cách định giá Lookback Option bằng phương pháp Monte Carlo với 5 kịch bản và 4 bước thời gian.


Ví dụ: Giả sử Lookback Option trên cổ phiếu $S$ với payoff $S_T - \min_{0 \leq t \leq T} S_t$.

Trước hết, ta cần mô phỏng đường đi của giá cổ phiếu. Công thức (11.2) rất phù hợp để mô hình hóa từng bước nhảy của giá: giá cổ phiếu tại thời điểm tiếp theo ($t + \delta t$) có thể tính dựa trên giá hiện tại ($t$). Ta tính toán các giá trị trung gian như sau:

  • Xu hướng: $(r - \frac{1}{2}\sigma^2)\delta t = (0.05 - 0.5 \times 0.2^2) \times 0.25 = 0.0075$.
  • Độ biến động: $\sigma\sqrt{\delta t} = 0.2 \times \sqrt{0.25} = 0.1$.

Quỹ đạo giá cổ phiếu số 1 (Path 1) được mô phỏng như sau:

Time ($t$) Random number ($Z$) Calculation Formula $S_t$ Stock Price ($S_t$)
0.00 100.00
0.25 $+0.45$ $100 \times \exp(0.0075 + 0.1 \times 0.45)$ 105.39
0.50 $-0.20$ $105.39 \times \exp(0.0075 + 0.1 \times -0.20)$ 104.08
0.75 $+1.10$ $104.08 \times \exp(0.0075 + 0.1 \times 1.10)$ 117.06
1.00 $-0.85$ $117.06 \times \exp(0.0075 + 0.1 \times -0.85)$ 108.33
Bảng 2: Ví dụ mô phỏng GBM 5 kịch bản đường đi của giá.

Tương tự, năm quỹ đạo giá cổ phiếu và payoff tương ứng được tính như sau:

Path $S_0$ $S_{0.25}$ $S_{0.5}$ $S_{0.75}$ $S_T$ Minimum Price ($S_{min}$) Payoff ($S_T - S_{min}$)
1 100 105.39 104.08 117.06 108.33 100.00 8.33
2 100 98.42 95.26 92.17 94.83 92.17 2.66
3 100 102.51 105.81 101.25 106.34 100.00 6.34
4 100 97.23 93.56 89.47 85.22 85.22 0.00
5 100 101.89 99.57 103.22 108.74 99.57 9.17
Bảng 3: Ví dụ tính payoff Lookback Option với 5 kịch bản và 4 bước thời gian.

Dựa vào loại quyền chọn, ta tính payoff tại thời điểm $T$. Với Lookback Option ở trên, ta phải tìm giá thấp nhất cho mỗi quỹ đạo giá. Với quỹ đạo giá số 1 (100, 105.39, 104.08, 117.06, 108.33), ta có $S_{\min} = 100$. Payoff tương ứng sẽ là:

\[\text{Payoff}_1 = S_T - S_{\min} = 108.33 - 100 = 8.33\]

Đặc biệt, với quỹ đạo giá số 4 (100, 97.23, 93.56, 89.47, 85.22) kết thúc tại đúng mức giá thấp nhất, nên payoff bằng 0. Đây là kịch bản duy nhất mà Lookback Option không có lợi.

Sau khi chạy mô phỏng các quỹ đạo giá khác, ta có danh sách payoff từ các kịch bản. Lấy trung bình cộng, ta có:

\[\text{Average Payoff} = \frac{1}{n} \sum_{i=1}^{n} \text{Payoff}_i = \frac{8.33 + 2.66 + 6.34 + 0 + 9.17}{5} = \frac{26.5}{5} = 5.3\]

payoff ở tương lai ($T$), ta cần chiết khấu về hiện tại để có giá quyền chọn cuối cùng:

\[e^{-rT} \times \text{Average Payoff} = e^{-0.05 \times 1} \times 5.3 \approx 0.9512 \times 5.3 = \mathbf{5.04}\]

So sánh với European Call (10.45), kết quả từ 5 kịch bản (5.04) chưa đủ để so sánh. Với 10000 kịch bản, kết quả thực tế sẽ cao hơn nhiều, cao hơn gần gấp đôi European Call.


2.3. Thực hành Python

Bạn có thể chạy thử trên Google Colab.

Colab

Trước tiên ta xây dựng hàm mô phỏng đường đi giá theo GBM dưới độ đo trung hòa rủi ro, tái sử dụng từ Bài 10. Monte Carlo:

import numpy as np

def simulate_paths(S, T, r, sigma, n_step, n_sim, seed=42):
    np.random.seed(seed)
    dt = T / n_step

    # Generate a matrix of Z ~ N(0, 1) with dimensions (nb of scenarios, nb of steps)
    Z = np.random.standard_normal((n_sim, n_step))
    growth = np.exp((r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z)

    # Paths matrix dimension (nb of scenarios, nb of steps + 1)
    paths = np.ones((n_sim, n_step + 1)) * S
    paths[:, 1:] = S * np.cumprod(growth, axis=1)
    
    return paths

Với paths trong tay, định giá Asian Option chỉ còn là bốn bước đơn giản:

  • Lấy giá cổ phiếu tại ngày đáo hạn: paths[:, -1]
  • Lấy giá cổ phiếu thấp nhất/cao nhất cho mỗi quỹ đạo giá: min(axis=1) hoặc max(axis=1)
  • Tính payoff cho từng kịch bản: payoffs = S_T - S_min hoặc payoffs = S_max - S_T
  • Chiết khấu trung bình payoff về hiện tại: price = np.exp(-r * T) * np.mean(payoff)
def lookback_mc(S, T, r, sigma, n_step, n_sim, option_type='call'):
    paths = simulate_paths(S, T, r, sigma, n_step, n_sim)
    S_T = paths[:, -1]

    if option_type == 'call':
        S_min  = paths.min(axis=1)   # Minimum Price
        payoffs = S_T - S_min
    else:
        S_max  = paths.max(axis=1)   # Maximum Price
        payoffs = S_max - S_T

    price = np.exp(-r * T) * np.mean(payoffs)
    se    = np.exp(-r * T) * np.std(payoffs, ddof=1) / np.sqrt(n_sim)

    return price, se

Bây giờ hãy thử định giá Lookback Option với bộ tham số chung:

# Parameters
S, K, T, r, sigma = 100.0, 100.0, 1.0, 0.05, 0.20
n_step, n_sim = 252, 100000
p_lc, se_lc = lookback_mc(S, T, r, sigma, n_step, n_sim, 'call')
p_lp, se_lp = lookback_mc(S, T, r, sigma, n_step, n_sim, 'put')

print(f"Lookback Call (Float Strike) : {p_lc:.4f} ± {1.96*se_lc:.4f}")
print(f"Lookback Put  (Float Strike) : {p_lp:.4f} ± {1.96*se_lp:.4f}")
print(f"European Call (BS)           : 10.4506")
print(f"European Put  (BS)           : 5.5735")
Lookback Call (Float Strike) : 16.5870 ± 0.0898
Lookback Put  (Float Strike) : 13.4291 ± 0.0611
European Call (BS)           : 10.4506
European Put  (BS)           : 5.5735

Kết quả rất rõ ràng: Lookback Call (16.58) đắt hơn European Call (10.45) gần gấp đôi, và Lookback Put (13.42) đắt hơn European Put (5.57) gần gấp ba. Mức phí quyền chọn cao phản ánh đặc quyền không thể thua lỗ của người nắm giữ, luôn mua được ở đáy hoặc bán được ở đỉnh.

3. Asian Option: Trung bình hóa để giảm rủi ro

Asian Option là loại quyền chọn mà giá trị thanh toán khi đáo hạn (payoff) phụ thuộc vào giá trung bình của tài sản cơ sở trong một khoảng thời gian, thay vì chỉ một mức giá tại ngày đáo hạn.

Hãy tưởng tượng bạn là một công ty nhập khẩu dầu. Bạn mua dầu mỗi ngày trong suốt một năm, không phải một lần vào cuối năm. Rủi ro của bạn không phải là giá dầu vào ngày 31/12, mà là giá phải trả trong năm. Một quyền chọn thông thường sẽ không phòng hộ đúng rủi ro này, vì giá vào ngày đáo hạn có thể rất thấp trong khi giá trung bình trong năm lại cao. Asian Option được thiết kế chính xác cho tình huống này.

3.1. Hai dạng phổ biến nhất

Average Price Option, quyền chọn kiểu giá trung bình, giá trung bình thay thế giá cuối cùng:

\[C_{\text{asian-price}} = e^{-rT} \mathbb{E}^{\mathbb{Q}}\!\left[\max\!\left(\bar{S} - K,\ 0\right)\right] \tag{11.6}\]

Trong đó $\bar{S} = \frac{1}{m}\sum_{j=1}^{m} S_{t_j}$ là giá trung bình tính tại $m$ thời điểm quan sát, $m$ cũng có thể bao gồm toàn bộ kỳ hạn hợp đồng.

Average Strike Option, quyền chọn kiểu giá thực hiện trung bình, giá trung bình thay thế giá thực hiện $K$:

\[C_{\text{asian-strike}} = e^{-rT} \mathbb{E}^{\mathbb{Q}}\!\left[\max\!\left(S_T - \bar{S},\ 0\right)\right] \tag{11.7}\]

Ở đây $S_T$ là giá tại ngày đáo hạn và $\bar{S}$ là giá trung bình đóng vai trò như giá thực hiện thả nổi. Payoff dương khi giá cuối cao hơn giá trung bình, tức cổ phiếu đang có xu hướng tăng cuối kỳ.

Asian Option phổ biến hơn European Option thông thường trong nhiều thị trường hàng hóa vì hai lý do: giá trung bình khó bị thao túng hơn giá tại một thời điểm đơn lẻ, và phí quyền chọn (premium) thấp hơn do độ biến động (volatility) của giá trung bình thấp hơn giá thời điểm.


Asian call payoff = max(S̅ − K, 0)    S̅ = (1/N) · Σ S(ti)   
Price path S(t)
Running S̅(t)
Strike K
Sᴛ vs S̅ at expiry
Sᴛ
vanilla reference
arithmetic mean
Asian payoff
max(S̅ − K, 0)
Vanilla payoff
max(Sᴛ − K, 0)
Hình 2: Mô phỏng quỹ đạo giá và payoff Asian Option tương ứng.

3.2. Thực hành tính toán thủ công


Ví dụ: Giả sử cho Asian Option trên cổ phiếu $S$ với các tham số chung như Phần 1.3. Ta dùng lại đúng 5 mô phỏng đường đi của giá từ phần trên để tính payoff cho Asian Option:

Path $S_{0.25}$ $S_{0.5}$ $S_{0.75}$ $S_T = S_1$ $\bar{S}$ Asian-price $\max(\bar{S}-K, 0)$ Asian-strike $\max(S_T-\bar{S}, 0)$
1 105.39 104.08 117.06 108.33 108.72 8.72 0.00
2 98.42 95.26 92.17 94.83 95.17 0.00 0.00
3 102.51 105.81 101.25 106.34 103.98 3.98 2.36
4 97.23 93.56 89.47 85.22 91.37 0.00 0.00
5 101.89 99.57 103.22 108.74 103.36 3.36 5.38
Bảng 4: Ví dụ tính payoff Asian Option với 5 kịch bản và 4 bước thời gian.

Với Asian Option, ta cần tính giá trung bình $\bar{S}$ cho mỗi quỹ đạo giá. Lưu ý rằng $\bar{S}$ tính trên 4 điểm quan sát, không bao gồm giá ban đầu. Với quỹ đạo giá số 1, ta tính được giá trung bình như sau $\bar{S}_1 = (105.39 + 104.08 + 117.06 + 108.33)/4 = 108.72$ và payoff tương ứng sẽ là:

\[\text{Payoff}_1 = \max(108.72 - 100,\ 0) = 8.72\]

Giá quyền chọn tương ứng với mỗi payoff lần lượt là:

\[C_{\text{asian-price}} = e^{-0.05 \times 1} \times \frac{8.72 + 0 + 3.98 + 0 + 3.36}{5} \approx 0.9512 \times 3.21 \approx \mathbf{3.05}\] \[C_{\text{asian-strike}} = e^{-0.05 \times 1} \times \frac{0 + 0 + 2.36 + 0 + 5.38}{5} \approx 0.9512 \times 1.55 \approx \mathbf{1.47}\]

Tất nhiên, với chỉ 5 kịch bản, sai số rất lớn. Kết quả thực sự cần hàng chục nghìn kịch bản để hội tụ chính xác, đó là việc của Python ở phần sau.


3.3. Thực hành Python

Ta có thể thực thi hàm định giá Asian Option rất ngắn gọn như sau:

def asian_mc(S, K, T, r, sigma, n_step, n_sim, option_type='call', asian_type='price'):
    paths = simulate_paths(S, T, r, sigma, n_step, n_sim)
    sign = 1 if option_type == 'call' else -1
    S_avg = paths[:, 1:].mean(axis=1)  # Exclude S0
    S_T   = paths[:, -1]

    if asian_type == 'price':
        payoffs = np.maximum(sign * (S_avg - K), 0)
    elif asian_type == 'strike':
        payoffs = np.maximum(sign * (S_T - S_avg), 0)
    
    price  = np.exp(-r * T) * payoffs.mean()
    se     = np.exp(-r * T) * payoffs.std(ddof=1) / np.sqrt(n_sim)
    
    return price, se

Điểm khác biệt cơ bản nhất so với Lookback Option là dòng code paths[:, 1:].mean(axis=1). Thay vì chỉ lấy giá thấp nhất/cao nhất min(axis=1) hoặc max(axis=1), ta lấy trung bình toàn bộ đường đi. Đây chính là lý do Monte Carlo là phương pháp tự nhiên nhất để định giá Path-dependent Option, thay đổi loại quyền chọn chỉ cần thay đổi payoff, không cần thay đổi cấu trúc mô phỏng.

p_ap, se_ap = asian_mc(S, K, T, r, sigma, n_step, n_sim, 'call', 'price')
p_as, se_as = asian_mc(S, K, T, r, sigma, n_step, n_sim, 'call', 'strike')

print(f"Average Price Asian Call  : {p_ap:.4f} ± {1.96*se_ap:.4f}")
print(f"Average Strike Asian Call : {p_as:.4f} ± {1.96*se_as:.4f}")
print(f"European Call (BS)        : 10.4506")
Average Price Asian Call  : 5.7592 ± 0.0494
Average Strike Asian Call : 5.8279 ± 0.0524
European Call (BS)        : 10.4506

Kết quả trên xác nhận lý thuyết: cả hai dạng Asian Option đều rẻ hơn European Option đáng kể (5.75 và 5.82 so với 10.45). Sự chênh lệch giá giữa hai Asian Option phản ánh việc dạng Average Strike có thêm rủi ro khi giá cuối cùng thấp hơn giá trung bình.

Ta cũng có thể thấy Standard Error của Lookback Option lớn hơn so với Asian Option. Điều này hợp lý vì payoff phụ thuộc vào giá cực trị min/max, vốn biến động mạnh hơn giá trung bình, dẫn đến phương sai của mẫu lớn hơn và Monte Carlo hội tụ chậm hơn.

4. Barrier Option: Quyền chọn có hàng rào

Barrier Option là quyền chọn mà hiệu lực (existence) phụ thuộc vào việc giá tài sản cơ sở có chạm hoặc vượt qua một mức giá nhất định (barrier) hay không trong suốt kỳ hạn hợp đồng.

Quyền chọn này phù hợp với các nhà đầu tư muốn phòng hộ rủi ro nhưng với chi phí thấp bằng cách loại bỏ những vùng giá họ tin là khó có khả năng xảy ra.

4.1. Phân loại Barrier Option

Knock-Out Option: Quyền chọn mất hiệu lực khi giá chạm hàng rào.

  • Down-and-Out Call: mất hiệu lực nếu giá giảm xuống dưới hàng rào $H$.
  • Up-and-Out Call: mất hiệu lực nếu giá tăng lên trên hàng rào $H$.

Người mua Knock-Out Option chấp nhận rủi ro mất toàn bộ quyền lợi nếu hàng rào bị chạm, để đổi lấy mức phí thấp hơn. Điều này phù hợp với nhà đầu tư tin rằng thị trường sẽ di chuyển theo hướng có lợi, nhưng không điều chỉnh quá mạnh.

Knock-In Option: Quyền chọn có hiệu lực khi giá chạm hàng rào.

  • Down-and-In Call: chỉ có hiệu lực nếu giá giảm xuống dưới hàng rào $H$.
  • Up-and-In Call: chỉ có hiệu lực nếu giá tăng lên trên hàng rào $H$.

Ngược lại, người mua Knock-In Option chấp nhận quyền lợi bị đóng băng ở thời điểm ban đầu và chỉ được kích hoạt khi thị trường có biến động đủ lớn để chạm vào hàng rào.

Ngoài ra, trên thị trường còn tồn tại Double Barrier Option, thiết lập đồng thời hàng rào trên và hàng rào dưới, tạo ra hành lang giá cho tài sản cơ sở. Đây là công cụ lý tưởng cho một bộ phận các nhà đầu tư tin rằng thị trường sẽ chỉ dao động trong một phạm vi hẹp (Knock-Out), hoặc chuẩn bị có một sự bứt phá mạnh mẽ về một trong hai hướng (Knock-In).

Payoff của Up-and-Out Call

\[C_{\text{barrier-U&O}} = e^{-rT} \mathbb{E}^{\mathbb{Q}}\!\left[\max(S_T - K, 0) \cdot \mathbf{1}_{\max_{0 \leq t \leq T} S_t < H}\right] \tag{11.8}\]

Trong đó: Hàm chỉ số $\mathbf{1}_{\max S_t < H}$ bằng 1 nếu giá chưa bao giờ chạm hàng rào $H$ trong toàn bộ vòng đời, và bằng 0 nếu đã chạm.

Công thức này thể hiện bản chất của Up-and-Out Call, là một quyền chọn sinh tồn: giá trị của nó không chỉ phụ thuộc vào giá đóng cửa $S_T$ mà còn phụ thuộc vào toàn bộ hành trình của giá trong quá khứ. Nếu tại bất kỳ thời điểm nào giá chạm hoặc tăng lên trên mức $H$, quyền chọn sẽ mất hiệu lực ngay lập tức và giá trị trả về bằng 0 bất kể $S_T$ cao bao nhiêu.

Người mua chấp nhận rủi ro bị Knock-out này để đổi lại mức phí quyền chọn rẻ hơn. Do đó, $C_{\text{barrier-U&O}}$ luôn có giá trị thấp hơn một quyền chọn Call thông thường cùng tham số. Khoảng chênh lệch giá chính là chi phí tiết kiệm được từ việc giới hạn phạm vi phòng hộ.


Up-and-Out call: payoff = max(ST−K, 0) · 𝟏{max S(t) < H}    knocked out permanently if path ever touches barrier H from below
Alive payoff
Barrier (H)
Strike (K)
Sᴛ at expiry
ST
terminal price
Knocked out?
path hit H
Barrier payoff
up-and-out call
Vanilla payoff
max(ST−K, 0)
Hình 3: Mô phỏng quỹ đạo giá và payoff Barrier Option tương ứng.

Bạn đọc có thể kéo thanh Resimulate để thay đổi kịch bản giá. Bạn có thể thấy khi hàng rào rất gần với giá ban đầu, khả năng để đường đi của giá chạm vào hàng rào là rất cao. Lúc này giá cuối cùng không có nhiều ý nghĩa vì quyền chọn đã mất hiệu lực, payoff bằng 0 ngay lập tức.

4.2. In-Out Parity

In-Out Parity dựa trên logic nhị phân: trong mọi kịch bản, hàng rào chỉ có thể rơi vào một trong hai trạng thái hoặc đã bị chạm (\(\mathbf{1}_{In}\)), hoặc chưa bao giờ bị chạm (\(\mathbf{1}_{Out}\)). Vì tổng xác suất của hai trạng thái này luôn bằng 1, việc nắm giữ cả hai quyền chọn Down-and-InDown-and-Out với cùng tham số sẽ luôn nhận được payoff bằng đúng một Vanilla Option.

\[\text{Vanilla Price} = \text{Knock-In Price} + \text{Knock-Out Price} \tag{11.9}\]

Điều này cũng giải thích tại sao khi hàng rào $H$ càng tiến gần đến giá hiện tại $S_0$, giá trị của Knock-Out sẽ giảm mạnh trong khi giá trị của Knock-In tăng cao, nhưng tổng của chúng luôn cố định.

Về mặt vận hành, các ngân hàng sử dụng quy tắc này để định giá những quyền chọn khó: thay vì định giá trực tiếp quyền chọn Knock-In (vốn có phân phối xác suất khó xác định), người ta thường định giá quyền chọn VanillaKnock-Out trước, sau đó lấy hiệu số để tìm ra giá trị của Knock-In [2].

4.3. Thực hành tính toán thủ công


Ví dụ: Giả sử định giá Up-and-Out Call với hàng rào $H = 108$ (nằm phía trên $S_0 = 100$), với 5 đường đi của giá đã mô phỏng ở phần trước. Đầu tiên, ta cần tính payoff của Vanilla Call cùng tham số, sau đó nhân với hàm chỉ số hàng rào $\mathbf{1}_{\min S_t > H}$:

Path $S_{0.25}$ $S_{0.5}$ $S_{0.75}$ $S_T = S_1$ Touch Barrier $H=108$ Vanilla Call U&O Call
1 105.39 104.08 117.06 108.33 YES 8.33 0.00
2 98.42 95.26 92.17 94.83 NO 0.00 0.00
3 102.51 105.81 101.25 106.34 NO 6.34 6.34
4 97.23 93.56 89.47 85.22 NO 0.00 0.00
5 101.89 99.57 103.22 108.74 YES 8.74 0.00
Bảng 5: Ví dụ tính payoff Barrier Option với 5 kịch bản và 4 bước thời gian.

Với quỹ đạo giá số 1 (100, 105.39, 104.08, 117.06, 108.33), giá cao nhất là 117.06 nên hàng rào đã bị chạm, hàm chỉ số $\mathbf{1}_{\max S_t > H} = 0$, nên payoff bằng 0. Tương tự với quỹ đạo giá số 5.

Giá quyền chọn Up-and-Out Call là:

\[C_{\text{barrier-U&O}} = e^{-0.05} \times \frac{0 + 0 + 6.34 + 0 + 0}{5} \approx 0.9512 \times 1.27 \approx \mathbf{1.21}\]

So sánh với Vanilla Call (10.45), U&O Call rẻ hơn đáng kể vì có rủi ro mất hiệu lực.

Nếu thử đặt hàng rào thấp hơn nữa $H = 105$, trong 5 quỹ đạo giá trên, có 3 quỹ đạo giá chạm hàng rào, giá U&O Call sẽ còn thấp hơn khi $H=108$. Ngược lại, nếu đặt $H = 115$, ít quỹ đạo có khả năng chạm hàng rào hơn, giá U&O Call vì thế sẽ cao hơn. Đối với người mua: hàng rào càng xa, bảo vệ càng tốt nhưng chi phí càng đắt.


4.4. Thực hành Python

Ta có thể thực thi hàm định giá Barrier Option với các payoff khác nhau rất ngắn gọn như sau:

def barrier_mc(S, K, H, T, r, sigma, n_step, n_sim, option_type='call', barrier_type='down-and-out'):
    paths  = simulate_paths(S, T, r, sigma, n_step, n_sim)
    S_T    = paths[:, -1]
    sign   = 1 if option_type == 'call' else -1
    vanilla_payoffs = np.maximum(sign * (S_T - K), 0)

    if barrier_type == 'down-and-out':
        active = paths.min(axis=1) > H
    elif barrier_type == 'down-and-in':
        active = paths.min(axis=1) <= H
    elif barrier_type == 'up-and-out':
        active = paths.max(axis=1) < H
    elif barrier_type == 'up-and-in':
        active = paths.max(axis=1) >= H

    payoffs = vanilla_payoffs * active
    price   = np.exp(-r * T) * payoffs.mean()
    se      = np.exp(-r * T) * payoffs.std(ddof=1) / np.sqrt(n_sim)
    return price, se

Mỗi loại Barrier Option chỉ khác nhau ở một điều kiện logic (>, <=, <, >=). Sự thanh lịch khi thực thi code này là đặc điểm nổi bật của Monte Carlo, chỉ cần thay đổi điều kiện payoff mà hoàn toàn không cần động tới cấu trúc mô phỏng.

Bây giờ ta thử kiểm chứng In-Out Parity:

H = 85.0
p_dao, se_dao = barrier_mc(S, K, H, T, r, sigma, n_step, n_sim, 'call', 'down-and-out')
p_dai, se_dai = barrier_mc(S, K, H, T, r, sigma, n_step, n_sim, 'call', 'down-and-in')
p_call, se_call = european_mc(S, K, T, r, sigma, n_step, n_sim, option_type='call')

print(f"Down-and-Out Call (H={H}) : {p_dao:.4f} ± {1.96*se_dao:.4f}")
print(f"Down-and-In  Call (H={H}) : {p_dai:.4f} ± {1.96*se_dai:.4f}")
print(f"Sum (D&O + D&I)           : {p_dao + p_dai:.4f}")
print(f"European Call (BS)        : 10.4506")
print(f"European Call (MC)        : {p_call:.4f} ± {1.96*se_call:.4f}")
Down-and-Out Call (H=85.0) : 9.9764 ± 0.0911
Down-and-In  Call (H=85.0) : 0.4229 ± 0.0163
Sum (D&O + D&I)           : 10.3994
European Call (BS)        : 10.4506
European Call (MC)        : 10.2211 ± 0.2834

In-Out Parity được xác nhận: $9.9764 + 0.4229 = 10.3994 \approx 10.4506$. Cần chú ý chênh lệch giữa hai giá trị là do khác biệt giữa hai phương pháp cũng như sai số thống kê Monte Carlo. Nếu nhìn vào giá European Call (MC), độ lệch này hoàn toàn nằm trong biên độ dao động ngẫu nhiên cho phép của mô phỏng.

Bây giờ hãy thử thay đổi giá trị hàng rào để hiểu ảnh hưởng của nó:

for H in [75, 85, 95]:
    p, se = barrier_mc(S, K, H, T, r, sigma, n_step, n_sim, 'call', 'down-and-out')
    print(f"H = {H:3d} | D&O Call = {p:.4f} ± {1.96*se:.4f}")
H =  75 | D&O Call = 10.3896 ± 0.0908
H =  85 | D&O Call = 9.9764 ± 0.0911
H =  95 | D&O Call = 6.1564 ± 0.0834

Hàng rào càng gần $S_0 = 100$, xác suất chạm hàng rào càng cao, quyền chọn Knock-Out càng rẻ. Khi tăng hàng rào lên mức 95, giá chỉ còn 6.15, thấp hơn nhiều so với European Call là 10.45 vì rủi ro quyền chọn mất hiệu lực rất cao.

5. Tóm tắt và thảo luận

Trong bài viết này, chúng ta đã đi từ khái niệm Path-dependent Option đến việc định giá thực tế ba loại quyền chọn phổ biến nhất bằng Monte Carlo. Bảng dưới đây tóm tắt toàn bộ kết quả để so sánh trực quan:

Option Price (Call) Note
European Call (BS) 10.4506 Mốc so sánh
Lookback Call (Float) 16.5870 Đặc quyền mua tại đáy, luôn có lãi
Lookback Put (Float) 13.4291 Đặc quyền bán tại đỉnh, luôn có lãi
Asian Call (Average Price) 5.7592 Biến động thấp hơn do trung bình hóa
Asian Call (Average Strike) 5.8279 Rủi ro giá cuối thấp hơn trung bình
D&O Call ($H=85$) 9.9764 Có rủi ro mất hiệu lực khi giá giảm sâu
D&O Call ($H=95$) 6.1564 Rủi ro mất hiệu lực rất cao
D&I Call ($H=85$) 0.4229 Chỉ có giá trị khi thị trường giảm sâu
Bảng 6: Tổng hợp giá các loại quyền chọn phụ thuộc đường đi.

Những điểm cần ghi nhớ sau bài này:

  • Path-dependent Option khác European Option ở chỗ payoff phụ thuộc vào toàn bộ đường đi của giá, không chỉ giá tại ngày đáo hạn. Monte Carlo mô phỏng từng đường đi độc lập nên xử lý tự nhiên mọi quy tắc payoff dù phức tạp đến đâu.

  • Ba loại quyền chọn phụ thuộc đường đi và định giá bằng Monte Carlo:
    • Asian Option: Payoff phụ thuộc vào giá trung bình. Rẻ hơn European Option do độ biến động thấp hơn, rất phổ biến trong thị trường hàng hóa.
    • Lookback Option: Payoff phụ thuộc vào giá cao nhất hoặc thấp nhất trong vòng đời. Đắt hơn European Option do đặc quyền nhìn lại quá khứ.
    • Barrier Option: Hiệu lực phụ thuộc vào việc giá có chạm hàng rào hay không. Rất đa dạng (Knock-In/Out, Up/Down) và tính nhất quán kiểm tra bởi $D\&O + D\&I = \text{Vanilla}$.
  • Điểm quan trọng nhất là sức mạnh của Monte Carlo nằm ở sự tách rời giữa cấu trúc mô phỏng và logic payoff. Hàm simulate_paths hoàn toàn giống nhau cho mọi loại quyền chọn, điều duy nhất thay đổi là vài dòng tính payoff.

  • Thực hành Python Colab

Monte Carlo là phương pháp linh hoạt nhất trong bộ ba phương pháp số, nhưng cũng là phương pháp đòi hỏi nhiều tài nguyên tính toán nhất. Trong thực tế, khi cần định giá hàng triệu quyền chọn mỗi ngày trong vài mili giây, đây là một vấn đề nghiêm trọng.

Trong bài tiếp theo, chúng ta sẽ tìm hiểu về các kỹ thuật giảm phương sai (variance reduction techniques), những kỹ thuật giúp Monte Carlo hội tụ nhanh hơn đáng kể mà không cần tăng số lượng kịch bản.

  1. Deutsch, H. P. (2004). Introduction to Quantitative Methods for Financial Markets. Wiley Finance.
  2. Joshi, M. S. (2003). The Concepts and Practice of Mathematical Finance. Cambridge University Press.
  3. Hull, J. C. (2021). Options, Futures, and Other Derivatives (11th ed.). Pearson.
  4. Kemna, A. G. Z., & Vorst, A. C. F. (1990). A Pricing Method for Options Based on Average Asset Values. Journal of Banking & Finance, 14(1), 113–129.
  5. Goldman, M. B., Sosin, H. B., & Gatto, M. A. (1979). Path Dependent Options: "Buy at the Low, Sell at the High". Journal of Finance, 34(5), 1111–1127.
  6. Rubinstein, M., & Reiner, E. (1991). Breaking Down the Barriers. Risk Magazine, 4(8), 28–35.
Hãy để lại câu hỏi tại phần bình luận hoặc trên GROUP để nhận được câu trả lời sớm nhất nhé. Bạn đọc có thể ủng hộ blog qua BUY ME A COFFEE ở góc trên bên phải. Cảm ơn bạn đã tiếp thêm năng lượng để tôi hoàn thiện những bài viết tâm huyết hơn mỗi ngày.

Cusdis

Đừng ngần ngại để lại bình luận nhé!
Bạn không cần tạo tài khoản, chỉ cần nhập tên và nội dung tin nhắn.