Python

【実践】Pythonで株価取得~分析・予測まで実践してみよう!

stock
記事内に商品プロモーションを含む場合があります
ウマたん
ウマたん
当サイト【スタビジ】の本記事では、データサイエンスの実践として株価データを使った分析を解説していきます!実データをもとに学習・予測モデルを作る手法をマスターしていきましょう!

こんにちは!スタビジ編集部です!

この記事ではデータサイエンスの実践として”株価データ“を使った分析を解説していきます!

ロボたん
ロボたん
データサイエンスを勉強した!・・・けどなかなか学んだ知識を活かす場面が少ない気がする、、、
ウマたん
ウマたん
そうだね!せっかく勉強しても実戦で使わないと身についた知識が無駄になってしまう!

データコンペに出るのは一つだけど、人によっては「ハードルが高い!」ってなりそうだから今回は身近な株価データを使った分析をしてみよう!

実際に手を動かしつつ「株価データの取得」~「データの分析」までの一連の流れをマスターしましょう!

株式投資について興味がある方は以下の記事で勉強法をまとめているので、チェックしてみてください。

stock_learn
株式投資初心者におすすめの勉強法は?6STEPで徹底解説! こんにちは!スタビジ編集部です! 最近、若い人でも資産運用に興味を持つ人が増えてきています。 特に「株式投資」は手軽...

また、株式投資×データ分析の力で株価予測をマスターしたいのであれば当メディア運営サービスの「スタアカ」の「14.株価予測コース」で詳しく取り上げています!こちらもご参照ください!

株価データの取得

まず株価データを取得について学んでいきましょう!

ターゲットの指定

今回はデータの取得に”yfinance“というライブラリを使います

これは”Yahoo!Finance’sAPI”から作られたライブラリで、Yahooファイナンスから株価データを取得することが出来ます!

ただ、Yahoo! finance APIは、Yahooの公式のサービスではなくYahooの一般公開されているAPIを使用したオープンソースのツールで個人的な使用のみを目的としてます

なので、あくまで勉強のために使うように使い方には注意しましょう!

pip install yfinance

ライブラリはpipコマンドで簡単にインストール出来ます!

では”Yahoo Finance API”を使って株価データを取得していきましょう

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import datetime
import yfinance as yf

#ターゲットを指定
ticker = "AMZN"

#データを収集
data = yf.download(ticker , period='7d', interval = "1d")

“ticker”の変数にターゲットとなる株の銘柄コードを指定します!

今回はターゲットをAmazon(銘柄コード”AMZN“)を指定しました

変数には複数の株を指定することも出来ます

#ターゲットを指定
tickers = "AMZN AAPL"

このように設定すると、AmazonとAppleの情報を一度に取得できます

日本株を指定するときは銘柄コードに東京証券を表す「.T」を追加します

#ターゲットを指定
ticker = "4755.T"

上記は楽天グループ(銘柄コード:4755)を選択した例となります

取得するデータの期間、頻度の選択

ターゲットを指定した後は取得する期間、頻度を決めてデータを取得していきます!

#データを収集
data = yf.download(ticker , period= "7d", interval = "1d")

download関数“で取得したい株価データを指定します

引数はいろいろありますが、download(ターゲット, 期間, 頻度)をまずは指定しましょう!

取得したデータがこちらです!

stock

期間」は日単位、月単位、年単位の他、”ytd”(当会計年度)や”max”(全期間)を選択できます

今回は「period= “7d”」と7日間を指定しました

またこの期間に「start/end」を使って、特定の日にちを指定することも出来ます

#データを収集
data = yf.download(ticker, start= "2022-01-01",end="2022-01-15", interval = "1d")

2022年1月1日から2022年1月15日のデータを取得しています

頻度」は分単位、時間単位、日単位、週単位、月単位を選択出来ます

今回は「interval = “1d”」と各日のデータを取得しました

また、取得できる頻度のバリエーションは決まっています

[1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo]

m⇒分、h⇒時間、d⇒日、wk⇒週、mo⇒月となっています

なので、4h置き(interval = “4h”)みたいな指定をするとエラーになってしまうので注意してください!

ウマたん
ウマたん
yfinance“というライブラリを使って簡単に株価の情報を取得することが出来たね!

また、株価の情報でだけではなくて財務情報も取得できるみたいなので、余裕があったら試してみよう!

株価データの可視化

取得したデータの中身を詳しく見ていきましょう!

#データを収集
data = yf.download(ticker , period= "7d", interval = "1d")
data

yfinanceではデータをpandasのDataFrameの形で返してくれます!

stock

株の情報が取得出来ていますね!Date列がIndexになっています

  • Date:取得日時
  • Open:始値
  • High:高値
  • Low:安値
  • Close:終値
  • Adj Close:調整後終値
  • Volume:出来高

