Monte Carlo Simulation in Finance Python Part-2

enter image description here

การจำลองแบบมอนติคาร์โลเป็นเทคนิคที่ประมาณวิธีแก้ปัญหาด้วยวิธีการสุ่มตัวอย่างทางสถิติ ในระยะสั้นแบบจำลองความเป็นไปได้จำนวนมาก

Monte carlo ใช้อย่างมากในการประเมินความเสี่ยง กรณีการใช้งานที่เป็นที่นิยมคือการคำนวณความเสี่ยงหรือการลดลงของผลงาน / กลยุทธ์ มันจำลองผลลัพธ์ที่เป็นไปได้จำนวนมากของพอร์ตการลงทุนต่างๆซึ่งช่วยให้นักลงทุนในการคำนวณความเสี่ยง

กรณีการใช้งานอื่น ๆ คือการประเมินผลตอบแทนของพอร์ตการลงทุนที่แตกต่างกัน ผลตอบแทนพอร์ตสามารถถูกจำลองโดย Monte carlo ซึ่งทำให้เรามีมุมมองที่น่าจะเป็นของผลตอบแทนที่คาดหวังในฟิวเจอร์ส ผลตอบแทนของกองทุนรวมและ SIP ต่างๆสามารถประมาณได้โดยการจำลอง

ช่วยแก้ไขปัญหาของการประมาณผลตอบแทนพอร์ตการลงทุน

การประเมินผลงาน / ผลตอบแทน SIP โดยใช้ python: คำแถลงปัญหาคลาสสิคของนักลงทุนทั่วไปคือผลตอบแทนเท่าไหร่ที่ฉันจะได้รับถ้าฉันลงทุน 100k ในพอร์ตโฟลิโอนี้หรือ SIP

ในบทความนี้เราจะพยายามสร้างแบบจำลองเชิงปริมาณซึ่งตอบคำชี้แจงปัญหาโดยใช้วิธีการทางสถิติเช่น Monte Carlo

คำชี้แจงปัญหา:- เริ่มต้น SIP และลงทุน 10k ต่อปีเป็นเวลา 20 ปีความน่าจะเป็นที่คุณจะมีอย่างน้อย 500k โดยการลงทุนในพอร์ตโฟลิโอ Nifty50 คืออะไร?

เพื่อสร้างผลตอบแทนเราจะใช้สองปัจจัย

  1. ผลตอบแทนประจำปีของ Nifty50

  2. ความผันผวนในแง่ของค่าเบี่ยงเบนมาตรฐานของ Nifty50

ผลตอบแทนประจำปีของดัชนี Nifty50 อยู่ที่ประมาณ 6% ซึ่ง STD อยู่ที่ประมาณ 14% ให้ใช้พารามิเตอร์ที่กำหนดข้างต้นเพื่อสร้างแบบจำลอง

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
investment = 10000
expected_returns = 0.06
volatility = 0.14
duration = 20
sip = 10000
print('  \t Returns', '\t\tEnding Value'.rjust(18))
for year in range(duration):
    print(year)
    market_return = np.random.normal(expected_returns, volatility)
    final_value = sip + (1+ market_return)* investment
    print("\t{}".ljust(10).format(round(market_return, 4)), "\t{}".rjust(10).format(round(final_value, 4)))
    investment = final_value

โค้ดด้านบนจำลองการกลับมา 20 ปีและคืนค่าสุดท้ายของพอร์ตการลงทุน

Output

Returns             Ending Value
0
    0.2561                   22561.1289
1
    0.0928                   34655.5092
2
    -0.138                   39872.5064
3
    0.0865                   53321.1093
4
    0.1583                   71759.1796
5
    0.1259                   90790.097
6
    0.1115                   110909.6445
7
    0.1718                   139965.8365
8
    -0.0201                   147155.0691
9
    0.2655                   196220.1049
10
    -0.0236                   201591.5015
11
    -0.042                   203119.0258
12
    0.167                   247035.5294
13
    0.1628                   297265.0747
14
    0.1371                   348032.9352
15
    0.1336                   404539.7198
16
    0.007                   417365.869
17
    0.1163                   475910.538
18
    0.2389                   599617.6013
19
    0.0652                   648696.5622

จากผลการจำลองปัจจุบันดูเหมือนว่าคำตอบคือใช่ มูลค่าของพอร์ตโฟลิโอผลลัพธ์อยู่ที่ 500k ขึ้นไปและผลลัพธ์นั้นออกมาค่อนข้างดี

การจำลองแบบครั้งเดียวสามารถกลายเป็นสิ่งผิดปกติและเราจำเป็นต้องเพิ่มขนาดตัวอย่างของเราเพื่อดูภาพรวมทั้งหมดเพื่อตัดสินใจว่าจะนำเงินที่แข็งของเราไปหรือไม่

ให้ลองจำลองและสร้างผลลัพธ์ที่จะทำให้เราเข้าใจถึงสถานการณ์

