المُحسِّن دالة وقواعد
تجد scipy.optimize.minimize(fun, x0, method='SLSQP', bounds=..., constraints=...) المتجه الذي يجعل fun أصغر ما يمكن. تعطيها ثلاثة أنواع من المعلومات. الهدف fun(w) يعيد عددًا يُصغَّر: لمحفظة أدنى تباين هو w @ cov @ w ولتعظيم شيء تصغّر سالبه. والحدود قائمة أزواج (أدنى، أعلى) لكل وزن: (0, cap) تعني لا بيع على المكشوف ولا مركزًا فوق السقف. والقيود قواميس: {'type': 'eq', 'fun': lambda w: w.sum() - 1} يجبر الأوزان على أن يكون مجموعها واحدًا لأن دالة eq يجب أن تساوي صفرًا بينما دالة ineq يجب أن تبقى أكبر من الصفر أو تساويه. ونقطة البداية x0 مهمة أيضًا: الأوزان المتساوية بداية معقولة وممكنة.
تفصل تفصيلتان في صحة الجواب. الأولى المقياس: التباينات اليومية أعداد مثل 0.0001 وتتوقف SLSQP حين يتغير الهدف بأقل من تفاوتها ftol (الافتراضي 1e-6) فبالأرقام اليومية الخام قد تتوقف عند نقطة البداية دون أن تتحرك. اجعل المدخلات سنوية (ضرب 252) ومرّر options={'ftol': 1e-12, 'maxiter': 500} وافحص دائمًا result.success وأن الأوزان تحترم القواعد. الثانية الصياغة: تعظيم نسبة شارب نسبة فصغّر -(w @ mu) / sqrt(w @ cov @ w)؛ وتكافؤ المخاطر يطلب حصص مخاطر متساوية wᵢ(Σw)ᵢ/ wᵀΣw فصغّر مربعات الفروق عن 1/n؛ والحدود الكفؤة مسألة أدنى تباين لكل عائد مستهدف مع قيد eq ثانٍ هو w @ mu - target.
- المقياس والتفاوت: اجعل المدخلات سنوية وشدّد
ftolوإلا قد تتوقف SLSQP حيث بدأت. - افحص الجواب: يجب أن يكون مجموع الأوزان واحدًا وأن تحترم الحدود؛ انظر إلى
result.success. - أداة واحدة وأربع مسائل: أدنى تباين وشارب سالب وحصص مخاطر متساوية ومسألة لكل عائد مستهدف كلها استدعاءات
minimizeبأهداف وقيود مختلفة.
المختبر: ما الذي يُقيَّم
- مدخلات سنوية8 نقطة
- عائد ومخاطر محفظة8 نقطة
- أدنى تباين مع سقف18 نقطة
- أقصى نسبة شارب18 نقطة
- مساهمات المخاطر10 نقطة
- تكافؤ المخاطر16 نقطة
- حدود كفؤة نقطة بنقطة10 نقطة
- ثلاث محافظ12 نقطة