เมื่อต้องจัดการกับข้อมูลทางการเงินและการลงทุน หนึ่งในการพิจารณาที่สำคัญที่สุดคือความเสี่ยง ความเสี่ยงเป็นตัววัดความไม่แน่นอนของผลตอบแทนที่กำหนด มีการใช้ในหลายสาขา เช่น การเงิน การประกันภัย การผลิต และวิศวกรรม Python ซึ่งมีคลังข้อมูลวิทยาศาสตร์ข้อมูลที่กว้างขวางสามารถช่วยเราคำนวณและวิเคราะห์ความเสี่ยงได้อย่างมีประสิทธิภาพ
บทความนี้จะสาธิตวิธีการคำนวณความเสี่ยงประเภทต่างๆ โดยใช้ Python
Requirements
เราต้องใช้ Python libraries ต่อไปนี้:
numpy
pandas
matplotlib
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)
Comments