メモ: ランダムフォレストの並列処理

概要

・randomForestSRCパッケージを使えば比較的楽
・windowsでのみ確認。他のOSは未確認。

やり方

というより参考サイトに書いてある内容を抜粋したもの。

下記サイトからrandomForestSRC_X.x.x.zipという名前のバイナリファイルをダウンロード。
http://www.ccs.miami.edu/~hishwaran/rfsrc.html

RのGUIから先ほどダウンロードしたものをインストールさせる。以前から導入しているものがある場合、先にアンインストールしておく。

あとはコア数を以下のように指定して通常通りランダムフォレストを実行するだけ。

Xに負の値を代入すれば最大コア数を指定できる。またはrandamForestSRCパッケージにて定義されているdetectCores()を使えばマシンのコア数を取得することも出来るのでこういう書き方もできる

参考

randomForestSRC-package {randomForestSRC} | inside-R | A Community Site for R
http://www.inside-r.org/node/167798

メモ: 線形計画法

概要

・alabamaパッケージを用いた線形計画法、制約条件の付け方など

例題

以下の線形計画法を解くことを考える

$$
\min z = -400 x_1 -300 x_2 \\
60x_1 + 40x_2 \leq 3800 \\
20x_1 + 30x_2 \leq 2100 \\
20x_1 + 10x_2 \leq 1200 \\
x_1 \geq 0 \\
x_2 \geq 0
$$

Rコード

似たようなパッケージにRsolnpがあり、そちらのほうが制約条件をつけるのは簡単らしいが、alabamaの方が計算速度は速いらしい

r – Constrained Optimization library for equality and inequality constraints – Cross Validated
http://stats.stackexchange.com/questions/19792/constrained-optimization-library-for-equality-and-inequality-constraints

実行結果

ランダムフォレストを使用したコモディティ先物の投資戦略

概要

  • そんなにパフォーマンス良くないよ
  • モメンタム効果(など)を説明変数としたうえでランダムフォレストによりシグナルを発生
  • パフォーマンスの計測とロングオンリーとの比較

モメンタム効果とは

一言で言うと、「上がってる株は今後も上がる、下がってる株は今後も下がる」という傾向を表すものです。また、この効果は何も株に限定されるものではなく、様々な資産クラスにおいて報告されています(例えば参考[1])

モメンタム効果を表す代理変数としては、「過去X日のリターン」といったものが良く使われますね。
もしくは「今日の株価が過去X日の移動平均よりも高いか低いか」などでしょうか。

このモメンタム効果を駆使することによって俺様投資戦略を開発しメシウマヘブンを狙うのがこの記事の趣旨です。

なぜランダムフォレスト?

どうもランダムフォレスト最強と思ってるマンです。
というよりも別にランダムフォレストじゃなくても良いのですが、参考[2]サイト様に触発されたというのが本音です。このサイトではCARTモデルを用いることで買い・売りシグナルを発生させています。

CARTモデル?よろしいならばこっちはランダムフォレストだというわけです。

もう1つの理由としては、モメンタム効果がいつでも効くというわけではありません。上昇している株価が今後も常に上昇するというわけではなく、いつかは反転します。また、過去X日のリターンと言った変数を使う場合にXの値はいくつにするのが良いのかといった問題もあります。今までは過去20日がシグナルとしてよく機能していたけれど、今後は過去40日かもしれない、過去1年かもしれない、もしくはその両方かもしれないといって可能性が微レ存するわけです。

そういった構造をうまく捉えられないかというのもランダムフォレストを使うもう1つの理由になるのではないかと考えられます。

対象資産

今回はコモディティ先物を使います。
株式でも良いのですが、コモディティの方が長い期間のバックテストができますしね。

具体的には

  • C: Corn
  • W: Wheat
  • S: Soybeans
  • GC: Gold
  • SI: Silver
  • HG: Copper
  • CL: WTI Crude oil
  • NG: Natural gas

の8資産を使います。

戦略内容

上記8資産を用いて、週次で買い・売りシグナルを発生させ、それによるパフォーマンスを計測します。
全て引け値を用いて計算しているので、ポジションを取るのはシグナル計算日の翌日引けとなります。

教師データとして、
非説明変数は1週間リターンがプラスかマイナスか、を表すバイナリ
説明変数としては後述する指標を用います。

また、教師データはいわゆるExpanding windowを用います。
すなわち、t時点で得られる全てのデータを教師データとして用いるという方法です。
なので、時間が経つに連れて教師データは増加し、その分だけ計算時間も上昇していきます(重い)

ランダムフォレストにより、説明変数が与えられた元で、今後上昇する確率( \(Pr \left( u \right) \) )を得ることができますので、\(2 Pr \left( u \right) – 1\)の値を取るポジションとします。
こうすることで上昇する確率100%と判定されれば持っている資金の全額ロング、確率0%なら全額ショート、確率50%なら何もしない(ポジションがゼロ)、となります

なお、取引コストは考慮していません。

Sanity check