df = pd.DataFrame()
for i in range(500):
    investment = 10000
    expected_returns = 0.06
    volatility = 0.14
    duration = 20
    sip = 10000
    
    lst = []
#     print('  \t Returns', '\t\tEnding Value'.rjust(18))
    for year in range(duration):
#         print(year)
        market_return = np.random.normal(expected_returns, volatility)
        final_value = sip + (1+ market_return)* investment
#         print("\t{}".ljust(10).format(round(market_return, 4)), "\t{}".rjust(10).format(round(final_value, 4)))
        investment = final_value
        lst.append(final_value)
    df[i] = lst

โค้ดด้านบนจำลองมากกว่า 500 ครั้งและเราจัดเก็บข้อมูลการจำลองเหล่านี้ในดาต้าดาต้าแพนด้า ให้แสดงภาพส่วนหนึ่งของ dataframe

print(df.iloc[:,:2])

Output

0	1                2
0	22229.617943	20448.533158
1	24306.715133	31140.648303
2	35994.308855	39891.312089
3	43963.087734	50062.167564
4	51900.883942	66432.370685
5	62479.300162	75099.172307
6	65524.730433	73787.355658
7	85917.589865	89581.500809
8	91266.728728	112813.745519
9	97294.635250	115973.096606
10	103298.761423	144182.382385
11	91994.696511	151277.935357
12	123640.768882	187179.876949
13	154033.683903	171367.689533
14	147973.296061	183643.805901
15	155503.105608	205900.096716
16	171824.790117	247289.885521
17	208563.569766	248932.183502
18	237226.274566	270236.831931
19	321988.322998	305742.421754

ในการรับข้อมูลเชิงลึกของผลการจำลองเรากำลังใช้การวัดทางสถิติ

print('Mean: ', round(df.iloc[-1,:].mean(), 2))
print('STD: ', round(df.iloc[-1,:].std(), 2))
print('MAX: ', round(df.iloc[-1,:].max(), 2))
print('Min: ', round(df.iloc[-1,:].min(), 2))
Mean:  394473.53
STD:  155635.64
MAX:  1226694.81
Min:  111881.56

เราสามารถเห็นค่าเฉลี่ยของการจำลองอยู่ที่ประมาณ 400k ซึ่งค่าสูงสุดคือประมาณ 1,200k และมูลค่าพอร์ตขั้นต่ำคือประมาณ 100k

ฮิสโตแกรมแสดงการกระจายที่ชัดเจน ลองพล็อตฮิสโตแกรมของผลตอบแทนจำลอง

plt.hist(df.iloc[-1,:], bins = 100);

ตามที่คาดไว้ผลตอบแทนฮิสโตแกรมจะกระจายแบบสมมาตรในขณะที่ค่าเฉลี่ยอยู่ระหว่าง 300–400 k

ตามปัญหาพบว่าความน่าจะเป็นที่จะได้รับผลตอบแทนจากการลงทุนมากกว่า 500k

sum(df.iloc[-1,:] >= 500000)/len(df.iloc[-1,:])
0.212

ดังนั้นตามการจำลองในปัจจุบันความน่าจะเป็นของผลตอบแทนการลงทุน 500k อยู่ที่ประมาณ 20%

แม้ว่าผลตอบแทนจะไม่เป็นอย่างที่เราคาดไว้ แต่ให้แบ่งผลตอบแทนเป็นความน่าจะเป็นต่อไป

percentile = np.percentile(df.iloc[-1,:], [5, 10, 15, 25, 50, 75, 85, 90, 95] )
for i in range(len(percentile)):
    l = [5, 10, 15, 25, 50, 75, 85, 90, 95]
    print(f'  { 100 - l[i] } % percent probability final value >= {round( percentile[i], 2)} ')
95 % percent probability final value >= 201723.86 
  90 % percent probability final value >= 223506.64 
  85 % percent probability final value >= 248068.5 
  75 % percent probability final value >= 281118.68 
  50 % percent probability final value >= 367363.73 
  25 % percent probability final value >= 464394.42 
  15 % percent probability final value >= 540143.74 
  10 % percent probability final value >= 586180.1 
   5 % percent probability final value >= 681661.15

โค้ดข้างต้นแบ่งการจำลองเป็นกลุ่มความน่าจะเป็นซึ่งช่วยให้เราเข้าใจถึงผลตอบแทนได้ดีขึ้นด้วยความน่าจะเป็น ห่อสิ่งต่าง ๆ ขึ้นมา

ในบทช่วยสอนนี้เราเรียนรู้วิธีการใช้แบบจำลอง Monte Carlo ในการประมาณผลตอบแทนจากการลงทุน

โปรดกลับมาตรวจสอบอีกครั้งในตอนที่ 3 ของบทช่วยสอนนี้ซึ่งเราจะอธิบายวิธีการใช้แบบจำลองเพื่อการจัดการความเสี่ยง

Source :

Last updated

Was this helpful?