σμ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 Academyロードマップスキル
Ctrl K
AO
+1.2k 人の学習者
ログイン参加する ↗
ロードマップスキル
AO
+1.2k 人の学習者
ログイン
  • 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 Academyロードマップスキル
Ctrl K
AO
+1.2k 人の学習者
ログイン参加する ↗
ロードマップスキル
AO
+1.2k 人の学習者
ログイン
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
SciPy スキル›モジュール 1 · 当てはめと探索›トピック 1.5·~50 分中級

Minimizeによる制約付きポートフォリオ

スキル上の位置モジュール 1/3 · トピック 5/8
1.5 Minimizeによる制約付きポートフォリオ
—ラボスコア— / 100合計XP—連続日数—

最適化とは関数にルールを足したもの

scipy.optimize.minimize(fun, x0, method='SLSQP', bounds=..., constraints=...) は fun を最小にするベクトルを探します。与える情報は3種類です。目的関数 fun(w) は最小化する数を返します。最小分散ポートフォリオなら w @ cov @ w で、何かを最大化したいときはその符号を反転して最小化します。境界は重みごとの (下限, 上限) のリストで、(0, cap) は空売りなし・上限超えのポジションなしを意味します。制約は辞書で、{'type': 'eq', 'fun': lambda w: w.sum() - 1} は重みの合計を1にします(eq の関数は0に等しく、ineq の関数は0以上でなければなりません)。出発点 x0 も重要で、等ウェイトは妥当で実行可能な出発点です。

2つの細部が答えの正しさを決めます。第一にスケールです。日次の分散は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 との差の二乗和を最小化し、効率的フロンティアは目標リターンごとの最小分散問題で、w @ mu - target という2つ目の eq 制約を加えます。

実データが語ること10銘柄の株式、公益事業のDUK、金ETFのGLDを直近2,500日で取り、1資産あたり最大25%とします。等ウェイトのボラティリティは 14.6% です。最小分散ポートフォリオは金 25%、JNJ 18%、KO 14% を持ち、AAPLとHDは持たずに、これを 11.9% に下げます。最大シャープ・ポートフォリオは金、WMT、CAT に傾けて年 21.3% のリターンをボラティリティ 14.3% で得て、シャープレシオは 1.48 ですが、これは過去10年を映した数字で、次の10年ではありません。リスクパリティは各資産を 5.8% から 19.6% 持ち(金が最大)、どの資産もリスクの 8.3% を担います。
  • スケールと許容誤差:入力を年率換算し ftol を厳しくしないと、SLSQPは出発点で止まることがある。
  • 答えを確かめる:重みの合計は1で境界を守ること。result.success を見る。
  • 1つの道具、4つの問題:最小分散、負のシャープレシオ、等リスク割合、目標リターンごとの問題は、目的関数と制約が違うだけの minimize 呼び出し。

ラボ:採点される内容

  • 年率の入力8点
  • ポートフォリオのリターンとリスク8点
  • 上限付き最小分散18点
  • シャープレシオの最大化18点
  • リスク寄与10点
  • リスクパリティ16点
  • フロンティアを一点ずつ10点
  • 3つのポートフォリオ12点
エクスプローラー · lab-sp-14
▾ lab-sp-14
▾ data
…
bash · ブラウザ内
learner@quantcraft:~/lab-sp-14$
Pythonは未読み込みPythonLn 1, Col 1Spaces: 4UTF-8

このトピックをリセットしますか?

lab-sp-14 の内容はすべてスターターファイルに戻り、ターミナルも消去されます。現在の解答は失われ、元に戻せません。

リセットされるもの
  • main.py → スターターコード
  • ターミナル履歴とテスト出力
  • 未提出の変更
保持されるもの
  • ラボの最高スコア
  • XPと連続日数
  • 講義の進捗とメモ

コードを実行するにはログインしてください。

レクチャーはすべて無料で読めます。コードの実行、テスト、ラボの提出にはアカウントの作成かログインが必要です。

  • ブラウザ内IDEとbashターミナル。インストール不要
  • 即時採点、XP、スキルでの現在地
アカウントを作成ログイン
または
GitHubで続ける