top of page
รูปภาพนักเขียนJuglans Regia

การใช้ Python เพื่อคำนวณและวิเคราะห์ความเสี่ยงทางการเงิน

เมื่อต้องจัดการกับข้อมูลทางการเงินและการลงทุน หนึ่งในการพิจารณาที่สำคัญที่สุดคือความเสี่ยง ความเสี่ยงเป็นตัววัดความไม่แน่นอนของผลตอบแทนที่กำหนด มีการใช้ในหลายสาขา เช่น การเงิน การประกันภัย การผลิต และวิศวกรรม Python ซึ่งมีคลังข้อมูลวิทยาศาสตร์ข้อมูลที่กว้างขวางสามารถช่วยเราคำนวณและวิเคราะห์ความเสี่ยงได้อย่างมีประสิทธิภาพ


บทความนี้จะสาธิตวิธีการคำนวณความเสี่ยงประเภทต่างๆ โดยใช้ Python


Requirements

เราต้องใช้ Python libraries ต่อไปนี้:

  1. numpy

  2. pandas

  3. matplotlib

  4. yfinance

pip install numpy pandas matplotlib yfinance


ดึงข้อมูล

ลองดึงข้อมูลของหุ้นสองตัว เช่น Microsoft (MSFT) และ Apple (AAPL) โดยใช้ไลบรารี yfinance:


import yfinance as yf

tickers = ['AAPL', 'MSFT']
data = yf.download(tickers, start="2020-01-01", end="2023-01-01")['Adj Close']

การคำนวณผลตอบแทน


เราคำนวณผลตอบแทนรายวันของหุ้นสองตัวนี้ ซึ่งจะให้เปอร์เซ็นต์การเปลี่ยนแปลงของราคาหุ้นในแต่ละวัน:


returns = data.pct_change()


Calculating Variance และ Standard Deviation (Volatility)

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


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


variance = returns.var() print("Variance: ", variance)  std_dev = returns.std() print("Standard Deviation: ", std_dev)

ยิ่งค่าเบี่ยงเบนมาตรฐานสูง (หรือที่เรียกว่าความผันผวนในเงื่อนไขทางการเงิน) ความเสี่ยงที่เกี่ยวข้องกับการลงทุนก็จะยิ่งสูงขึ้น


Calculating R-squared


R-squared วัดเปอร์เซ็นต์การเคลื่อนไหวของการลงทุนที่เกิดจากการเคลื่อนไหวของดัชนีอ้างอิง เราใช้วิธีเพียร์สันจาก scipy เพื่อคำนวณความสัมพันธ์แล้วยกกำลังสอง:

pythonCopy code
from scipy.stats import pearsonr

correlation, _ = pearsonr(returns['MSFT'], returns['^GSPC'])
r_squared = correlation**2print("R-squared: ", r_squared)

การคำนวณอัตราส่วน Sharpe

Sharpe Ratio วัดผลตอบแทนที่ปรับตามความเสี่ยงที่เกี่ยวข้อง โดยลบด้วยอัตราผลตอบแทนที่ปราศจากความเสี่ยง สมมติว่าอัตราปลอดความเสี่ยง 2% เราคำนวณ Sharpe Ratio:

pythonCopy code
risk_free_rate = 0.02
sharpe_ratio = (returns['MSFT'].mean() - risk_free_rate) / returns['MSFT'].std()
print("Sharpe Ratio: ", sharpe_ratio)

กำลังคำนวณเบต้า

เบต้าวัดความผันผวนหรือความเสี่ยงเชิงระบบของกองทุนเปรียบเทียบกับตลาดที่เลือกหรือดัชนีอ้างอิง เบต้าของหนึ่งบ่งชี้ว่ากองทุนคาดว่าจะเคลื่อนไหวไปพร้อมกับเกณฑ์มาตรฐาน

pythonCopy code
beta = returns.cov().iloc[0, 1] / returns['^GSPC'].var()
print("Beta: ", beta)

การคำนวณอัลฟ่า

อัลฟ่าวัดผลตอบแทนส่วนเกินที่เกี่ยวข้องกับตลาดที่เลือกหรือดัชนีอ้างอิง หากกองทุนทำงานได้ดีกว่าเกณฑ์มาตรฐาน จะถือว่าเป็นผลบวกขั้นอัลฟ่า หากกองทุนต่ำกว่า Benchmark Performance ถือว่าติดลบ

