粒子フィルタ使って実装したい (2.5)
はじめに
前回に、先生に見せるようにマーコビッツの最小分散ポートフォリオ
とそのフロンティア
について少しプログラムを書きました。
正直、世の中にはもっとよいライブラリがあってそっちを使いたい。そんなことを理論と折り込みながら書いていきます。
ポートフォリオの構築
最適ポートフォリオを構築するには一期先リターンの平均と分散の推定値
が必要です。
↓ここで、自己組織化状態空間モデルを用いてそれら平均と分散を推定するという理論部分を多少なり書きました。
ここで、問題になってくるのが何を持って最適ポートフォリオ
と云えるのでしょうか?
などがそれらに当たります。
前回のブログでは、最小分散ポートフォリオの制約のもとでポートフォリオの重みを出しました。
そこで、今から3つのポートフォリオの構築方法について書いていきます。
平均分散ポートフォリオ
最適な重み は以下のように定義できます。
の条件付き期待値
の条件付き共分散行列
は時点からまでの危険資産への投資比率ベクトルと云えます。その逆は安全資産の投資比率と云えます。
は リスク回避度
と云い、頑健性を確保するために, 多様なケースを試す必要があります。
リスクパリティ(Risk Parity)
最適な重み は以下のように定義できます。
\( \omega_t^{*} = \{ \omega_t \in [0,1 ]^{n} \, ; \, \sum^{n}_{i=1} \omega_{t}^i = 1, \, \omega_{t}^{i} \)
\(n \)次元ベクトル\(a\)に対しては番目の要素を表します。
リスクパリティは、ボラティリティの高い資産及び他の資産との相関の高い資産への投資比率を下げ、相関が低い資産への投資比率を上げるポートフォリオを云えます。
なぜそのようにするかというと、ポートフォリオというかファイナンスというか統計?において資産同士の分散が大きいのは嬉しいものです。
最小分散ポートフォリオ
最適な重み は以下のように定義できます。
ペナルティ付き平均分散ポートフォリオ
投資比率の組み換え時に生じる取引費用は重要であり、平均分散ポートフォリオにリスクパリティをペナルティとして考慮すると最適な重み は以下のように定義できます。
時点でのポートフォリオ価値
資産 の購入・売却にかかる取引費用率で、取引費用は資産の購入・売却額にこのを乗じた額だけ発生します
パフォーマンス評価指標
ポートフォリオを構築すれば良いというものではないですね。きちんと評価関数なるものがあります。
- 累積リターン
- シャープレシオ
- ソルティノレシオ
- 最大ドローダウン
で、私はここで思うわけですよ。アレ?これら観たことあるぞ?と。
ちょっと触ったシステムトレード用Pythonライブラリのpysystemtradeで、自分で作ったポートフォリオに対しての評価指標が出されていました。
サンプルで動かしたコードではこのようになっていました。
今悩んでいるのが、このpysystemtrade
か別のライブラリであるzipline
を使うかという話です。
おそらく、zipline
になると思います。というのは、zipline
は、古参であり、Quontpion
で用いられるだけあってコミットが盛んであり、ライブラリとしての質が高く、Python2.x系にも対応しております。
それに対して、pysystemtrade
は、今年始まったようなプロジェクトで、Python3.x系にしか対応していません。
「いや、別によくないか?」
「お前Python3.x系の方が好きやろ?」
という話はたしかにありますが、ここには譲れない理由があります。今回肝になる粒子フィルタのライブラリはPyParticleEst
と呼ばれる学者が書いたようなF***なライブラリで、Python2.x系にしか対応していないため、仕方なくzipline
を使おうという話なのです。
ここまでいうと悲観的に聞こえるかもしれませんが、もちろんzipline
も上記したようなパフォーマンス評価についてのメソッドがあると思います。もう少し調べてみます。
さいごに
考察
csvop