C++でRRLを実装
目次
はじめに
前回はPythonで書いたRRLのコードをCython化して、学習速度がどれだけ速くなるか試してみましたが、思ったよりも実行速度が速くならず、結局理由もよく分からないので、今回はRRLのコードをC++で書いて速くなるかどうか試してみようと思います。
C++はあまり使ったことが無いのですが、Pythonでの実装で既にクラス構造はできているので、まぁ結局は案外サクッとできてしまったのですが。。
一番難しかったのは、USDJPYのcsvファイルを読み込むところですかね。
また今回、動的配列のvectorを初めて知りました。
Cでは配列の個数を事前に宣言する必要があり汎用性が無いのであまり好きでは無かったのですが、vectorは後から自由に配列の個数を変えられますしPythonのリストの様に扱えるので非常に扱いやすかったです。
C++による実装
以下C++で書き直したRRLのコードです。(RRLの詳細は前々回の記事を参照してください。)
tradingrrl.cpp
という名前で保存して以下のコマンドでコンパイルします。(gccのインストールについては前回の記事を参照してください。)
g++ -O3 tradingrrl.cpp -o tradingrrl
-O3
オプションをつけるのがコツです。
コンパイル後はtradingrrl.exe
ができるのでDOSから実行します。
学習に使用するUSDJPYデータはここからダウンロードしてUSDJPY30.csvという名前で一緒のフォルダに入れてください。
実行結果
以下実行結果です。
例によって、学習では10000回のエポックを回しており、100エポック毎にシャープレシオと経過時間を出力する様にしています。
Epoch loop start. Initial sharp's ratio is -0.0135567. Epoch: 100 / 10000. Shape's ratio: 0.0343914. Elapsed time: 0 sec. Epoch: 200 / 10000. Shape's ratio: 0.0554093. Elapsed time: 0 sec. Epoch: 300 / 10000. Shape's ratio: 0.0802484. Elapsed time: 0 sec. ... ... Epoch: 9800 / 10000. Shape's ratio: 0.16625. Elapsed time: 16 sec. Epoch: 9900 / 10000. Shape's ratio: 0.166069. Elapsed time: 16 sec. Epoch: 10000 / 10000. Shape's ratio: 0.166077. Elapsed time: 16 sec. Epoch loop end. Optimized sharp's ratio is 0.166077.
17秒!速すぎです。(ミリ秒までは取ってこれませんでした。。)
Pythonの結果が1321秒で、Cythonの結果が179秒なので、Pythonの78倍、Cythonの11倍くらい速いです。
でもやはりコードの読み書きやすさ、モジュールの多さやインタープリターな点で、私はPythonの方が好みですね。学習結果のグラフも描きたいですし。
確かにC++の実行速度は魅力的なので、C++コードをライブラリにしてなんとかPythonで読めないかと調べたところ、どうやらC++で書いたコードをCythonでラッピングしてPythonから使う事が出来るみたいです。
次回はそちらを試してみたいと思います。