粒子フィルタ使って実装したい (2.5)

はじめに

前回に、先生に見せるようにマーコビッツ最小分散ポートフォリオとそのフロンティアについて少しプログラムを書きました。

正直、世の中にはもっとよいライブラリがあってそっちを使いたい。そんなことを理論と折り込みながら書いていきます。

ポートフォリオの構築

最適ポートフォリオを構築するには一期先リターンの平均と分散の推定値が必要です。

↓ここで、自己組織化状態空間モデルを用いてそれら平均と分散を推定するという理論部分を多少なり書きました。

pwn.hatenablog.com

ここで、問題になってくるのが何を持って最適ポートフォリオと云えるのでしょうか?

などがそれらに当たります。
前回のブログでは、最小分散ポートフォリオの制約のもとでポートフォリオの重みを出しました。
そこで、今から3つのポートフォリオの構築方法について書いていきます。

平均分散ポートフォリオ

最適な重み \omega_t^{*} は以下のように定義できます。

 max \hspace{10px} \mu_t' \omega_t - \frac{ \gamma}{2} \omega_t' \Sigma_t \omega_t

 \text{Subject to}

 \hspace{10px} \omega_t \geq 0 \\
\omega_t' \mathbb{1} \leq 1

 \mu_t \, \cdots y_{t+1} = (y_{t+1}^1, \cdots, y_{t+1}^n)' の条件付き期待値
 \Sigma_t \, \cdots y_{t+1} = (y_{t+1}^1, \cdots, y_{t+1}^n)' の条件付き共分散行列
 \omega_{t} = (\omega_{t}^1, \cdots, y_{t}^n)' は時点 tから t+1までの危険資産への投資比率ベクトルと云えます。その逆 1 - \omega_t' \mathbb{1}は安全資産の投資比率と云えます。
 \gamma リスク回避度と云い、頑健性を確保するために, 多様なケースを試す必要があります。

リスクパリティ(Risk Parity)

最適な重み \omega_t^{*} は以下のように定義できます。

\( \omega_t^{*} = \{ \omega_t \in [0,1 ]^{n} \, ; \, \sum^{n}_{i=1} \omega_{t}^i = 1, \, \omega_{t}^{i} \)  \times (\Sigma_t \omega_{t} )_{i} = \frac{1}{n}  \omega_{t} ' \Sigma_t \omega_{t}  \, \, i = 1, \cdots , n \}

\(n \)次元ベクトル\(a\)に対して (a)_i  i番目の要素を表します。

リスクパリティは、ボラティリティの高い資産及び他の資産との相関の高い資産への投資比率を下げ、相関が低い資産への投資比率を上げるポートフォリオを云えます。
なぜそのようにするかというと、ポートフォリオというかファイナンスというか統計?において資産同士の分散が大きいのは嬉しいものです。

最小分散ポートフォリオ

最適な重み \omega_t^{*} は以下のように定義できます。

 min \, \, \omega_t ' \Sigma _t \omega_t

 \text{subject to}

 r^{T} \omega_t \geq r_{0} \\
\omega_t \geq 0 \\
 \omega_t ' \mathbb{1} \leq 1  \, \, (= \sum \omega_t \leq 1 )

ペナルティ付き平均分散ポートフォリオ

投資比率の組み換え時に生じる取引費用は重要であり、平均分散ポートフォリオにリスクパリティをペナルティとして考慮すると最適な重み \omega_t^{*} は以下のように定義できます。

 max \hspace{10px} \mu_t' \omega_t - \frac{ \gamma}{2} \omega_t' \Sigma_t \omega_t - \sum^{n}_{i=1} c_i |\omega_t^{i} \mathbb{V}_t - \omega_{t-1}^{i} \mathbb{V}_{t-1} (1+y_{t}^{i})| \hspace{10px} s.t. \hspace{10px} \omega_t \geq 0, \, \, \omega_t' \mathbb{1} \leq 1

 \mathbb{V}_t  \, \cdots時点 tでのポートフォリオ価値
 c_i \, \cdots 資産 i の購入・売却にかかる取引費用率で、取引費用は資産 i の購入・売却額にこの c_i を乗じた額だけ発生します

パフォーマンス評価指標

ポートフォリオを構築すれば良いというものではないですね。きちんと評価関数なるものがあります。

で、私はここで思うわけですよ。アレ?これら観たことあるぞ?と。
ちょっと触ったシステムトレードPythonライブラリのpysystemtradeで、自分で作ったポートフォリオに対しての評価指標が出されていました。

f:id:reonreon3reon:20161011144217j:plain

サンプルで動かしたコードではこのようになっていました。

今悩んでいるのが、このpysystemtradeか別のライブラリであるziplineを使うかという話です。

おそらく、ziplineになると思います。というのは、ziplineは、古参であり、Quontpionで用いられるだけあってコミットが盛んであり、ライブラリとしての質が高く、Python2.x系にも対応しております。
それに対して、pysystemtradeは、今年始まったようなプロジェクトで、Python3.x系にしか対応していません。

「いや、別によくないか?」
「お前Python3.x系の方が好きやろ?」

という話はたしかにありますが、ここには譲れない理由があります。今回肝になる粒子フィルタのライブラリはPyParticleEstと呼ばれる学者が書いたようなF***なライブラリで、Python2.x系にしか対応していないため、仕方なくziplineを使おうという話なのです。

ここまでいうと悲観的に聞こえるかもしれませんが、もちろんziplineも上記したようなパフォーマンス評価についてのメソッドがあると思います。もう少し調べてみます。

さいごに

考察

  • 今回の最適化問題ではCVXOPTが良いのではないかと思っており、もう少しライブラリについて調べてみたいと思っています。
  • 最適化問題としては大して難しいことはないのだろうか、と言ってみたり。

http://cvxopt.org

csvop