المحفظة متجه من الأوزان
توصف المحفظة بـوزن لكل أصل: الجزء من قيمتها المستثمر فيه. تجمع الأوزان إلى 1، والوزن السالب مركز بيع يموّل البقية. وعائدها خلال فترة هو المتوسط المرجّح لعوائد الأصول، فالعائد المتوقع حاصل ضرب نقطي w @ mu. والعائد هو النصف السهل: خطي بلا تفاعل بين الأصول. أما المخاطر فلا.
import numpy as np
weights = np.array([0.6, 0.4]) # 60% in asset A, 40% in asset B
mu = np.array([0.08, 0.05]) # expected annual returns
print(weights.sum()) # 1.0
print(weights @ mu) # 0.068 = 0.6 * 0.08 + 0.4 * 0.05التباين صيغة تربيعية
بالنسبة إلى أصلين فإن تباين w1 * A + w2 * B هو w1**2 * var(A) + w2**2 * var(B) + 2 * w1 * w2 * cov(A, B): تباين كل أصل بنفسه مضافًا إليه حد متقاطع. ومع n أصلًا توجد n * n حدًا هي w_i * w_j * cov[i, j]، والمجموع كله هو الصيغة التربيعية w @ cov @ w، سطر واحد في NumPy. والحدود المتقاطعة هي لب الموضوع: إذا لم يكن الأصلان مرتبطين تمامًا ألغى كل منهما بعض الآخر، فتكون المحفظة أقل خطرًا من المتوسط المرجّح للمخاطر.
# The variance two ways: the explicit formula and the matrix form
import numpy as np
weights = np.array([0.6, 0.4])
cov = np.array([[0.04, 0.006], [0.006, 0.01]]) # variances 0.04 and 0.01 (volatilities 20% and 10%), covariance 0.006
explicit = weights[0] ** 2 * cov[0, 0] + weights[1] ** 2 * cov[1, 1] + 2 * weights[0] * weights[1] * cov[0, 1]
matrix_form = weights @ cov @ weights
print(round(explicit, 6), round(matrix_form, 6)) # 0.01888 0.01888
print(round(float(np.sqrt(matrix_form)), 4)) # 0.1374 a 13.7% volatility, below 0.6*20% + 0.4*10% = 16%# Diversification: 50/50 in two assets of 20% volatility, for several correlations
import numpy as np
weights = np.array([0.5, 0.5])
for rho in (1.0, 0.5, 0.0, -0.5):
cov = 0.2 * 0.2 * np.array([[1.0, rho], [rho, 1.0]])
print(rho, round(float(np.sqrt(weights @ cov @ weights)), 4)) # 1.0: 0.2, 0.5: 0.1732, 0.0: 0.1414, -0.5: 0.1من أين تأتي المخاطر؟
يريد المدير معرفة المراكز التي تصنع المخاطر. ومساهمة المخاطر للأصل i هي w_i * (cov @ w)_i / sigma_p: وزنه مضروبًا في شدة تحركه مع المحفظة كلها، مقسومًا على تقلب المحفظة sigma_p. وتجمع المساهمات تمامًا إلى sigma_p فتقسم الإجمالي إلى أجزاء. وقد يساهم أصل قليل الوزن عالي التغاير مع الباقي أكثر بكثير مما يوحي وزنه، وقد تساهم التحوطات مساهمة سالبة.
# Risk contributions of a three-asset portfolio: they add up to the volatility
import numpy as np
weights = np.array([0.5, 0.3, 0.2])
cov = np.array([[0.0400, 0.0060, 0.0100],
[0.0060, 0.0100, 0.0020],
[0.0100, 0.0020, 0.0225]])
variance = weights @ cov @ weights
contributions = weights * (cov @ weights) / np.sqrt(variance)
print(np.round(contributions, 4), round(float(contributions.sum()), 4))
print(round(float(np.sqrt(variance)), 4))mu وcov تقديرات، والتباين أوثق الاثنين: فالعوائد المتوقعة كثيرة الضجيج والتغايرات أقل بكثير. ويجب أن تشترك الأوزان وmu وcov في الفترة نفسها: ومن الأخطاء الشائعة تغاير يومي مع عوائد سنوية؛ يُضرب التباين في عدد الفترات والتقلب في جذره.- عائد المحفظة خطي:
w @ mu. والتباين هو الصيغة التربيعيةw @ cov @ wبـn * nحدًا وحدود متقاطعة تجعل ارتباطًا أقل من 1 يخفض المخاطر. - التقلب هو
sqrt(variance * periods)؛ ويجب أن تطابق السنوية فترةcov. - مساهمات المخاطر
w_i * (cov @ w)_i / sigma_pتوزع التقلب بالضبط على الأصول؛ وقد يساهم التحوط بقيمة سالبة.
التالي: محفظة التباين الأدنى، اختيار الأوزان التي تجعل هذه المخاطر أصغر ما يمكن.
المختبر: ما الذي يُقيَّم
- اجمع العائد المتوقع باستخدام
portfolio_return25 نقطة - قِس المخاطر باستخدام
portfolio_variance25 نقطة - اذكر التقلب باستخدام
portfolio_vol25 نقطة - وزّع المخاطر على الأصول باستخدام
risk_contributions25 نقطة