enter image description here การจำลองแบบมอนติคาร์โลเป็นเทคนิคที่ประมาณวิธีแก้ปัญหาด้วยวิธีการสุ่มตัวอย่างทางสถิติ ในระยะสั้นแบบจำลองความเป็นไปได้จำนวนมาก
Monte carlo ใช้อย่างมากในการประเมินความเสี่ยง กรณีการใช้งานที่เป็นที่นิยมคือการคำนวณความเสี่ยงหรือการลดลงของผลงาน / กลยุทธ์ มันจำลองผลลัพธ์ที่เป็นไปได้จำนวนมากของพอร์ตการลงทุนต่างๆซึ่งช่วยให้นักลงทุนในการคำนวณความเสี่ยง
กรณีการใช้งานอื่น ๆ คือการประเมินผลตอบแทนของพอร์ตการลงทุนที่แตกต่างกัน ผลตอบแทนพอร์ตสามารถถูกจำลองโดย Monte carlo ซึ่งทำให้เรามีมุมมองที่น่าจะเป็นของผลตอบแทนที่คาดหวังในฟิวเจอร์ส ผลตอบแทนของกองทุนรวมและ SIP ต่างๆสามารถประมาณได้โดยการจำลอง
ช่วยแก้ไขปัญหาของการประมาณผลตอบแทนพอร์ตการลงทุน
การประเมินผลงาน / ผลตอบแทน SIP โดยใช้ python: คำแถลงปัญหาคลาสสิคของนักลงทุนทั่วไปคือผลตอบแทนเท่าไหร่ที่ฉันจะได้รับถ้าฉันลงทุน 100k ในพอร์ตโฟลิโอนี้หรือ SIP
ในบทความนี้เราจะพยายามสร้างแบบจำลองเชิงปริมาณซึ่งตอบคำชี้แจงปัญหาโดยใช้วิธีการทางสถิติเช่น Monte Carlo
คำชี้แจงปัญหา:- เริ่มต้น SIP และลงทุน 10k ต่อปีเป็นเวลา 20 ปีความน่าจะเป็นที่คุณจะมีอย่างน้อย 500k โดยการลงทุนในพอร์ตโฟลิโอ Nifty50 คืออะไร?
เพื่อสร้างผลตอบแทนเราจะใช้สองปัจจัย
ผลตอบแทนประจำปีของ Nifty50
ความผันผวนในแง่ของค่าเบี่ยงเบนมาตรฐานของ Nifty50
ผลตอบแทนประจำปีของดัชนี Nifty50 อยู่ที่ประมาณ 6% ซึ่ง STD อยู่ที่ประมาณ 14% ให้ใช้พารามิเตอร์ที่กำหนดข้างต้นเพื่อสร้างแบบจำลอง
Copy 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
Copy 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 ขึ้นไปและผลลัพธ์นั้นออกมาค่อนข้างดี
การจำลองแบบครั้งเดียวสามารถกลายเป็นสิ่งผิดปกติและเราจำเป็นต้องเพิ่มขนาดตัวอย่างของเราเพื่อดูภาพรวมทั้งหมดเพื่อตัดสินใจว่าจะนำเงินที่แข็งของเราไปหรือไม่
ให้ลองจำลองและสร้างผลลัพธ์ที่จะทำให้เราเข้าใจถึงสถานการณ์
Copy 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
Output
Copy 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
ในการรับข้อมูลเชิงลึกของผลการจำลองเรากำลังใช้การวัดทางสถิติ
Copy 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 ))
Copy Mean: 394473.53
STD: 155635.64
MAX: 1226694.81
Min: 111881.56
เราสามารถเห็นค่าเฉลี่ยของการจำลองอยู่ที่ประมาณ 400k ซึ่งค่าสูงสุดคือประมาณ 1,200k และมูลค่าพอร์ตขั้นต่ำคือประมาณ 100k
ฮิสโตแกรมแสดงการกระจายที่ชัดเจน ลองพล็อตฮิสโตแกรมของผลตอบแทนจำลอง
Copy plt . hist (df.iloc[ - 1 ,:], bins = 100 ) ;
ตามที่คาดไว้ผลตอบแทนฮิสโตแกรมจะกระจายแบบสมมาตรในขณะที่ค่าเฉลี่ยอยู่ระหว่าง 300–400 k
ตามปัญหาพบว่าความน่าจะเป็นที่จะได้รับผลตอบแทนจากการลงทุนมากกว่า 500k
Copy sum (df.iloc[ - 1 ,:] >= 500000 ) / len (df.iloc[ - 1 ,:])
0.212
ดังนั้นตามการจำลองในปัจจุบันความน่าจะเป็นของผลตอบแทนการลงทุน 500k อยู่ที่ประมาณ 20%
แม้ว่าผลตอบแทนจะไม่เป็นอย่างที่เราคาดไว้ แต่ให้แบ่งผลตอบแทนเป็นความน่าจะเป็นต่อไป
Copy 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 ) } ' )
Copy 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 :