人工知能によるシステムトレードを計画する (1)

突然ですが皆さんは業務システムを開発するとき、どのような手順を踏んでいますか。

要件定義や設計をおこなわずいきなりプログラムを開発するでしょうか。おそらく、そんなことはしないと思います。

そしてこれは人工知能や機械学習といった新しい手法を現行の業務に適用するときも一緒です。まず現行の仕組みをよく理解し、人間がなにをどのように認知してどう判断しているのか、明確なロジックとしてひも解いていく必要があります。

このようなフェーズでは取り組んでいる内容やその成果もあいまいになりがちです。たとえば、コンサルタントに高い費用を支払った上、成果としてはあまり得るものがなかったという経験をした方もいるのではないかと思います。

そのような事態をあらかじめ避け、やみくもに流行りのワードに飛びつくのではなく、現実の仕組みをよく分析し、理解した上で新技術の適用をおこなうというフェーズを経なくてはなりません。

# 人工知能を組み込む対象のドメインを理解する

今まで何度か過去の時系列金融データを元に未来を予測する手法そのものについてすでにいくつか記述してきました。

[機械学習で未来を予測する - scikit-learn の決定木で未来の株価を予測](http://qiita.com/ynakayama/items/6a472e5ebbe9365186bd)
[過去のデータからビッグデータ分析で株価を予測する](http://qiita.com/ynakayama/items/420ebe206e34f9941e51)

前述しましたとおり、題材としては生の金融市場のデータを利用します。

このようなとき、何を基準にどのような論理を実装していけば良いのでしょう。思いつきのアイデアを気の向くままに実装して試行錯誤すれば良いのでしょうか。いいえ、そうではありません。やはり同じように、まず対象のドメインをよく理解することから始まります。

この場合で言えば、まずは対象となる投資家 (= 人間) の思考パターンを分析してくことから始まるわけです。 

従来のシステム開発での各工程と、あまり変わりませんよね。

昨今では人工知能や機械学習といったワードが世間を賑わせていますが、結局のところロジックを解き明かし、ねらいを明らかにした上で実装していくという、基本的な段階を経ることになります。今回から数回に渡って、人工知能を利用して実際に投資判断をしていくというテーマで書いていこうと思います。

# 人工知能で実装する「知能」とは何なのかをハッキリさせる

データの分析においては、技法そのものよりも、何をどのような目的で可視化するのかが重要ということは再三に渡り書いてきました。可視化は手段であって目的ではなく、本来の目的を達成するために対象のドメインについて十分な知識を備えていなければなりません。何も与えなくても機械がひとりでに考えて取引をしてくれるわけではないのです。

本来、データ分析は経営や経済を動かす肝の部分でありお金に直結する価値のあるものです。お金に直結するのですから、現実の問題をよく分析することが大切です。

## トレーディングルールを明らかにする

さて、この手の話題を口にすると、人によっては「四六時中、価格が気になってしまう。だからトレードなんてやらない。」等といった声を聞くことがあります。

しかしそれは、そもそも相場を常時監視しなければならない時点で問題があるのです。

大切なのは自分自身のトレーディングルールをきちんと確立することです。

何パーセント価格が下がったらロスカットする (= 損を確定させて売る) のか、目標価格がいくらになったら利食いする (= 利益を確定させて売る) のか、このようなルールがきちんと確立されていれば相場を常に気にする必要がありません。

昨今の IT の発達したシステムであれば一定の条件を満たせば自動的に売買するようなことができますし、約定が成立したときに通知をするようにしておけば、普段はそのことは忘れてあとは結果を待つのみとなるからです。

いっぽう、トレーディングルールがきちんと確立されていない人は、常に相場が気になってしまいますから、人生の大切な時間や限りある精神力を無駄にしてしまいます。

なにより、人手でトレードをするということは、とても不確かで頼りないものである人の勘や経験に頼っているということであり、浮き沈みが激しく不安定なことをしていることになります。

人間は感情の生き物です。しかし一時の感情に惑わされて取引をすると必ず失敗をします。これはたとえ歴戦のプロの投資家と言えども同じなのです。

### 損をする人はなぜ損をするのか

「見切り千両、損切り万両」という格言があります。

投資をするにはまず[損切り (ストップロス)](http://ja.wikipedia.org/wiki/%E6%90%8D%E5%88%87%E3%82%8A)が何よりも重要だということを示しています。

たとえば毎月 10 万円ずつ 3 ヶ月間利益を上げたとしてもその翌月のある日いきなり 30 万円の損失を出してしまっては元も子もありません。損をする駄目な投資家の一つの見本として、普段から小さな利益をコツコツ積み上げるが、ある日ド派手に損失を出してしまい結果的にマイナスに転じてしまうというパターンが挙げられます。これは完全に負け筋です。

このことからも、いかに利益を出してもうけようかということより、まずは想定以上の大きなロスを出さないようにするということが何より大切であるということがわかります。

### ロスカットのルールを定義する

上の損切りのリンク先にあるように、最大の損失額をまずあらかじめ定義、そこから市場に投入する資金の額を逆算していきます。

計算が複雑だという場合、単純に元の価格より 2% 低下したらロスカットするという風に一律に設定してしまうのでも良いでしょう。

もうひとつ大切なことは、いくらストップロスを定義したからといって巨大なポジションを取りすぎないことです。

たとえば 2% までの損失なら許容するといっても、掛金として 1,000 万円投入すると損失額は 20 万円にも及ぶことになってしまいます。

大切なポイントとしては

1. ストップロスにより最大損失額をあらかじめ設定しておく
2. やたらと大きなポジションを取りすぎない (ポジションサイズをあらかじめ設定しておく)

ということになります。

こういったことがリスクコントロールの基本中の基本です。システムトレード以前の話ですね。

ロスカットのルールをきちんと定義しておけば、価格を常時監視しておく必要に迫られることはありません。

証券会社などのプロの投資家であっても一緒で、彼らはプロとはいえ何百という銘柄を常時監視することは物理的に不可能ですから、やはりストップロスを適切に設定して運用することが何よりも大切ということになります。

そしてルールが確立されたならば、あとはそれを機械に仕事させるためにプログラムに落とし込んでいくことになります。ようやくシステムトレードの入り口が見えてきましたね。何度も言うようですが、どのようにプログラムを組むかどのような機械学習や人工知能の手法を使うかなどといったことより、まずはルールをきちんと定義することが何よりも大切です。

## ボラティリティとは

金融の文脈で言う[ボラティリティ](http://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%A9%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3)とは価格の変動幅を指します。解説は左のリンク先の Wikipedia の記事を見ていただくとして、この計算方法は意外と簡単です。

まず TR (True Range) を求めます。これは
1. 当日高値 - 当日安値
2. 当日高値 - 前日終値
3. 前日終値 - 当日安値
以上の 3 つから絶対値が最大のものです。

通常は ATR (Average True Range) が使われます。 ATR は True Range の n 日間の指数平滑移動平均を取ります。この値は相場の買われすぎ、売られすぎなどの過熱感を指します。

TP は高値安値終値の平均です。

ボラティリティは

```math
V = \frac {TR} {TP} × 100
```

で求まります。

意外と単純な式ですね。

実はテクニカル分析で用いられる RSI などをはじめとするさまざまな指標のほとんどは、実に簡単な計算式で求められています。このあたりの話はまた次回以降にしていきます。

ボラティリティは[恐怖指数](http://ja.wikipedia.org/wiki/%E6%81%90%E6%80%96%E6%8C%87%E6%95%B0)の算出根拠ともなっており、金融商品の安定性や変動リスクを評価するのにとても役に立つ指標です。

### ボラティリティを可視化する

ボラティリティの推移を見れば、その投資対象の値動きが大きいかどうかが明らかになります。 [TA-Lib を利用](http://qiita.com/ynakayama/items/897cc932008bd5c0e452)して求めてみましょう。

```py3
import talib as ta

tr = ta.TRANGE(high, low, close)
vl = tr / ((high + low + close) / 3) * 100
```

ボラティリティはだいたい 5 以上だと大きいと判断します。相場が急変するときは 10 以上になることもあります。

なお筆者はチャートに描くとき 10 倍して 50 のラインを越えているかどうかで判断するようにすると他の指数と並べて見やすくなると考えています。そうすると最大値を 100 としたチャートにちょうど描きやすいからです。

### 中長期的なトレードにはボラティリティの小さなものを選ぶ

ボラティリティの小さな例をいくつか挙げてみましょう。

下の図では、上にオシレーター系指標、下にトレンド系指標とローソク足チャートを描いています。このあたりの解説はまた次回以降していきます。まずは上の図のボラティリティ (VL) と出来高 (VOL) 、さらに下のローソク足チャートに注目してください。

![chart_4307.png](https://qiita-image-store.s3.amazonaws.com/0/38501/202c8981-3022-c0db-5f3a-edb3a574244c.png)

上に挙げた野村総研 (4307) はボラティリティがほぼ (最大を 100 として相対指数化した) 出来高と一致しています。そしてそれらは低水準で安定しており、また右肩上がりに業績は成長していますから、非常に低リスクで安定していることがわかります。

![chart_9613.png](https://qiita-image-store.s3.amazonaws.com/0/38501/3fb20869-a2a1-7f06-a8bf-ef8dc21f811d.png)

こちらも似た業種で NTT データ (9613) のものです。小刻みな変動はありつつも低いボラティリティを保ちながら成長している優良企業です。

ディフェンシブな銘柄と比較してみましょう。

![chart_9020.png](https://qiita-image-store.s3.amazonaws.com/0/38501/762b8888-70ed-0464-e9a0-c03f8e40e5f3.png)

東日本旅客鉄道 (9020) と上の 2 社を比べてみると、とてもよく似たチャートの形をしていることが一目でわかります。もちろん、移動相関を計算すればさらに数値的にも近似していることがわかるはずです。

このようなディフェンシブな銘柄と似ているということは、日経平均などの大きなトレンドにあわせて、比較的何も考えずに投資できるということを指しています。

### ボラティリティが大きい場合はポジションを小さく

一般的にはボラティリティが高い商品はリスクが大きいと判断されます。

上に挙げたように、ボラティリティが低ければリスクは低く中長期的なトレードに向いています。

これに対し、短期トレードの場合、ボラティリティが高い状況というのは利益を得るチャンスがそれだけ多く、また一度の値動きも大きいので、ひとつのポジションから得られる利益も大きくなります。

とはいえボラティリティが高いということは反落したときのリスクも大きいですから、安易に巨大なポジションを取ったり、相場全体のトレンドに逆行する仕掛けをすると、大きな損失につながることがありますから注意が必要です。やはりしっかりとロスカットのルールを守って、ポジションのサイズを小さく適切に取ることが大切になります。

変動する値幅が大きいので、ポジションが小さくても十分に高いリターンを期待できるというわけです。

いくつか例を見てみましょう。

![chart_2121.png](https://qiita-image-store.s3.amazonaws.com/0/38501/e132581d-2a3d-212e-7efe-9281d0af39bf.png)

上はソーシャルゲームで有名なミクシィ (2121) のチャートです。 5 以上のボラティリティが頻発し、かなりリスキーであることがわかりますね。変動の値幅が激しいので、うまくチャンスをものにすればハイリターンが望めます。

![chart_4911.png](https://qiita-image-store.s3.amazonaws.com/0/38501/644ed835-2967-2128-2086-d1d84fcc0fa8.png)

資生堂 (4911) もところどころで急騰急落をし、そのたびにトレンドの変化を伴っています。ボラティリティを見るとやはりその節目ごとに高まっていることがわかります。このようなトレンドの変化にうまく対応できれば高いリターンを獲得できます。もちろんその分リスクも高いですから、ポジションを小さくとって反落してしまった場合はロスカットをきちんとしましょう。

![chart_9742.png](https://qiita-image-store.s3.amazonaws.com/0/38501/99cb960c-950d-0e6a-5168-ecd981bd6b12.png)

SI 業界でも、急成長中のアイネス (9742) はボラティリティが急に高まることがあり、成長株とはいえリスクを含んでいることがわかります。

## まとめ

人工知能という言葉が流行っていますが、別に SF に登場する人工知能のように、機械が勝手に考えて自動的になんでもやってくれるわけではありません。機械が自律的な意志を持って行動するといったことは現代の科学ではありえません。つまりは、どういうときにどうするのか、明らかにしていなければいけないということです。

トレンドに乗ってボラティリティの高い商品に投資をすれば高いリターンを期待できることがわかりました。

トレーディングルールを明らかにすることで、思い込みや認知のゆがみが発生しやすい勘や経験によってではなく、一定の決まりをきちんと守ることによってリスクを抑えることができます。

ここまで明らかになれば、あとはこれを機械に実装すればいいわけです。手法そのものよりも、このようにまず現行の仕組みを分析していくことが、地味ではありますがとても大切であるということです。

これはなにも人工知能に限らず、業務分析であるとかあらゆるジャンルにおいて言えることであると思います。

次回はもう一歩踏み込んで、現在のトレンドをどう判断したら良いかという観点で話を進めます。ここが明らかになれば、いま上昇なのか下降なのかトレンドを機械が理解して判断できるという話につながるわけです。