鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

Pythonで日経平均の上げ下げを機械学習で予想。

ダウ、日経平均、為替(USDJPY)のデータをcsvで用意しておきましょう。

一番データが少ないUSDJPYのデータは2000年からなので、日経平均のデータもそれに合わせ2000年からのデータだけを使うように間引いて保存しておきます。

ダウと日経平均、為替(USD日本円)のデータをcsvで入手する - 鈍足ランナーのIT日記

前日比のダウ、日経平均、為替の上げ下げのデータを特徴データ(features)としています。
ラベルデータ(labels)は日経平均の上げ下げを0,1にしています。
データが準備できたらSVMで解析するだけです。

うんうん。唸って作ったソースを公開してしまいます。

# coding: utf-8
import pandas
import numpy
from sklearn import svm
from sklearn import cross_validation
from sklearn import grid_search

ni225 = pandas.read_csv("YAHOO-INDEX_N225.csv",parse_dates=True)
ni225 = ni225.dropna()
ni225 = ni225.sort_values(by="Date", ascending=True).reset_index(drop=True)

dji = pandas.read_csv("YAHOO-INDEX_DJI.csv",parse_dates=True)
dji = dji.dropna()
dji = dji.sort_values(by="Date", ascending=True).reset_index(drop=True)

usdjpy = pandas.read_csv("USD-JPY.csv",parse_dates=True)
usdjpy = usdjpy.dropna()
usdjpy = usdjpy.sort_values(by="Date", ascending=True).reset_index(drop=True)

features = []
labels = []

# create datas
for i in range(1, ni225.shape[0] - 2):
    feature = []
    feature.append(ni225.ix[i, "Close"] - ni225.ix[i-1, "Close"])
    p_dji = dji[ dji["Date"] < ni225.ix[i+1,"Date"]].tail(2).reset_index(drop=True)
    feature.append(p_dji.ix[1, "Close"] - p_dji.ix[0, "Close"])
    p_usdjpy = usdjpy[ usdjpy["Date"] < ni225.ix[i+1,"Date"]].tail(2).reset_index(drop=True)
    feature.append(p_usdjpy.ix[1, "Close"] - p_usdjpy.ix[0, "Close"])
    labels.append(ni225.ix[i+1, "Close"] - ni225.ix[i, "Close"])
    features.append(feature)

# normalizations of features
features = numpy.array(features)
vmax = features.max()

vmin = features.min()
features = (features - vmin) / (vmax - vmin) * 100
features = numpy.ceil(features)

# normalizations of labels
labels = numpy.array(labels)
labels = numpy.where(labels < 0 , 0 , 1)
  
X_train, X_test, y_train, y_test = cross_validation.train_test_split(features, labels, test_size=0.3, random_state=1)

clf = svm.SVC()
grid = grid_search.GridSearchCV(estimator=clf, param_grid={'kernel': ['rbf','linear']})
grid.fit(X_train, y_train)
grid.best_estimator_.score(X_test, y_test)

上げ下げの数値を(0-100)に正規化する所が、為替も、株価も一律に処理していてまずい気もしますが・・・まぁいいか。
正解率は64.76%を超えてきてうれしい限りですね。
目標は7割超えですが、どんなデータを入れたらいいんだろ。