σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyFeuilles de routeParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Feuilles de routeParcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyFeuilles de routeParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Feuilles de routeParcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Parcours SciPy›Module 1 · Ajuster et trouver›Sujet 1.5·~50 minIntermédiaire

Portefeuilles sous contraintes avec minimize

Position dans le parcoursModule 1 sur 3 · Sujet 5 sur 8
1.5 Portefeuilles sous contraintes avec minimize
—Score du lab— / 100XP total—Série—

Un optimiseur, c'est une fonction plus des règles

scipy.optimize.minimize(fun, x0, method='SLSQP', bounds=..., constraints=...) trouve le vecteur qui rend fun minimale. On lui donne trois sortes d'informations. L'objectif fun(w) renvoie un nombre à minimiser : pour un portefeuille de variance minimale c'est w @ cov @ w, et pour maximiser quelque chose on minimise son opposé. Les bornes sont une liste de paires (bas, haut), une par poids : (0, cap) signifie pas de vente à découvert et pas de position au-dessus du plafond. Les contraintes sont des dictionnaires : {'type': 'eq', 'fun': lambda w: w.sum() - 1} force les poids à totaliser un, car une fonction eq doit valoir zéro, alors qu'une fonction ineq doit rester supérieure ou égale à zéro. Le point de départ x0 compte aussi : des poids égaux forment un départ raisonnable et admissible.

Deux détails décident de l'exactitude de la réponse. D'abord l'échelle : les variances quotidiennes sont des nombres comme 0,0001, et SLSQP s'arrête quand l'objectif varie de moins que sa tolérance ftol (1e-6 par défaut) ; avec des chiffres quotidiens bruts il peut donc s'arrêter au point de départ sans bouger. Annualisez les entrées (fois 252) et passez options={'ftol': 1e-12, 'maxiter': 500}, et vérifiez toujours result.success et que les poids respectent les règles. Ensuite la formulation : maximiser le ratio de Sharpe est un rapport, donc minimisez -(w @ mu) / sqrt(w @ cov @ w) ; la parité de risque demande des parts de risque égales wᵢ(Σw)ᵢ/ wᵀΣw, donc minimisez les écarts au carré à 1/n ; et une frontière efficiente est un problème de variance minimale par rendement cible, avec une seconde contrainte eq w @ mu - cible.

Ce que disent les vraies donnéesPrenez dix actions, le service public DUK et l'ETF d'or GLD sur les 2 500 derniers jours, avec au plus 25 % dans un actif. Les poids égaux ont une volatilité de 14,6%. Le portefeuille de variance minimale la ramène à 11,9% en détenant 25% d'or, 18% de JNJ et 14% de KO, et ni AAPL ni HD. Le portefeuille de Sharpe maximal rapporte 21,3% par an pour 14,3% de volatilité, un ratio de Sharpe de 1,48, en s'appuyant sur l'or, WMT et CAT : un chiffre qui reflète les dix dernières années, pas les dix prochaines. La parité de risque détient entre 5,8% et 19,6% de chaque actif, l'or étant le plus gros, et chaque actif porte 8,3% du risque.
  • Échelle et tolérance : annualisez les entrées et resserrez ftol, sinon SLSQP peut s'arrêter là où il a commencé.
  • Vérifiez la réponse : les poids doivent totaliser un et respecter les bornes ; regardez result.success.
  • Un outil, quatre problèmes : variance minimale, Sharpe négatif, parts de risque égales et un problème par rendement cible sont tous des appels minimize avec des objectifs et contraintes différents.

Lab : ce qui est noté

  • Entrées annuelles8 pts
  • Rendement et risque d'un portefeuille8 pts
  • Variance minimale avec plafond18 pts
  • Ratio de Sharpe maximal18 pts
  • Contributions au risque10 pts
  • Parité de risque16 pts
  • Une frontière point par point10 pts
  • Trois portefeuilles12 pts
Explorateur · lab-sp-14
▾ lab-sp-14
▾ data
…
bash · dans le navigateur
learner@quantcraft:~/lab-sp-14$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-sp-14 revient aux fichiers de départ et le terminal est vidé. Votre solution actuelle sera perdue : cette action est irréversible.

Sera réinitialisé
  • main.py → code de départ
  • Historique du terminal et sortie des tests
  • Modifications non soumises
Sera conservé
  • Meilleur score du lab
  • Votre XP et votre série
  • Progression du cours et notes

Connectez-vous pour exécuter votre code.

Tous les cours sont gratuits à lire. Créez un compte ou connectez-vous pour exécuter du code, lancer les tests et soumettre ce lab.

  • IDE dans le navigateur avec terminal bash — rien à installer
  • Correction instantanée, XP et votre place dans le parcours
Créer un compteSe connecter
OU
Continuer avec GitHub