pythonCopy code
expected_return = risk_free_rate + beta * (returns['^GSPC'].mean() - risk_free_rate)
alpha = returns['MSFT'].mean() - expected_return
print("Alpha: ", alpha)

กำลังคำนวณ VaR. and CVaR. with Python

CVaR หรือที่เรียกว่าการขาดแคลนที่คาดหวัง วัดผลขาดทุนที่คาดว่าจะเกิดขึ้นของการลงทุนที่เกิดขึ้นต่ำกว่าจุด VaR กล่าวอีกนัยหนึ่งคือค่าเฉลี่ยของการสูญเสียทั้งหมดที่แย่กว่าค่าประมาณของ VaR


ลองคำนวณ CVaR ที่ระดับความเชื่อมั่น 95%:



# Calculate CVaR cvar_95 = returns[returns <= var_95].mean() print('Conditional Value at Risk (95% confidence level): ', cvar_95)

Calculating Semi-Deviation with Python

Semi-Deviation คือส่วนเบี่ยงเบนมาตรฐานของผลตอบแทนที่น้อยกว่าผลตอบแทนเฉลี่ยหรือระดับผลตอบแทนที่ระบุ เป็นการวัดความเสี่ยงที่สำคัญสำหรับนักลงทุนที่กังวลเกี่ยวกับความเสี่ยงด้านลบ


สมมติว่าเรายังมีข้อมูลผลตอบแทนจากตัวอย่างก่อนหน้านี้ เราสามารถคำนวณค่ากึ่งเบี่ยงเบนได้:


defsemi_deviation(returns):     
"""     Returns the semideviation aka negative semideviation of returns.     """

is_negative = returns < returns.mean()     

return returns [is_negative].std(ddof=0)  semi_dev = semi_deviation(returns) print("Semi-deviation: ", semi_dev)

ใน code นี้ is_negative เป็นชุดบูลีนที่ระบุว่าการส่งคืนแต่ละครั้งต่ำกว่าค่าเฉลี่ยหรือไม่ การดำเนินการสร้างดัชนี return[is_negative] จะแสดงเฉพาะผลตอบแทนที่ต่ำกว่าค่าเฉลี่ย และสุดท้าย .std(ddof=0) จะคำนวณค่าเบี่ยงเบนมาตรฐานของผลตอบแทนเหล่านั้น อาร์กิวเมนต์ ddof=0 บอกให้แพนด้าปรับผลลัพธ์ให้เป็นมาตรฐานด้วย N แทนที่จะเป็น N-1 โดยให้ค่าประมาณที่มีอคติน้อยลงเล็กน้อยเมื่อทำงานกับขนาดตัวอย่างขนาดเล็ก


Calculating Maximum Drawdown

Maximum Drawdown (MDD) คือการสูญเสียสูงสุดจากจุดสูงสุดไปยังจุดต่ำสุดของพอร์ตโฟลิโอ ก่อนที่จะถึงจุดสูงสุดใหม่ เป็นตัวบ่งชี้ความเสี่ยงขาลงในช่วงเวลาที่กำหนด


เราสามารถคำนวณ Maximum Drawdown ได้โดยใช้ขั้นตอนต่อไปนี้:


คำนวณมูลค่าสูงสุดของพอร์ตโฟลิโอ (ซึ่งจะเป็นมูลค่าสูงสุด ณ เวลาปัจจุบัน)

คำนวณการลดลงเป็นผลต่างระหว่างค่าสูงสุดที่รันอยู่และมูลค่าพอร์ตปัจจุบัน

คำนวณ Maximum Drawdown เป็น Drawdown สูงสุดในช่วงเวลาที่กำหนด

มาคำนวณ Drawdown สูงสุดสำหรับพอร์ตของเรา:


def max_drawdown(returns):
    """
    Takes a time series of asset returns.
    Returns a float for maximum drawdown.
    """
    # Calculate the running maximum
    run_max = np.maximum.accumulate(returns.dropna())
    # Ensure the value never drops below 1
    run_max[run_max < 1] = 1
    # Calculate the running drawdown
    drawdown = (returns/run_max) - 1
    # Calculate the maximum drawdown
    max_dd = drawdown.min()
    return max_dd

mdd = max_drawdown(returns)
print("Maximum Drawdown: ", mdd)





0 ความคิดเห็น

โพสต์ล่าสุด

ดูทั้งหมด

Comments


bottom of page