Pickleメモ

概要

  • Python標準モジュールのPickleを用いることで任意のPythonオブジェクトをPickle/Unpickle (保存/読み込み)することができる

サンプル

拡張子は.pがコンベンションの模様。

追記(4-Jul-2016)

どうやらpickledファイルを読み込むのはpandasですでにread_pickleで実装されていたっぽい。
またpickleする際はpickleモジュールではなくcPickleモジュールを使ったほうが効率が良い模様。したがってコードは

参考

What is Pickle in python ? | Python Tips
https://pythontips.com/2013/08/02/what-is-pickle-in-python/

11.1. pickle — Python object serialization — Python 2.7.11 documentation
https://docs.python.org/2.7/library/pickle.html

UsingPickle – Python Wiki
https://wiki.python.org/moin/UsingPickle

2015年の各資産パフォーマンスのまとめ(株・債券・FX・コモディティ)

概要

  • 今年ももう終わりなので、株式、債券、FX、コモディティの2015年の1年間のパフォーマンスをまとめておきます。
  • パフォーマンスが特に良かったのは日本株・欧州株。

対象資産

  • 株式:主要株式(米・日・欧州・英)、その他株式(独・仏・加・スイス)、米国ファクター(サイズ、バリュー、グロース)
  • 債券:主要債券(米・日・独・英)
  • FX:先進国通貨(G8)、新興国通貨(メキシコ・ロシア・ブラジル・南アフリカ・トルコ・中国)
  • コモディティ:エネルギー(WTI・天然ガス・ブレント)、金属(金・銀・銅)

主要株式

Equity Developed Markets 2015 Part 1

  • 日経平均がトップ(約+10% p.a.)、次いで欧州(Euro stoxx)、米英はフラット。
  • 8月はボラティリティ急上昇に伴い株式は大幅下落。

その他株式

Equity Developed Markets 2015 Part 2

  • 仏(CAC 40)、独(DAX)が堅調。スイス(SMI)は1月にCHFのペグが外れた際の影響で大幅下落。年初来ではフラット。

米国株式ファクター

Equity US Factors 2015

  • 今年はバリュー(Price to Book)が機能しない一年。Valueがアンダーパフォームする一方、グロースがマーケットをアウトパフォーム。

債券

Rates Developed Markets 2015

  • 総じて僅かながらキャッシュをアウトパフォーム。独(Bunds)は4-6月に金利が急上昇、一時はネガティブリターンとなったが、その後は金利も落ち着き大体+2% p.a.
  • JGBは全然動かない

先進国通貨

FX Developed Markets 2015

  • 少し見辛いかもしれませんが、XXXUSDのパフォーマンスを掲載しています。グラフ上で、上に行けば行くほどその通貨は米ドル対比で強くなっていたことを表しています。
  • AUD, NZD, CADはマイナスリターン。コモディティ関連と思われます。
  • EURもUSD対比で弱かった。
  • JPY, CHF, GBPはほぼフラット。

新興国通貨

FX Emerging Markets 2015

  • 基本的に新興国通貨は弱かった。一時的にはコモディティ価格上昇に伴いRUBは上昇したが、年後半では下落。
  • CNHは8月に大きく下げたが、相対的な下げ幅は小さかった。

コモディティ(エネルギー)

Commodities Energy 2015

  • エネルギー安、今年一年で40%下落。

コモディティ(金属)

Commodities Metals 2015

  • 金属も弱かった。コモディティは基本的にキャッシュをアンダーパフォームする一年だった。

計算方法補足

  • パフォーマンスはキャッシュに対する超過リターンベースで評価。為替ヘッジ後のリターンを掲載しています。
  • 株式は配当、債券はクーポン、通貨は金利差に該当する部分も再投資しています。
  • データは全てQuandlから。

対円為替レートに対するモメンタム戦略

概要

  • 簡単な自己相関を利用したモメンタム戦略の適用
  • 特にUSD, EUR, GBPに対しては良好
  • NZD, CHFに対しては微妙
  • 将来データは使ってない(はず)のだがトレードタイミングがシビアなのでもう少し検証が必要

設定

以下のスリッページを想定。トレードする際に以下の値がリターンからマイナスされるように処理。
個人がやる場合どのくらいが実勢なのか知りませんがとりあえずの仮置き

  • USDJPY: 1銭
  • EURJPY: 3銭
  • GBPJPY: 5銭
  • AUDJPY: 3銭
  • NZDJPY: 6銭
  • CADJPY: 6銭
  • CHFJPY: 9銭

為替レートはQuandlから拝借しています。

結果

各通貨に関して全期間と、2014年以降の結果を掲載

・USDJPY

直近は円安に進んでましたのでロングオンリーとそこまで違いはないですね。
USDJPY_whole

