鈍足ランナーのIT日記

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

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

PythonのPの字も知らない素人が株価予想【上げ下げ】するまで

Anacondaをインストール

Anacondaを入れると機械学習系のモジュールがインストールされて手間いらず、またipythonというツールがインストールされるので、ゴニョゴニョ実行しながらコーディングするといい感じ。

株価のデータはどうやって入手するの

qiita.com

ynakayamaさんの株価取得のプログラムを証券コードを数字以外も使えるように改変。実行したらhtml5libがインストールされていないエラーがでたのでインストール。

pip install html5lib

改変したコードはこちら
https://github.com/dokechin/yking

日経平均株価(998407.O),NYダウ(^DJI),DAX(^GDAXI)を取得。

python jstock.py 998407.O 2016-01-01

日経平均は取れたけれど、ダウはYAHOO自体が値を持っていないようだった参りました。

まぁ、いいや、日経平均の前日と前々日の差分および、前々日と前々前日の差分を入力データにしてしまおう。(適当)
そして、当日の上げ下げをラベルデータとして1,-1というデータで作っておく。

株価のデータの読み込はどうするの?

import pandas
pandas.read_csv("stock_998407.O.csv",index_col=0, parse_dates=True);

NANのデータを除きたい

stackoverflow.com

df.dropna(subset = ['Close'])

データを解析できるように整形する

ここが一番大変です。Pythonのライブラリは便利な機能が満載なので
なんとかなりました

stackoverflow.com

qiita.com

stackoverflow.com

分析する方法

qiita.com

d.hatena.ne.jp

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

df = pandas.read_csv("stock_998407.O.csv",index_col=0,parse_dates=True)
df = df.dropna()
df = df.shift(-1)-df

features = []
# create feature data
for i in range(df.shape[0] - 3):
    features.append([df.ix[i, "Close"],df.ix[i+1, "Close"]])
features = numpy.array(features)
vmax = features.max();
vmin = features.min();
features = (features - vmin) / (vmax - vmin) * 100;
features = numpy.ceil(features)

# create label data
labels = df.ix[2:-1, "Close"].as_matrix()
labels = numpy.sign(labels)
  
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)

こんなかんじでコーディング、日経平均のデータから日経平均を予想するといういい加減な感じですが、とりあえず5割は超えた(0.554)なので良しとしよう。

ダウや為替を入れて行けば精度はかなり上がるのではないかな?