Historical and Monte Carlo Simulation

การบริหารความเสี่ยงเชิงปริมาณด้วย Python

Jamsheed Shorish

Computational Economist

Historical simulation

  • ไม่มีการแจกแจงที่เหมาะสม?
  • Historical simulation: ใช้ข้อมูลในอดีตเพื่อคาดการณ์อนาคต
    • ไม่จำเป็นต้องสมมติรูปแบบการแจกแจง
    • ข้อมูลความสูญเสียในอดีตกลายเป็นความสูญเสีย จำลอง สำหรับวันพรุ่งนี้
การบริหารความเสี่ยงเชิงปริมาณด้วย Python

Historical simulation ใน Python

  • VaR: เริ่มจากผลตอบแทนใน asset_returns
  • คำนวณ portfolio_returns โดยใช้ weights ของพอร์ตโฟลิโอ
  • แปลง portfolio_returns เป็น losses
  • VaR: คำนวณ np.quantile() สำหรับ losses ที่ระดับความเชื่อมั่น เช่น 95%
  • สมมติว่าการแจกแจงของความสูญเสียในอนาคต เหมือนกัน กับในอดีตทุกประการ

 

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)
การบริหารความเสี่ยงเชิงปริมาณด้วย Python

Monte Carlo simulation

  • Monte Carlo simulation: ผสานการประมาณค่าแบบพาราเมตริกกับการจำลองได้อย่างทรงพลัง
    • สมมติการแจกแจงสำหรับความสูญเสียพอร์ตโฟลิโอและ/หรือปัจจัยความเสี่ยง
    • ใช้การสุ่มตัวอย่างจากการแจกแจงเพื่อสร้าง เส้นทาง แบบสุ่ม เรียกว่า run
    • ทำซ้ำการสุ่ม $\Rightarrow$ ได้ ชุด ของ simulation runs
  • คำนวณความสูญเสียพอร์ตโฟลิโอจากการจำลองในแต่ละ run จนถึงช่วงเวลาที่ต้องการ
  • หาค่าประมาณ VaR จาก quantile ของความสูญเสียที่จำลองได้
การบริหารความเสี่ยงเชิงปริมาณด้วย Python

Monte Carlo simulation ใน Python

  • ขั้นตอนที่ 1:
    • นำเข้าการแจกแจงปกติ norm จาก scipy.stats
    • กำหนด total_steps (1 วัน = 1440 นาที)
    • กำหนดจำนวน run N
    • คำนวณค่าเฉลี่ย mu และค่าเบี่ยงเบนมาตรฐาน sigma ของข้อมูล portfolio_losses
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
การบริหารความเสี่ยงเชิงปริมาณด้วย Python

Monte Carlo simulation ใน Python

  • ขั้นตอนที่ 2:
    • สร้างเวกเตอร์ daily_loss สำหรับ N runs
    • วนลูปทั้ง N runs
      • คำนวณเวกเตอร์ loss จากการจำลอง Monte Carlo
        • ใช้ norm.rvs() สุ่มตัวอย่างซ้ำจากการแจกแจงปกติมาตรฐาน
        • ปรับค่าที่สุ่มให้สอดคล้องกับข้อมูลโดยใช้ mu และ sigma ที่สเกลด้วย 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) )
การบริหารความเสี่ยงเชิงปริมาณด้วย Python

Monte Carlo simulation ใน Python

  • ขั้นตอนที่ 3:
    • คำนวณ daily_loss สะสมสำหรับแต่ละ run n
    • ใช้ np.quantile() หาค่า VaR ที่ระดับความเชื่อมั่น เช่น 95% จาก 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)
การบริหารความเสี่ยงเชิงปริมาณด้วย Python

การจำลองผลตอบแทนสินทรัพย์

  • การปรับปรุง: สร้างเส้นทางตัวอย่างแบบสุ่มของ ผลตอบแทนสินทรัพย์ ในพอร์ตโฟลิโอ
    • เพิ่มความสมจริง: จำลองผลตอบแทนของสินทรัพย์แต่ละรายการได้
    • ผลตอบแทนสินทรัพย์สามารถมี ความสัมพันธ์ กันได้
      • ทบทวน: เมทริกซ์ความแปรปรวนร่วมที่มีประสิทธิภาพ e_cov
      • ใช้ในขั้นตอนที่ 2 เพื่อคำนวณผลตอบแทนสินทรัพย์
  • แบบฝึกหัด: Monte Carlo simulation พร้อมการจำลองผลตอบแทนสินทรัพย์
การบริหารความเสี่ยงเชิงปริมาณด้วย Python

มาฝึกกันเถอะ!

การบริหารความเสี่ยงเชิงปริมาณด้วย Python

Preparing Video For Download...