このデータを使えば株価の変動を見たり、株価の予測とか出来そうです!

ではこのデータを可視化してみましょう!

単位が違う「Volume」はいったん削除して折れ線グラフで見てみます!

df = data
df = df.drop("Volume", axis=1)

#可視化する
df.plot()
stock

価格の推移が可視化されました、こう見ると週前半からやや右肩下がりでしたが、最後は回復しそうに見えますね

取得するデータの期間や頻度を変更して、どのように価格が変動しているか見てみましょう!

次に、株のチャートでよく見るローソク足のグラフを表示します

ローソク足のグラフは”mplfinance“というライブラリを使って出力します

import mplfinance as mpf

#ローソク足グラフの表示
mpf.plot(df, type="candle")

ライブラリがインストールされていない場合はpipコマンドでインストールしましょう!

stock

ローソク足のグラフを表示させることが出来ました

また、出来高(株売買の取引量)も併せて出力出来ます

全体の流れを見るため、取得するデータの期間を6ヶ月にして可視化します

#データを収集
df = yf.download(ticker, period  = "6mo", interval = "1d")
#ローソク足グラフの表示
mpf.plot(df, type="candle",volume=True,figratio=(10,5))

先ほどの関数で「volume=True」を指定します(※Volume列を削除してしまった場合はもう一度データを取り直しましょう!)

stock

価格の変動と出来高の増減を一度に見ることが出来ました!

ウマたん
ウマたん
株価情報をグラフ化することが出来たね!

ここで可視化して分かった情報(変化が大きい場所等)を深堀りして、今後の分析に活かしていこう!

株価データの加工

株価の分析をするため、取得したデータを使って新しい指標”移動平均“を加えてみましょう!

全体の流れをみるため、期間を6ヶ月にしたデータで分析します

#データを収集
data = yf.download(ticker, period  = "6mo", interval = "1d")
#移動平均を指標に加える
price = df["Close"]
span = 5
df["sma05"] = price.rolling(window=span).mean()

移動平均にはpandasの”rolling関数“を使用します

rolling関数は窓関数と呼ばれるものを指定した要素の数の幅だけ適用する関数となっています

今回は幅を「5」と設定し、平均値メソッド(mean)を指定しているため、5日間の終値の平均を5日目に記録しています!

df
stock

移動平均(sma05)が追加されています!ただ、最初の4日間は5日間分のデータがなくNaNとなっています、、、

そこで、最初の4日間は取得できる日数の平均を取る(min_periods=1)ように設定します

df["sma05"] = price.rolling(window=span, min_periods=1).mean()
df
stock

グラフにするとこのようになります

plt.plot(df.index, df["Close"], label="Close")
plt.plot(df.index, df["sma05"], label="sma05")
plt.legend()
stock

rolling関数では、平均値の他にも中央値や最大値を取得したり幅の中の要素に重みづけを付けることが出来ます

ウマたん
ウマたん
rollomg関数の設定を変更してみて、自分の分析に活かしてみよう!

株価データの分析

取得した株価データを使って統計的な分析を行っていきましょう!

今回は6ヶ月間の株価データに対して”ARIMAモデル“を使った時系列データ分析を行います

“ARIMAモデル”は時系列データの差分をとって差分のデータに落とし込むことで定常にし、ARMAモデルを適用するモデルで株価などの非定常性データに用いられます!

時系列データ分析について詳しく知りたい方は下記の記事をチェックしてみてください!

【入門】時系列データ分析の基礎と注意点について解説!当サイト【スタビジ】の本記事では、実務の場で登場することの多い時系列データの分析方法についてカンタンにまとめていきます!時系列要素を加味しないとちゃんとしたモデリングができない状況に陥ります。注意しましょう!...

まずは取得したデータを学習データ(70%)とテストデータ(30%)に分けます

#ARIMAモデル データ準備
train_data, test_data = df[0:int(len(df)*0.7)], df[int(len(df)*0.7):]
train_data = train_data['Close'].values
test_data = test_data['Close'].values

今回はランダムではなく日時で7:3に分割して使用します

続いてARIMAモデルを実装していきます

ARIMAモデルはstatsmodelsライブラリから呼び出して使用します

from statsmodels.tsa.arima.model import ARIMA

statsmodelsライブラリが入っていない場合はインストール(pip install statsmodels等)しましょう!

ARIMAモデルはARモデルとMAモデルを組み合わせで、下記の3つのパラメータ(p,d,q)を入力します

  • p:ARモデルのパラメータで、遅延観測値の数
  • d:観測値の段差
  • q:MAモデルのパラメータで、移動平均ウィンドウのサイズ
# ARIMAモデル実装
model = ARIMA(train_data, order=(6,1,0))
model_fit = model.fit()
print(model_fit.summary())