何はともあれ、まずは各説明変数と非説明変数の関係を見てみます。下図はCornを見たものです。

C

使っている指標は

  • ma: 過去リターン。moving averageとなっていますがただのリターン平均値です。命名ミス。
  • vol: 過去リターンの標準偏差
  • skew: 過去リターンのスキューネス
  • gk: 過去リターンのGarman-Klass volatility. 詳しくは参考[3]
  • curve: 第一限月と第二限月の価格差

となります。1w, 1m, 3m, 6m, 12mはそれぞれ1週間、1ヶ月、3ヶ月、6ヶ月、12ヶ月です。

まあ見て分かりますように、ほとんど傾向らしい傾向は見て取れませんね。
モメンタム効果が報告されるくらいだからmaに傾向が見られるかなとも思ったのですが微妙ですね…
株式ですとボラティリティや高いときリターンが低くなるといった効果も言われてますので入れてみたという感じです。

他の資産に関してもとくに目立った傾向は見られないので割愛。

まずは各資産にランダムフォレストを適用してみる

Return(青色)がロングオンリー、Strategy(緑色)がランダムフォレストです。
比較しやすいように事後的に年率ボラティリティを5%に調整しています。以下同様。
Retは年率リターン、Riskは年率ボラティリティ、Ret/Riskはリスク調整後リターンです。

C: Corn

2000年以降はまあまあですがそれまでは微妙。
C

W: Wheat

微妙。
W

S: Soybeans

惨敗。
S

GC: Gold

珍しくロングオンリーに勝利
GC

SI: Silver

何もしていない
SI

HG: Copper

ロングオンリーに負けてはいるがまあ他の資産に比べればマシか
HG

CL: WTI Crude oil

惨敗。というか直近の原油価格の下落を捉えていないとは何事か。
CL

NG: Natural gas

微妙…
NG

ポートフォリオを組んでみる

既に雲行きが怪しいですが、とりあえずこれらの資産でポートフォリオを組んだ場合にどうなるかも一応見てみます。
なお、各資産の配分比率はリスク(標準偏差)パリティとします。

Portfolio

というわけでドローダウンこそ均されるもののロングオンリーにさえ勝つことができないというシロモノに。
というか各資産をリスクパリティで持つだけでもそこそこパフォーマンスが良いんですね。まあリーマンショック以降はボラティリティも高く微妙ですが。

ちなみにロングオンリーと戦略間の相関は0.25なので、そこまで買いバイアスがかかっているというわけでもないようです。

感想

ランダムフォレストをチューニングするという手もありますが、何よりも説明変数と非説明変数の関係が弱すぎるというのがボトルネックになっている気がします。

またモメンタムという特性上、資産価格にモメンタムが存在しない間は高いパフォーマンスが期待できないのも今後考えるべき問題ですね。

そしてCrude oilのところにもありましたが、直近、原油価格が減少する傾向が続いているにも関わらずそれを戦略が捉えていないというのも問題かと。コーディングミスも含めて見直す必要がありそうですね…といったところで本日は以上m(__)m

参考

Time Series Momentum
http://openarchive.cbs.dk/bitstream/handle/10398/8862/time_series_momentum_lasse_heje.pdf?sequence=1

Using CART for Stock Market Forecasting « The R Trader
http://www.thertrader.com/2014/02/28/using-cart-for-stock-market-forecasting/

MEASURING HISTORICAL VOLATILITY
http://www.todaysgroep.nl/media/236846/measuring_historic_volatility.pdf

Generating futures long-only return series using Quandl

Summary

– Generate futures(equity index and commodity) long-only return series using Quandl
– Each futures are rolled on month-end basis
– Returns using pre-populated near future price by Quandl are technically not tradable ones
– This post is translated/modified version of the previous post

Quandl roll mechanism

According to Quandl description, the near future series is populated as follows:

Continuous Contracts – Data from Quandl
https://www.quandl.com/c/futures/continuous

Quandl’s continuous contracts are created using the simplest possible roll algorithm: “end-to-end concatenation”. That is to say, CL1 is always the crude oil contract with the shortest time to expiry; CL2 is the second shortest contract, and so on. On expiry date, CL1 starts to point to the next future in line, and so on all the way down the strip. There’s no price adjustment, and the roll dates are simply the last trading dates.

So returns calculated only by CL1 series are not tradable because return on expiry date(time t) should refer to near future contract on time t, which is not included CL1 series. In other words, return on expiry date is referring different two contracts if you use only CL1.

Proposed roll mechanism

In this post, I will assume futures are rolled on month-end, i.e. near futures are unwound on month-end and next far futures are purchased on the same day. By doing this, all returns become theoretically tradable.

Python code

Note that you need to plug your Quandl token in self.token when you use this code.

Results

Equity index futures
150329_all_log

Commodity futures
150331_comdty

Next step

Since we could generate some benchmark indices, next step would be to come up with statistical investment strategy. Applying basic machine learning would be the first analysis.

Comments are welcome.