トレーディング戦略をRでバックテストする方法

なかなか面白い&有用な記事を見つけたので日本語に翻訳します。意訳がいっぱいあったり、完訳ではない点ご勘弁。ちなみにバックテストってのは「あるトレーディング戦略が過去どの程度有効だったのかを確かめる事」という意味。この記事で紹介されているステップ1をRFinanceYJを使って日本のデータを取得するようにして、ステップ2をSVMなりに変えてみれば日本市場での機械学習を使ったトレーディング戦略を作ったりできるわけです。

【引用元】
FOSS Trading: How to backtest a strategy in R
【訳者注意】
本家のサイトではどうも開発版のパッケージにのみ存在する関数を使用しているようですが、それだと簡単にサンプル動かせないんでここではその点適当に改変しています。その関係で記事・コードに修正を入れています。著作権は向こう持ちで。

【以下翻訳】
この記事は「ExcelとRで実行するバックテスト」シリーズの3番目の記事であり、どのようにRで単純なトレーディング戦略のバックテストを行うのかを紹介します。やり方は全部で4ステップからなっており、それはDamian氏が「Excelにおける投資戦略のバックテスト法」という記事で彼が示したやりかたに合わせたものです。

  • ステップ1:データ取得

日次のマーケット情報をYahoo Finance(com)から取っているなら、quantmodパッケージにある【getSymbols】関数を使うとデータ取得のステップが簡単になります。また、そのほかにも「FRED*1, Google, Oanda*2, R save files, databases, etc.」といったデータソースからデータを取得する関数もあります。

# もし、quantmodパッケージが入ってないなら以下のコマンドを実行してインストールしてください
# install.packages("quantmod")
# quantmodパッケージを使用します (TTR, xts, zooもロードされる)
require(quantmod)
# S&P 500 INDEXのデータを取得。 (getSymbols はxtsオブジェクトを返却します)
getSymbols("^GSPC")
  • ステップ2:買いか売りか判断するための”指標”作成

TTRパッケージ*3はたくさんの"指標"を含んでいるパッケージです。それらの指標は組み合わせ使うことが簡単になるように設計されています。ここでは"RSI指標"というものを投資判断の指標にしてみます*4

# RSI指標の計算
#データはGSPCの4列目(終値)を使用.引用先ではCI関数を使って同様の事をしているがこれも開発版のみあるっぽい
rsi <- RSI(GSPC[, 4])
  • ステップ3:トレーディング戦略を作る

ここでは1行で書ける

    1. もし、RSI指標が0.5以上なら”買い”、そうじゃないなら"売り"

という簡単なトレーディング戦略を考えます。もっと手の込んだトレーディングルール・ポジションの張り方を作ることももちろん可能ですが、もっとコードを書く必要があります。look-ahead bias*5を避けるために、このトレーディング戦略のシグナルは"ラグ"を持たせたものである点に注意*6

# シグナルの作成: (トレーディング戦略:もしRSI>=0.5 なら"買い(+1)"、そうじゃないなら"売り(-1)"
# "昨日のシグナル"でポジション決めてるのでlagを取ってる
sig <- Lag(ifelse(rsi >= 0.5, 1, -1))
  • ステップ4:トレーディングルール

Damian氏の例にあるように、以下のコードはシンプルなもので取引コストを加味したものではありません。以下のコードは"昨日計算したシグナル(1 or -1)"×"今日のリターン"という計算します。データはこのExcel Fileに合うよう日付で絞っています。

# このトレーディング戦略に沿った場合のリターンを計算
ret <- ROC(GSPC[, 4]))*sig
# データの範囲を絞って抽出
ret <- ret['2009-06-02/2010-09-07']
  • ステップ5:戦略のパフォーマンス評価

Damian氏は作成したトレーディング戦略の評価の重要性について述べていたが、Rユーザーはラッキーなことに"PerformanceAnalytics"パッケージを使うことでトレーディング戦略評価・パフォーマンス分析を実行できます。

# PerformanceAnalytics パッケージを使用
# install.packages("PerformanceAnalytics")
require(PerformanceAnalytics)
# ドローダウン統計量(下落時の悪化具合をまとめたもの)を示す作成
table.Drawdowns(ret, top=10)
# ダウンサイドリスク(CVaR,VaR等)推定の表を作成
table.DownsideRisk(ret)
# 累積パフォーマンスグラフ、日次リターン、ドローダウンのチャート作成
charts.PerformanceSummary(ret)

以上がRでのシンプルなトレーディング戦略のバックテストです。そんなに難しいもんじゃないのがわかりますよね?コピペして一気に実行したいだろうから、以下に全部のコードを簡単にまとめたものを書いておきます。

require(quantmod)
require(PerformanceAnalytics)

# ステップ1:データ取得
getSymbols("^GSPC")

# ステップ2:指標の作成
rsi <- RSI(GSPC[, 4])

#ステップ3:トレーディング戦略の作成
sig <- Lag(ifelse(rsi >= 0.5, 1, -1))

#ステップ4:トレーディングルールによるリターン計算、およびその累積パフォーマンスグラフ
ret <- ROC(GSPC[, 4])*sig
ret <- ret['2009-06-02/2010-09-07']
eq <- cumprod(1+ret)
plot(eq)

# ステップ5:パフォーマンス評価
table.Drawdowns(ret, top=10)
table.DownsideRisk(ret)
charts.PerformanceSummary(ret)

*1:アメリカの金利とか経済指標がとれる

*2:為替データがいっぱいある

*3:俗に言う"テクニカル分析"をしてくれるパッケージです。私はあまりお近づきになりたくない…

*4:引用先の記事ではDVIという指標を使用しているが、開発版にのみ存在っぽい

*5:俗に言うインサンプルシミュレーションの事かと

*6:"今日"までのデータを使って"今日"を予測するのではなく、"昨日"までのデータを使って"今日"を予測するという意味