Mô phỏng lịch sử và Monte Carlo

Quản trị Rủi ro Định lượng với Python

Jamsheed Shorish

Computational Economist

Mô phỏng lịch sử

  • Không có lớp phân phối phù hợp?
  • Mô phỏng lịch sử: dùng quá khứ để dự đoán tương lai
    • Không cần giả định phân phối
    • Dữ liệu lỗ trước đây trở thành lỗ mô phỏng cho ngày mai
Quản trị Rủi ro Định lượng với Python

Mô phỏng lịch sử trong Python

  • VaR: bắt đầu với lợi nhuận trong asset_returns
  • Tính portfolio_returns bằng weights của danh mục
  • Chuyển portfolio_returns thành losses
  • VaR: tính np.quantile() cho losses tại mức tin cậy 95%
  • Giả định phân phối lỗ tương lai đúng hệt quá khứ

 

weights = [0.25, 0.25, 0.25, 0.25]

portfolio_returns = asset_returns.dot(weights)
losses = - portfolio_returns
VaR_95 = np.quantile(losses, 0.95)
Quản trị Rủi ro Định lượng với Python

Mô phỏng Monte Carlo

  • Mô phỏng Monte Carlo: kết hợp ước lượng tham số và mô phỏng
    • Giả định phân phối cho lỗ danh mục và/hoặc yếu tố rủi ro
    • Dựa vào lấy mẫu ngẫu nhiên để tạo đường đi ngẫu nhiên, gọi là một lần chạy
    • Lặp lấy mẫu ⇒ tạo tập các lần chạy
  • Tính lỗ danh mục mô phỏng cho mỗi lần chạy đến thời điểm mong muốn
  • Ước tính VaR là phân vị của các lỗ mô phỏng
Quản trị Rủi ro Định lượng với Python

Mô phỏng Monte Carlo trong Python

  • Bước 1:
    • Import norm (phân phối chuẩn) từ scipy.stats
    • Đặt total_steps (1 ngày = 1440 phút)
    • Đặt số lần chạy N
    • Tính trung bình mu và độ lệch chuẩn sigma của dữ liệu portfolio_losses
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
Quản trị Rủi ro Định lượng với Python

Mô phỏng Monte Carlo trong Python

  • Bước 2:
    • Khởi tạo vector daily_loss cho N lần chạy
    • Lặp qua N lần chạy
      • Tính vector loss mô phỏng Monte Carlo
        • Dùng norm.rvs() để lấy mẫu lặp từ chuẩn tắc chuẩn
        • Lấy mẫu theo musigma tỉ lệ theo 1/total_steps
daily_loss = np.zeros(N)

for n in range(N):
loss = ( mu * (1/total_steps) + norm.rvs(size=total_steps) * sigma * np.sqrt(1/total_steps) )
Quản trị Rủi ro Định lượng với Python

Mô phỏng Monte Carlo trong Python

  • Bước 3:
    • Tính daily_loss tích lũy cho mỗi lần chạy n
    • Dùng np.quantile() tìm VaR ở mức tin cậy 95% trên daily_loss

 

daily_loss = np.zeros(N)
for n in range(N):

loss = mu * (1/total_steps) + ... norm.rvs(size=total_steps) * sigma * np.sqrt(1/total_steps)
daily_loss[n] = sum(loss)
VaR_95 = np.quantile(daily_loss, 0.95)
Quản trị Rủi ro Định lượng với Python

Mô phỏng lợi nhuận tài sản

  • Tinh chỉnh: sinh các đường đi ngẫu nhiên của lợi nhuận tài sản trong danh mục
    • Thực tế hơn: mô phỏng riêng lẻ lợi nhuận từng tài sản
    • Lợi nhuận tài sản có thể tương quan
      • Nhắc lại: ma trận hiệp phương sai hiệu quả e_cov
      • Dùng ở Bước 2 để tính lợi nhuận tài sản
  • Bài tập: mô phỏng Monte Carlo với mô phỏng lợi nhuận tài sản
Quản trị Rủi ro Định lượng với Python

Ayo berlatih!

Quản trị Rủi ro Định lượng với Python

Preparing Video For Download...