top of page
  • 執筆者の写真bookloveru2

pythonで株価分析⑯【ディープラーニング(深層学習)で株価予測(Keras・RNNでAmazonを分析】

更新日:2021年11月1日





皆様、こんにちは。

乞食です。


今回はpythonの深層学習フレームワーク【Keras】を使用して、アマゾンの株価変動を予測するモデルを作ります(`・ω・´)ゞ


Amazonと言えば、2021.7.5付けでアマゾンCEOを退任し、2021.7.20付けで宇宙へ旅立つジェフ・ベゾス様で話題いっぱいです

(*´▽`*)


そんなベゾス様が一代で築き上げたアマゾンの株価は、

「このパラメータで騰落しているんじゃないか❕❓」

的な数理モデルを構築したくて、ディープラーニングで株価の変動予測をしてみました。


では、ベゾスと宇宙へ、行ってみよう(・ω・)ノ


※全てのpythonコードは文末にあります。

 

目次

Amazonの株価推移

ディープラーニング(深層学習)モデルを構築

予測結果

Facebookが開発した機械学習ライブラリで株価を予測

python一括コード

 



❶ Amazonの株価推移

まず、Amazonの株価推移を見ていきましょう。

期間は、私がAmazon株を買おう❕と、思って買えなかった

【2018.7.20~2021.7.11現在まで】

2020.1月頃から、株価は爆上げしております!!

買えなかった私、死ね❕




❷ ディープラーニング(深層学習)モデルを構築

では、ここからKerasを使用してモデルを構築します。


Recurrent Neural NetworkRNN)を使用

RNNは日本語では「再帰型ニューラルネットワーク」と呼ばれ、数値の時系列データなどのシーケンスデータのパターンを認識するように設計されたニューラルネットワークのモデルです。

https://qiita.com/kazukiii/items/df809d6cd5d7d1f57be3 より






下記の画像を例に今回のモデルを説明すると、

画像は国内最強の頭脳集団:PFNのchainerチュートリアルより👆

https://tutorials.chainer.org/ja/13_Basics_of_Neural_Networks.html



ワイン判定の様に

【年数・アルコール度数・色合い】

という情報の、株価バージョンを決めて、株価予測モデルを構築します。


株価バージョンでは、

【金利・原油価格・ダウ平均株価・出来高】

を「入力層」4個(パーセプトロン)とします。


「中間層(隠れ層)」は、16個⇒8個(パーセプトロン)。

活性化関数はReluを使用。最適化関数はadamを使用。


「出力層」はシグモイド関数で1個(パーセプトロン)です。


この計算結果から、明日の株価が上昇する確率が分かります

(`・ω・´)ゞ



予測結果

では、結果です(`・ω・´)ゞ

明日の株価が上昇する確率は『52%』です。。。。。(´・ω・`)

1/2やん。。。。ディープラーニング意味ないやん。。。







モデルの学習過程です👇


正解率は50%から58%まで、微妙に微かに、上がっています。

損失関数は0.7から0.67まで、微妙に微かに、下がっています。


11回目くらいの学習から精度が上がってきたよ(´∀`*)ウフフ

いったい何が起こったのだろうね(*‘∀‘)?


残念ながら、こんなに簡単に未来の株価を予測することなんて、できないそうです!!!


死にてー(`・ω・´)ゞ




❹ Facebookが開発した機械学習ライブラリで株価を予測

pythonで株価分析⑦【Facebookが開発した機械学習ライブラリで株価を予測する】

を使って、株価予測です。


対象銘柄:アマゾン【AMZN】


学習期間:2018.7.20~2021.7.11(ベゾス宇宙行直前まで)




現在(2021.7.11時点)の株価が3,733ドルなのに対して、1年後も3,733ドル付近で推移する予測ですね(・ω・)ノ




一旦下落するけど、変わらんやん❓

という、結果でした(`・ω・´)ゞ


果たして、未来はイカほどに🦑❕❓




➎ python一括コード


# @title pip
!pip install yfinance
!pip install mplfinance
!pip install graphviz
!pip install pydot


#@title Kerasで株価予測
import datetime
import yfinance as yf
import matplotlib.pyplot as plt
import seaborn as sns
from pandas_datareader import data as pdr
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
import mplfinance as mpf
import requests
import argparse
import pandas as pd
import numpy as np
from keras.preprocessing.text import Tokenizer
from keras import models
from keras import layers
from sklearn.model_selection import train_test_split

from keras import Sequential
from keras.layers import Dense, SimpleRNN
from sklearn.preprocessing import StandardScaler

from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.linear_model import LogisticRegression
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline

#スタート日を決める
start = "2018-7-20" #@param {type:"string"}

#①株価を取得する
start = start #株価を取得するスタート日を決める
end = datetime.date.today()     #現在までの営業日(今日 =today)を取得する最終日とする
codelist = ["^DJI","^N225","^FTSE","000001.SS","IMOEX.ME","^BSESN","^BVSP", "BTC-USD","^TNX","GC=F","CL=F"]
#コードリストに取得したい銘柄を入れる アメリカ 日本 イギリス 中国 ロシア インド ブラジル ビットコ 10年金利 金 原油
yf.pdr_override() # <== that's all it takes :-)
# download dataframe
data2 = pdr.get_data_yahoo(codelist, start, end)["Adj Close"] .dropna()
data2.rename(columns={'^DJI':'ダウ',
 '^N225':'日経平均',
 '^FTSE':'イギリス',
 "000001.SS":'中国',
 'IMOEX.ME':'ロシア',
 '^BSESN':'インド',
 '^BVSP':'ブラジル',
 'BTC-USD':'ビットコ',
 '^TNX':'10 Year Treasury',
 "GC=F":"金",
 "CL=F":"原油"},inplace=True)

