RとPythonの連携

概要

・PythonとRを連携させることで、PythonからRのコードを実行させる
・統計的な分析はRに、データのハンドリングなどはPythonに任せるのが現時点での最適解か
・この記事はR Advent Calendar 2014(https://atnd.org/events/58648)の12/10用の記事です

モチベーション

専らRやPythonはトレーディング戦略のシミュレーションに用いているわけですが、たまには統計的な分析結果をもとにトレードする戦略などを考える時もあります。
シミュレーションの本体はPythonで構築しているので、自ずとPythonで統計分析モジュールも構築する必要があるのですが、これがなかなかかゆいところに手が届かない。
(scikit-learn?知らない子ですね。)

やはり餅は餅屋ということで、統計分析はRに任せたい。
というか今まで培ってきたRのノウハウを使いまわせたほうが断然効率が良い。

候補モジュール

RとPythonを連携させるモジュールとしてはRpy(と後継のRpy2)とPypeRがそこそこ使われているようですね。
結論として、本記事ではPyrpeRを使うわけですが、その理由としてはPypeRを紹介しているペーパーに書いてあります(参考1)。

簡単にまとめると、
Rpy: 大規模データではうまく動かないかも。またメモリの消費量が大きい。
後継としてRpy2が開発される。処理速度は向上したようだが、メモリ消費が効率的ではない模様
という感じらしいですね。
一方で、PypeRに関しては以下の様なことも書いてあります。

『Although pipes are not fast at passing data between processes, it is useful to connect Python and R when the performance of R scripts and portability are important concerns. Here we present a module – PypeR, which allows Python scripts to call R by using pipes. PypeR is especially useful when there is no need for frequent interactive data transfers between Python and R, as demonstrated by the comparison in Table 1. 』

ということでR, Python間のデータのやり取りはそこまで早くないが、メモリ問題を解消するためにPypeRが開発されましたというようですね。
RとPython間のやりとりがそこまでボトルネックで無いなら、PypeRを使うのも1つの手段になるのではと。
また、PypeRはデフォルトでnumpyに対応していて、適宜Rが読み込めるようにデータ形式を変換してくれているのもありがたいところ。

PypeRを使う

導入は至ってシンプルにpipでインストールできます

今回はtseriesパッケージを用いたGARCHモデルの推定、主成分分析、psychパッケージを用いた因子分析の3つをやってみたいと思います。
簡単な流れとしては

1. Rインスタンスの生成
2. 変数をPythonからRへと受け渡す
3. Rスクリプトの実行(実行結果をR内の変数などに保存しておく)
4. 変数をRからPythonへと受け渡す

という流れになります。
1つめのRインスタンスの生成は

とすることで生成することが出来ます。後々のことも考えてnumpyが使えるようにしておきます。

次に変数をPythonからRへと受け渡すためには

とすることでR上の変数varにpython上の変数pythonが良しなに変換されて受け渡されます。

Rスクリプトを実行するには

と言った感じで文字列にしてそのまま渡します

最後にR上の変数をpythonで受け取るには

となります。こうすることでpython変数retに、R上の変数varが格納されます。

コードサンプル

使用しているデータはFREDから取得できるUSスワップレートの1,2,3,4,5,7,10,30年レートです。

GARCH実行結果
141206_1

主成分分析結果 ファクターローディング
141206_2

因子分析結果 ファクターローディング
141206_3

因子分析結果 スコア推移
141206_4

スコアの計算にはAnderson法を用いているので各スコア間の相関はゼロになっています。
(Factor3が最近うなぎのぼりになっていることから、最近USスワップカーブは手前がスティープニング(というかカーベチャーがキツくなる)してることが分かりますなあ)

ということで

Pythonを中心とした開発が可能になりました。
今にして思えばRのコードがほとんど無いということで、皆様方がRの素晴らしいポストを投稿している中でこれが本当にR Advent Calendar的にアウトかセーフなのかと問われればファウルというところで何卒よろしくお願い致します。

参考

PypeR, A Python Package for Using R in Python
http://www.jstatsoft.org/v35/c02/paper