のび太と学ぶ「機械学習」~FX予測プログラムを作成~【第1話】if文作戦

本シリーズでは、「FXの予想プログラム」を作りながら、機械学習・ディープラーニングを解説します。
(注)のび太くんは有名漫画のキャラとは一切関係ありません。

あらすじ

「のび太と機械学習」は、20歳の大学生、のび太くんが主人公です。

大学生のび太くんは、お小遣い欲しさにFXに興味を持ちます。

そんなのび太くんに、家庭教師のすぐるさんが、機械学習を解説し、FX予測プログラムを一緒に作ります。

残念なことに、FX予測プログラムは、ちょっとしか儲かりませんでした。



のび太くんはその後、学んだ機械学習を生かして、D-mind社を起業し、汎用人工知能を作り上げます。

高齢になったのび太くんは、D-mind社をTMR社に売却し、TMR社の工場で22世紀、汎用人工知能搭載型ロボットが誕生します。

この物語は、そんな汎用人工知能搭載型ロボット誕生につながる、のび太くんの機械学習・勉強記録です。

第1話:のび太、if文でFXを予想する

ママー!!ママー!!

何よ、もう~。騒がしいわね。

ママ!聞いて!聞いて!!新しいiPhoneが出たんだよ!!
iPhone Xだよ!
ねえ、買って、買って~

無理よ。そんなお金あるわけないでしょ。
それにあなた、携帯持っているじゃない。

ママ!これガラケーだよ。LINEもできなんだよ!!
いまどきガラケーしか持っていないのなんて、僕くらいだよ!!

知りません。
あなたには、大学の入学祝いに買ってあげた、パソコンがあるでしょ。
それにもう20歳なんだから、欲しいものがあれば自分でバイトして買いなさい。

もう、いいよ!



すぐるさん。

どうしたんだい、のび太くん

すぐるさんは、iPhone X・・・ なんて持ってたりしないよね・・・?

僕は持っていないな~

すぐるさん・・・

なんだい、もう、きみが言おうとしていることは分かっている。
何度も言っているけど、お金を増やす裏技はないからね。

だよね・・・。分かっているよ。。。
はっ!たかし!!

たかしくんが、どうかしたんだい?

すぐるさん、この前たかしが、FXで儲けたって言ってたんだよ。
パソコンで株みたいに売り買いするだけで、簡単にお金が増えたって。
僕もFXでお金を増やして、iPhone Xを買ってやるんだ!

のび太くん、やめとき・・・
(待てよ・・・これは良い機会かもしれないぞ!)
分かったよ、のび太くん。
きみがそこまで言うのなら、僕がFXを教えてあげるよ。

本当に!!やったー!!

先に言っとくけど、僕はFXによる資産形成は一切おススメしない。
あくまで、ほんの少しの間、のび太くんの勉強のために付き合うだけだからね。

勉強!?

当たり前だ。適当に売り買いして儲かるわけないだろ。
きちんと過去のデータを分析して、売買するんだ。

分かったよ。
ところで、FXって何?

なんだい、知ってて、たかしくんの話をしてたのかと思ったよ。
いいかいのび太くん、FXというのは・・・



すぐるさん、分かったよ!!
・円とドルなどの外国の通貨同士を売り買いする外貨交換(Foreign eXchange)の略称で、FXなんだね
・1ドル113円のときに、1000ドル分買って、1ドル114円のときに売れば、1円×1000で1,000円儲かる
・逆に1ドル112円になってしまうと、1,000円損する
・でもドルを売るほうからも売買できて、下がる方向を予想しても儲かる
・手数料的なものは、今回は無視できるくらい小さい
・始値は一日の取引の開始値段、終値は一日の取引の終了時の値段、高値は一日で一番高かった値段で、安値は一番安かった値段

ってことだね。

のび太くん、ついに分かってくれたか!!!
もう13回目の説明だよ・・・
今日は疲れた。続きはまた明日にしよう。