今回はパラメータ(p,d,q)にp=6、d=1、q=0と選択しました

実際にはパラメータをチューニングして最適な値を見つけてモデル構築しましょう!

では実際にARIMAモデルを用いて予測をしてみます

#ARIMAモデル 予測
history = [x for x in train_data]
model_predictions = []
for time_point in range(len(test_data)):
#ARIMAモデル 実装
    model = ARIMA(history, order=(6,1,0))
    model_fit = model.fit()
#予測データの出力
    output = model_fit.forecast()
    yhat = output[0]
    model_predictions.append(yhat)
#トレーニングデータの取り込み
    true_test_value = test_data[time_point]
    history.append(true_test_value)

ARIMAモデルでは差分のデータを使うため、観測したテストデータを毎回取り込み、モデルを再構築しながら進めていきます!

実際に取得した予測データとテストデータを比較してみましょう

#可視化
plt.plot(test_data, color='Red', label='実績値')
plt.plot(model_predictions, color='Blue', label='予測値')
plt.title('Amazon 株価予測値', fontname="MS Gothic")
plt.xlabel('日', fontname="MS Gothic")
plt.ylabel('Amazon 株価', fontname="MS Gothic")
plt.legend(prop={"family":"MS Gothic"})
plt.show()
stock

日数のずれがありますが、おおむね増減の傾向が近しいモデルを構築出来た感じですね!

ウマたん
ウマたん
パラメータの値を変えたりしながら、予測精度を高めていこう!

Pythonで株価データの分析まとめ

今回は”yfinance“というライブラリを使ってpythonで株情報の扱い方を学んでいきました。

データの取得」~「データの分析」について実際に手を動かしながら、実データを分析するための準備が出来たと思います!

仮想通貨のPython分析については以下の記事でまとめていますのでこちらもあわせてチェックしてみてください!

virtualcoin
【実践】Pythonで仮想通貨データを取得して分析してみよう!当サイト【スタビジ】の本記事では、データサイエンスの実践として仮想通貨のデータを使った分析を解説していきます!実データをもとに仮想通貨の売買手法をマスターしていきましょう!...

また、ARIMAモデルを含む3種のAIモデルについて需要予測をテーマに説明した以下の記事では、Python実装も含め解説しています!

AIモデルを用いた需要予測 事例とPython実装例を解説!
AIモデルによる需要予測の事例と手法を紹介!Pythonで実装してみよう!当サイト【スタビジ】の本記事では、AIモデルによって顧客の需要を予測する手法とその事例について紹介します!また、Pythonで簡単な実装も行っていきましょう!...

ここからは、ご自身で統計手法や機関学習を用いて株価の予測などに挑戦してみましょう!

ウマたん
ウマたん
様々なデータを使って、分析力を磨いていこう!

株式投資×データ分析の力で株価予測をマスターしたいのであれば当メディア運営サービスの「スタアカ」の「14.株価予測コース」がオススメ!

当メディアが運営するAIデータサイエンス特化スクールの「スタアカ(スタビジアカデミー)」を受講することで株式投資×分析と共に分析の土台となる様々なスキルが身につきます!

スタアカ(スタビジアカデミー)

スタアカトップ公式サイト:https://toukei-lab.com/achademy/

【価格】ライトプラン:1280円/月
プレミアムプラン:149,800円
【オススメ度】
【サポート体制】
【受講形式】オンライン形式
【Pythonの学習範囲】データサイエンスを網羅的に学ぶ
実践的なビジネスフレームワークを学ぶ
実際に実データを使った様々なワークを行う

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「スタアカ」!!

当メディアが運営するスクールです。

24時間以内の質問対応と現役データサイエンティストによる複数回のメンタリングを実施します!

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください!

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解などもあわせて学べるボリューム満点のコースになっています!

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます!

・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析
・世界最大手小売企業のウォルマートの実データを用いた需要予測
・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定

また、データサイエンティストになるための独学ロードマップについて知りたい方はぜひ以下の記事をチェックしてみてください

【5分で分かる】データサイエンティストに必要なスキルと独学勉強ロードマップ!当サイト【スタビジ】の本記事では、データサイエンティストに求められるスキルとそれを身に付けるための勉強法について徹底的にまとめていきます!入門者でも、しっかりデータサイエンティストについて理解しある程度独学で駆け出しの状態までいけることを目指します。...
スタビジアカデミーでデータサイエンスをさらに深く学ぼう!

スタアカサービスバナースタビジのコンテンツをさらに深堀りしたコンテンツが動画と一緒に学べるスクールです。

プレミアムプランでは私がマンツーマンで伴走させていただきます!ご受講お待ちしております!

スタビジアカデミーはこちら