USDJPY_2014

・EURJPY

ユーロ円で見ると緩やかな円高となっているようですね。
あまりトレンドが無いときは戦略のPLもほぼ平らですが、為替が大きく動くときは戦略もそれに追従していることが分かります。結果的に累積PLは階段上になっていますね。
EURJPY_whole

EURJPY_2014

・GBPJPY

GBPJPY_whole

GBPJPY_2014

・AUDJPY

AUDJPY_whole

AUDJPY_2014

・NZDJPY

2006年あたりまでは戦略が効いてないですね。
NZDJPY_whole

NZDJPY_2014

・CADJPY

こちらも全体としてはワークしているように見えますが、2000年から2006年辺りは負け続けていますね。
CADJPY_whole

CADJPY_2014

・CHFJPY

スイスフラン円は全然効いてないですね。2009年辺りまでずっと負け越しています。
取引コストを高く設定している点もありますが、無駄なトレードが多そうですね。

ちなみに2015年始めのフランショックは運良く捉えています笑
CHFJPY_whole

CHFJPY_2014

今後の課題(備忘録)

・NZD, CHFはもう少し改良する余地がありそう
→自己相関が弱い or 負値の場合はトレードしない or トレードシグナルを反転させる

・トレードタイミング
ティックデータなりを使ってもう少し実勢に近いトレードラグを考慮させる。

・他の資産
ちなみに同じロジックを日経平均に適用してみましたが全然ダメでした。

Cross Entropy Minimisation

概要

  • エントロピー差が最小になるような最も近い分布を求める案件
  • 平均2.2の正規分布から平均2.3の分布を求める

Rコード

参考サイト1にMatlabコードがあるのでそれをR用に書き写した

結果

期待値2.2と2.3がそれぞれ求められているのであっているっぽい。

PDFをプロットすると以下の様な感じ。参考サイト1と同じに見えるっぽい?
150614

参考

Tutorial Demo on Cross Entropy minimization (I) [Matlab Octave]
http://www.quantcode.com/modules/mydownloads/singlefile.php?lid=478

Forecasting Using Relative Entropy
https://www.frbatlanta.org/-/media/Documents/filelegacydocs/wp0222.pdf
(元論文。あまり読んでいない。)

未知パラメータがある場合のパーティクルフィルタ

概要

  • 未知パラメータ(ノイズの分散など)を含む場合のパーティクルフィルタの実装
  • システムノイズが正規分布の場合とコーシー分布の場合の比較

システムノイズが正規分布の場合

詳しい理論に関しては参考文献のP.225辺りからを御覧ください。

対象データに関しては前回の記事と同様のものを使っております。前回との違いとしては、システムノイズと観測ノイズの分散が同時に推定されているという点ですね。
また、今回は重点遷移密度を得るためにAnxiliary Particle Filter(補助粒子フィルタ)を使っています。これは、未知パラメータを含んでいるからという理由と、他の分布への一般化も視野に入れているからという理由です。

また参考文献中では実装されていませんが、多項リサンプリングも行なっています。

状態の推定結果

粒子数は1万個です。以下のように、若干ずれる箇所はありますが、カルマンフィルタとほぼ同程度の推定を行なっていることが分かります。
150607_1

システム分散の推定結果

システム分散の真値は1ですが、まあまあという感じですかね。
赤の破線はそれぞれ25%タイル値、75%タイル値を表しています。
150607_2

観測分散の推定結果

こちらの真値は2ですが、まあこんな感じという感じなんですかね(― ―)
150607_3

システムノイズがコーシー分布の場合

ほとんど正規分布の場合と変わりません。正規分布のコードをコピーして再利用しているので、変数名などが適切ではないですがそこは目をつむってください(― ―)

今回推定対象としたデータ列は以下。コーシー分布に従う状態に、正規分布を上乗せしています。
状態がコーシー分布なので、正規分布よりもドラスティックなジャンプが時々発生します。
150607_0

状態の推定結果

粒子数は100万個。青線は状態の真値で、赤線がパーティクルフィルタで推定された状態です。
概ね推定されているような気がしなくもないですがやはり精度はかなり悪くなりますね。
100万個でこれですからね。MBPで走らせるとかなり時間がかかります(― ―)
150607_1

システムノイズのscaleの推定結果

真値は0.05ですがこんなもんなんですかね。時々ゼロに張り付いたりしていますが。
150607_2

観測分散の推定結果

こちらはまあいい感じですかね。真値は1.5です。
150607_3

参考文献

Amazon.co.jp: Rによるベイジアン動的線形モデル (統計ライブラリー): G.ペトリス, S.ペトローネ, P.カンパニョーリ, 和合 肇, 萩原 淳一郎: 本
http://www.amazon.co.jp/dp/4254127960