# 前処理開始。分析用のXとyを作成。
ticker = "AMZN" #@param {type:"string"}
yf.pdr_override()
df = pdr.get_data_yahoo(ticker, start, end)

# data2から説明変数追加
df["金利"] = data2['10 Year Treasury']
df["原油"] = data2['原油']
df["ダウ"] = data2['ダウ']
# 前日との差分をDiffへ格納
df["Diff"] = df["Adj Close"].diff()

# 終値×出来高を"出来高"へ格納
df["出来高"] = df["Adj Close"] * df["Volume"]
# 差分[Diff]を1行、上にずらして(.shift(-1))、xが0より大きい(つまり値上がりしていれば1。)
# xが0より大きくない(つまり値下がりしていれば0。)のラムダ式xを作成。.apply()でラムダ式をdf[Diff]へ格納して、df[y]を作成。
# yは未来の値。yが1なら明日の株価終値は上昇。つまりyは正解ラベル。
df["y"] = df["Diff"].apply(lambda x: 1 if x > 0 else 0).shift(-1)
# OpenとかHighとかをdfから削除.drop(["消すindex"],axis=1で列を指定)。.dropna()で欠損値のある行を削除。
df2 = df.drop(["Open", "High", "Low", "Close", "Volume", "Diff", "Adj Close"],axis=1,).dropna()
# print('\033[35m'+"dfを表示\n"+'\033[0m', (df))
print('\033[35m'+"df2を表示\n"+'\033[0m', (df2))

# 説明変数
# yを列ごと削除してXを作成。
X = StandardScaler().fit_transform(df2.drop(["y"], axis=1))
# 目的変数
# dfのyの値をyへ格納。yは正解ラベル。つまり(値下がりと値上がりの[0,1])だけのデータをyに充当。
y = df2["y"]

# デフォルトはtest_size=0.2525%がテスト用、残りの75%が訓練用。ここでは、テスト用を30%に設定。
# デフォルトでは要素がシャッフルされて分割される。引数shuffle=Falseとするとシャッフルされずに先頭から順番に分割される。
# 機械学習のモデルの性能を比較するような場合、どのように分割されるかによって結果が異なってしまうため、乱数シードを固定して常に同じように分割されるようにする必要がある。
# ここでは使用していないが、要素がシャッフルされる場合、デフォルトでは実行するたびにランダムに分割される。引数random_stateを指定して乱数シードを固定すると常に同じように分割される。
# 訓練データと検証データに分割
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,shuffle=False,)

# kerasでモデル作成
model = Sequential()
model.add(SimpleRNN(2, input_shape=(X_train.shape[1], 1)))
model.add(Dense(16, activation="relu"))
model.add(Dense(8, activation="relu"))
model.add(Dense(1, activation="sigmoid"))
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["acc"])
A1 = model.fit(X_train[:, :, np.newaxis], y_train, epochs=30, batch_size=5, verbose=1)
Y_pred = model.predict(X_test[:, :, np.newaxis])
print(accuracy_score(y_test, Y_pred > 0.5))
model.summary()

A1_dic = A1.history
print(A1_dic.keys())
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

# csvで時系列可視化
hist_df = pd.DataFrame(A1.history)
hist_df.to_csv('history.csv')


# tickerの株価をプロット
plt.figure(figsize=(6,4)) 
chart = yf.download(ticker, start=start, end=end)
mpf.plot(chart,type='candle',mav=(5,25,60),volume=True,show_nontrading=True)
plt.show
plt.clf()

# グラフ
plt.figure()
hist_df.plot()
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.grid()
plt.show()

print("\nX_train.shape", X_train.shape)
print("\ny_train.shape", y_train.shape)
print("\nX_test.shape", X_test.shape)
print("\ny_test.shape", y_test.shape)
print("\n標準化後学習用の説明変数 X_train 上5行 ------------\n", pd.DataFrame(X_train).head())
print("\n学習用の正解ラベル(目的変数) y_train 上5行 ------\n", pd.DataFrame(y_train).head())
print("\n標準化後評価用の説明変数 X_test 上5行  ------------\n", pd.DataFrame(X_test).head())
print("\n評価用の正解ラベル(目的変数) y_test 上5行  ------\n", pd.DataFrame(y_test).head())

では、ばいちゃ。


pythonでプログラミングがしたい!! 
pythonを学びたい!という方には、
オンラインプログラミング教室『Aidemy アイデミー』がお勧めです。
ご自身でプログラム環境を用意する必要は無く、サイトへアクセスするだけです。  創業者は東京大学工学部卒の石川聡彦さん。
著書に『人工知能プログラミングのための数学がわかる本』(KADOKAWA/2018年)など。 
無料で、お試しもできますので安心です。
お時間ある方は下記リンクを覗いてみてはいかがでしょうか(*'ω'*)










閲覧数:944回0件のコメント
bottom of page