คำนวณพอร์ตโฟลิโอ
ต่อไปจะสร้างพอร์ตโฟลิโอเพื่อค้นหาพอร์ตโฟลิโอที่ดีที่สุดของแต่ละเดือน โดย random.random() ของ numpy จะสุ่มตัวเลขจากการแจกแจงแบบสม่ำเสมอ จากนั้นนำมาปรับให้ผลรวมเป็น 1 ด้วยตัวดำเนินการ /= แล้วนำน้ำหนักเหล่านี้ไปคำนวณผลตอบแทนและความผันผวน ผลตอบแทนคือผลรวมของน้ำหนักคูณผลตอบแทนรายตัว ส่วนความผันผวนมีความซับซ้อนกว่า เนื่องจากต้องคำนึงถึงค่าความแปรปรวนร่วมของหุ้นแต่ละตัวด้วย
สุดท้าย จะเก็บค่าต่าง ๆ ไว้ในดิกชันนารีเพื่อใช้ในภายหลัง โดยใช้วันที่ของแต่ละเดือนเป็นคีย์
ในแบบฝึกหัดนี้ จะสร้างเพียง 10 พอร์ตโฟลิโอต่อวันที่เพื่อให้โค้ดรันได้เร็วขึ้น แต่ในการใช้งานจริง ควรสร้างพอร์ตโฟลิโอแบบสุ่มประมาณ 1,000 ถึง 5,000 พอร์ตโฟลิโอสำหรับหุ้นไม่กี่ตัว
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Machine Learning สำหรับการเงินด้วย Python
คำแนะนำการฝึกหัด
- สุ่มตัวเลข 3 ค่าสำหรับน้ำหนักโดยใช้
np.random.random() - คำนวณ
returnsโดยหาผลคูณดอต (np.dot()ซึ่งคูณแบบ element-by-element แล้วหาผลรวมของอาร์เรย์ทั้งสอง) ระหว่างweightsกับผลตอบแทนรายเดือนของdateปัจจุบันในลูป - ใช้เมธอด
.setdefault()เพื่อเพิ่มลิสต์ว่าง ([]) ลงในดิกชันนารีportfolio_weightsสำหรับdateปัจจุบัน จากนั้น appendweightsเข้าไปในลิสต์นั้น
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
portfolio_returns, portfolio_volatility, portfolio_weights = {}, {}, {}
# Get portfolio performances at each month
for date in sorted(covariances.keys()):
cov = covariances[date]
for portfolio in range(10):
weights = np.random.random(____)
weights /= np.sum(weights) # /= divides weights by their sum to normalize
returns = np.dot(____, returns_monthly.loc[____])
volatility = np.sqrt(np.dot(weights.T, np.dot(cov, weights)))
portfolio_returns.setdefault(date, []).append(returns)
portfolio_volatility.setdefault(date, []).append(volatility)
portfolio_weights.setdefault(date, ____).append(____)
print(portfolio_weights[date][0])