のび太くん、今日からFXの予測プログラムを作ろう。

予測プログラム?
ぼくに、そんな難しいもの作れるかな・・・

でも適当に売り買いしても、世界で一番不運なきみでは、一瞬にして貯金がなくなるだけだよ。

なんだよ、そこまで言わなくてもいいじゃないか。

のび太くん、君ももう20歳になったんだ。
自分の力で頑張るんだ。
君がアイデアを考えれば、プログラムの作り方は僕が教えてあげるよ。

分かったよ、考えてみるよ・・・



すぐるさん、すぐるさん!!
良い方法を思いついたよ。

えらいぞ、のび太くん!!で、どんな方法だい?

「今日の終値が昨日の終値よりも高かったら、きっと明日も高くなる。
逆に、安かったら、きっと明日は安くなる。」
どうだい!?

う~ん、のび太くんにしては悪くないアイデアだ!!
じゃあ、実際にプログラムにして、バックテストをしよう!

バックテスト?

過去のデータでその手法を試してみて、本当に儲かるかどうかを検証するんだ。
のび太くん、入学祝いで買ってもらったPCがあるだろ。
それを使ってプログラムを書こう。
よし、「アナコンダ~♪」

あなこんだ?

Anacondaは、データ解析によく使われるPythonというプログラミング言語と、データ解析用ライブラリのセットだよ。

とりあえず、以下の記事などを参考にして、Anacondaをインストールするんだ。
分からないところは、Qiitaで自分で調べるんだ。

AnacondaとTensorFlowのインストール記事の例
https://qiita.com/uosansatox/items/3e2e8e0a286e1635c548

よし、できたよ。

じゃあ次は為替のデータだ。
今回はドル円の一日ごとのデータに絞るね。
僕のGitHubに、ドル円の1997年から2017年10/30までのデータがあるから、それをダウンロードするんだ。
データはこちら

※為替データは、以下のフリーでログイン不要のデータサイトStooqから取得しました。
Stooq

よし、ダウンロードできたよ。

じゃあ、以下の記事などを参考に、Jupyter Notebookを開いて、プログラムを書こう。
https://qiita.com/icoxfog417/items/175f69d06f4e590face9

今回は2016年と2017年のデータでバックテストをしてみよう。
まずは、ファイルを読み込んでみよう。

今回のコードは全部僕のGitHubにおいて置くね。
本記事の掲載コードはこちら

# import関連
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
import seaborn as sns

import warnings
warnings.filterwarnings('ignore') # 実行上問題ない注意は非表示にします

%matplotlib inline

# dataフォルダの場所を各自指定してください
data_dir = "./"

# FXデータの読み込み
data = pd.read_csv(data_dir + "USDJPY_1997_2017.csv")

# Close-Openをデータに追加します
data['Change'] = data.Close - data.Open
data.head() # データの概要を見てみます

# 2016年のデータを取り出します
data16 = data.iloc[4935:5193,:] # pythonは0番目からindexが始まります

# 2017年のデータを取り出します
data17 = data.iloc[5193:,:] 
data17.head()

nobitafx1_1.JPG

このpandasというのは?

pandasはPythonでデータを読み込んで扱うためのライブラリだよ。
https://qiita.com/hik0107/items/d991cc44c2d1778bb82e

まずは、お手本通りにやって、少しずつ慣れていこう。

よし、じゃあ2016年のデータに、さっきのび太くんが考えた
「今日の終値が昨日の終値よりも高かったら、きっと明日も高くなる。
逆に、安かったら、きっと明日は安くなる。」
作戦を実施してみよう。

# 2016年の合計を計算する
# 前々日終値に比べて前日終値が高い場合は、買い、低い場合は売りで入ります
sum_2016 = 0
for i in range(2,len(data16)): # len()で要素数を取得しています
    if data16.iloc[i-2,4] <= data16.iloc[i-1,4]:
        sum_2016 += data16.iloc[i,5]
    else:
        sum_2016 -= data16.iloc[i,5]

