AIに触れ始めて、最初に興味を持った株価分析について、まとめておきたいと思います。
概要
scikit-learnを利用して直前4日間の架空の株価から、当日の株価の上下を予想する。
・株価の学習と予測
stock_price.txtにフェイクの株価データが格納されている。
読み込んで変化率に変換し、4日分の変化率から次の日の株価の上下を予測するようにサポートベクターマシンを訓練する。
*サポートベクタマシン(Support Vector Machine、SVM)は、機械学習の分野で広く用いられる教師あり学習のアルゴリズムの一つ。SVMは、与えられたデータを分類する境界線(決定境界)を決定するために使用される。
from sklearn import svm
from sklearn.model_selection import train_test_split
with open("株価のデータ", "r") as f:
stock_file_data = f.read() #ファイルの読み込み
stock_file_data = stock_file_data.split() #改行で分割しリストに格納
stock_data = []
for stock_string in stock_file_data:
stock_data.append(float(stock_string)) #小数に変換したうえでリストに格納
# 株価の変化率
ratio_data = []
for i in range(1, n_price):
ratio_data.append(float(stock_data[i] - stock_data[i-1]) / float(stock_data[i-1]))
# (i番目の日の株価の値-前日の株価の値)÷前日の株価の値
n_ratio = len(ratio_data)
*株価の変化率は前日比
# 前日までの4連続の変化率のデータ
successive_data = []
answers = [] # 正解値 価格上昇: 1 価格低下: 0
for i in range(4, n_ratio):
successive_data.append([ratio_data[i-4], ratio_data[i-3], ratio_data[i-2], ratio_data[i-1]])
if ratio_data[i] > 0:
answers.append(1)
else:
answers.append(0)
入力として使うのは前日までの4連続の変化率のデータ
#訓練用データとテスト用データの分割
x_train, x_test, t_train, t_test = train_test_split(successive_data, answers, shuffle=False) # シャッフルしない
過去のデータを使って未来のデータの予測を行いたいので、この2つのデータのシャッフルは行わない。
clf = svm.SVC() # サポートベクターマシーン
clf.fit(x_train, t_train) # 訓練
y_test = clf.predict(x_test) # テスト用データで予測
# 末尾の10個を比較
print ("正解:", t_test[-10:])
print ("予測:", y_test[-10:])
# 正解率の計算
correct = 0.0
wrong = 0.0
for i in range(len(t_test)):
#予測結果と正解の比較
if y_test[i] == t_test[i]:
correct += 1.0
else:
wrong += 1.0
print ("正解率:", str(correct / (correct+wrong) * 100), "%")
表示した結果がこちら。
正解: [0, 0, 0, 1, 0, 0, 0, 1, 1, 0]
予測: [0 0 0 0 1 0 0 0 1 1]
正解率: 56.71342685370742 %
約57%という結果となりました。
そこまで高い数値とはなりませんでしたが、勘で予想するよりかは少し高いですね。
架空のデータを利用しているので、データを変えれば結果も変わると思いますし、単純にデータ量を増やしてやってみれば精度は高まっていくのではないかと思います。
実際のデータでもやってみて、分析が合っているかをチェックするのも面白そうです。
金融リテラシーが必須の世の中なので、株価とか分析してたらカッコいいですよね。笑笑
まとめ
今回はライブラリのすごさを感じることができたのが大きな収穫です。
覚えるのは絶対に無理ですが、こういったことをこのライブラリを使えばできるんだな!ということが頭にあれば、あとは調べるだけ。って感じですね。
自分の振り返り用みたいな記事ですが、
こんな感じなのか!とちょっとでも参考になれば幸いです。