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割超えですが、どんなデータを入れたらいいんだろ。