print("2016年の利益合計:%1.3lf" %sum_2016) # 2016年の利益合計

出力:2016年の利益合計:9.675

すぐるさん、9.675だよ!!プラスだよ!!
9.675ってことは、1000通貨だったら、9,675円、1万通貨なら約10万円、10万通貨なら100万円儲かるってことだよね!!
これでiPhone Xが買えるぞ!!
やった、やったー!!

落ち着きなよ、のび太くん。
2017年の結果も見てごらん。

# 2017年の合計を計算する
# 前々日終値に比べて前日終値が高い場合は、買い、低い場合は売りで入ります
sum_2017 = 0
for i in range(2,len(data17)): # len()で要素数を取得しています
    if data17.iloc[i-2,4] <= data17.iloc[i-1,4]:
        sum_2017 += data17.iloc[i,5]
    else:
        sum_2017 -= data17.iloc[i,5]

print("2017年の利益合計:%1.3lf" %sum_2017) # 2017年の利益合計

出力:2017年の利益合計:-3.139

-3.139・・・
マイナスじゃないか~!
どういうことだよ、すぐるさん!

のび太くん、いちいちぼくに聞かないで、自分で考えるんだ。
なんでだと思う?

う~ん、ぼくの作戦が間違っていたのかな?
2016年はたまたまプラスになっただけ?

そうとも言えるし、そうとも言えない。

もう、わからないよ!

仕方ないな~。のび太くんの作戦はうまくいく場合とうまくいかない場合があるんだよ。
「今日の終値が昨日の終値よりも高かったら、きっと明日も高くなる。
逆に、安かったら、きっと明日は安くなる。」作戦は、
大きなトレンドが生まれているときは使えるけど、そうでないときには機能しないんだ。

トレンド?

一度グラフをプロットしてみよう。

# 2016年のデータをプロットしてみます
plt.style.use('seaborn-darkgrid')
plt.plot(data16['Close'])
plt.ylim([95,125])

nobitafx1_2.png

# 2017年からのデータをプロットしてみます
plt.plot(data17['Close'])
plt.ylim([95,125])

nobitafx1_3.png

トレンドってのは傾向のことで、一方向に上がり続けたり、下がり続けたりすることだよ。
2016年は、前半はブレエグジットなんかがあって、ずっと下がり傾向で、後半はトランプ大統領への期待から、上がり傾向の、大きなトレンドが生まれていた年だったんだよ。

でも2017年は、そうした大きな傾向があまりないんだよ。
同じ範囲内を上がったり、下がったりしている、レンジ相場っていうんだ。
「今日の終値が昨日の終値よりも高かったら、きっと明日も高くなる。」って考える人もいれば、
「今日の終値が昨日の終値よりも高くて、もう十分。きっと明日は安くなる。」って考える人も多いってことさ。

そうか~、せっかく考えたぼくの作戦はダメなのか・・・

そんなことないよ、のび太くん。
2016年がプラスだったように、相場にトレンドがあるときにはのび太くんの作戦も使えないことはない。

う~ん、難しいんだね・・・

いや、のび太くんにしては、ここまで考えてやってみただけでも、十分さ!
今日はここまでして、次回はもっと良い方法を使ってみよう。

良い方法?

機械学習と呼ばれる手法さ。
はじめは単純な機械学習から実装してみて、うまくいく方法を探してみよう。

よし、次こそ、iPhone Xが買える作戦を立てるぞ!

その意気だ!のび太くん。
次回は、「線形モデルによる回帰分析」で、FX予測をしてみよう。

1000系モデルによる怪奇分析?
よく分からないけど、大丈夫かな・・・

大丈夫だよ、細かい理論や実装方法は、僕がきちんと解説するから。



「第2話:のび太、線形回帰を学ぶ」に続く


以上、ご一読いただきありがとうございます。
記事やコードの間違え、改善点、不明点など、気軽にコメントいただければ幸いです。
感謝