Pythonで株価のデータ分析|株価分析を通してpythonによるデータ分析でできることを学びましょう【株価のデータ取得から、データ加工、指標の追加、グラフ化まで】

Pythonデータ分析

この記事の執筆・監修

キノコード
キノコード

テクノロジーアンドデザインカンパニー合同会社のCEO。
日本最大級のプログラミング教育のYouTubeチャンネル「キノコード」や、プログラミング学習サービス「キノクエスト」を運営。
著書「あなたの仕事が一瞬で片付くPythonによる自動化仕事術」や、雑誌「日経ソフトウエア」や「シェルスクリプトマガジン」への寄稿など実績多数。

はじめに

こんにちは。キノコードです。
「Pythonで株価のデータ分析|株価分析を通してpythonによるデータ分析でできることを学びましょう【株価のデータ取得から、データ加工、指標の追加、グラフ化まで】」について説明します。

みなさん、Pythonでデータ分析ができると聞いたことがありませんか?
では、Pythonではどんなことができるのでしょうか。そういう疑問お持ちの方がいらっしゃるかもしれません。
また、データ分析をやったことある人は、どんなツールを使って分析をしていますか?
私自身はPythonを覚える前は、ExcelやSPSSという有料のツールを使って分析をしていました。
ExcelやSPSSでやっていることはPythonでもできるのでしょうか?
結論としては、ExcelやSPSSでできてPythonでできないことはないといっても言い過ぎではないです。また私の個人的な感覚としては、PythonではExcel以上にできることがあります。
例えば、テクノロジーの最先端企業では、Pythonが使われることが多く、データ分析の専門家であるデータサイエンスの求人ではPythonを使えることが必須スキルになっていることが多いです。
ところで、そもそもデータ分析とはなんでしょうか?
データ分析とは、意思決定のためだと私は考えています。
データ分析では、集められたデータをグループごとに集めたり、条件を絞ったり、並び替えたり、表にしてみたり、基準と比較したり、グラフにしたり。
そういったことを通して、意思決定をします。
例えば、株であれば、買うとか売るという意思決定のためのデータ分析をします。
そのデータ分析を株価という題材をもとに学習をしていきます。
株を通してデータ分析をしてみたい方、他にも、excel以外でデータ分析をしてみたい方、Pythonでのデータ分析の方法を知りたい方、そういった方にお役立ちできればと思い動画を作りました。
データ分析では、データを集計・加工、あるいは、グラフ化をすることが必須のプロセスです。データ集計や加工についてはPandas超入門コース、グラフ化についてはmatplotlib入門講座でやっていく予定です。
新しい動画が更新されたときに通知がいくように、また、復習をする時に動画がどこにいったかわからなくならないようにチャンネル登録をお願いします。
それではパソコン画面に切り替えてレッスンを進めていきます。

この記事の信頼性と私のプロフィール

この記事は、Youtubeにて日本最大級のプログラミング教育のチャンネルを運営しているキノコードが執筆、監修しています。
私自身は、2012年からプログラミング学習を始め、2019年以降はプログラミング教育に携わってきた専門家です。
他にも、私には下記のような実績や専門性があります。

  • キノコードは毎月10名以上、合計100名以上ののプログラミング学習者と1対1でお悩みを聞き、アドバイスをしています
  • キノコード自身は、プログラミングスクールに通ったり、本や有料の動画で勉強してきた経験もあります
  • キノコードは、プログラミング学習サービス「キノクエスト」を運営しています
  • またの出版、プログラミング雑誌への寄稿の実績があります

レッスンで使ったファイルはこちら

キノクエストでアカウントの新規登録に進み、メール認証を完了します。

ログインした状態(プラン選択画面が表示されます)で下記のボタンをクリックいただくか、ファイルダウンロードページのURL:https://kinoquest.jp/main/file_download/を直接アドレスバーに入力ください。

どのような分析をするか

さて、この動画では、日経平均の日毎の株価をもとにデータ分析を進めていきます。
動画の最初の方で、データ分析は意思決定のためにあるとお伝えしました。
株においての意思決定は、売り買いをして利益を得る。つまり、その売り買いの意思決定のためにデータ分析するケースが多いと思います。
ただ、日毎の価格である数字の羅列をみているだけでは、この意思決定をすることは難しいです。
そのため、実際の株取引では、その数字に指標を追加したり、グラフ化、つまり、可視化をして売り買いの意思決定をします。
指標には色々あるのですが、この動画では、単純移動平均というベーシックな指標を追加します。
そして、日毎の終値と、その単純移動平均の指標をグラフにして、売り買いの意思決定のデータ分析を進めていきましょう。
他の指標であるRSIやMACD、ボリンジャーバンドなどについては別の動画で紹介できればと思います。
まずはこの動画では、データ分析の基本である、データ加工やデータ可視化を学んでいただければと思います。
動画の最後の方には、日本の個別銘柄の取得方法も紹介しますのでお見逃しなく。

実行環境と環境構築

まず、簡単にPythonを使うために、Anacondaを使っていきます。
Anacondaインストール方法は、Pythonの超入門コースの環境構築編をみてください。
概要欄にURLを貼っておきます。
AnacondaにはJupyter Labがインストールされています。Jupyter Labを起動してみましょう。
ちなみに、Jupyter Labの使い方についても、別動画で説明しています。こちらも概要欄にURLを貼っておきます。
起動方法は、macの場合はターミナル、Windowsの場合はコマンドプロンプトでJupyter Labと入力をしてエンターです。
Jupyter Labが起動しました。

ライブラリ、パッケージ、モジュール

次に、ライブラリをインストールしていきます。
まず、ライブラリとはなんでしょうか?
またライブラリに似たものとして、モジュールやパッケージという言葉があります。
これらの用語を最初に整理をしておきます。
ライブラリとは、よく使う機能・関数をまとめて、簡単に使えるようにしたものです。
そして、モジュールとは、関数やクラスなどを1つのPythonファイルにまとめたものです。
そして、いくつかのパッケージをまとめたものをライブラリといいます。
モジュール、パッケージ、ライブラリは、このよう関係になっています。
厳密に言葉の意味を理解しなくてもオッケーです。
ただ、ライブラリの中にパッケージがあって、パッケージの中にモジュールがあるのだと覚えておいてください。
そして、これらは簡単に使えるようにまとめてあるものだと思ってください。

pandas_datareaderとは

それでは、コードを書いていきましょう。
まずは、日毎の日経平均の株価のデータを取得していきましょう。
データ取得のために、pandas_datareaderというライブラリをインストールしましょう。
pandas_datareaderを使うと、日経平均やナスダック、日本の個別銘柄のデータを取得することができます。
エクスクラメーション pip instal pandas_datareaderです。
シフトをおしながらエンターです。
これでインストールが完了です。
次に、インストールしたライブラリのpandas_datareaderをインポートして使えるようにしましょう。
「from pandas_datareader import data」と書きます。

pandasとは

次に、「pandas」をインポートします。
Pandasは、データ解析を支援する機能を提供するPythonのライブラリです。
Pandasには、データの集計や加工などの機能が入っています。
Pandasで扱うデータ構造としてよく使うもので、「Series」と「Dataframe」があります。
1次元のデータを扱うときは「Series」、2次元のデータを扱うときは「Dataframe」というデータ構造になっています。
つまり、1列だと「Series」、2列以上だと「Dataframe」です。
詳しくは、pandas超入門コースで説明していますが、データ構造が1列のものと2列以上のものがあるのだと覚えておいてください。
さて、Pandasもインポートしましょう。
「import pandas as pd」を書きます。
「as」は、ライブラリ名(pandas)を好きな名前にすることができます。
したがって、「pd」という名前で「pandas」を使えることができます。

matplotlibとは

次にMatplotlibをインポートしましょう。
MatplotlibはPythonのグラフを描くためのライブラリです
Matplotlibは非常に様々なグラフを描くことができます。
たとえば、線グラフ、棒グラフのほかに、円グラフ。
ヒストグラム
箱ひげ図
3Dグラフまで描くことができます。
Matplotlibの細かい解説については、matplotlib入門講座というものを作ります。
このレッスンでは、説明しきれなかった部分を最初から丁寧に説明していきますので、チャンネル登録をしてお待ちください。
それでは、Matplotlibをインポートしましょう。
Matplotlibの中のpyplotモジュールをインポートしましょう。
これもasをつけてpltという名前で使えるようにしましょう
そして、jupyterlab上で作成したグラフを表示できるように%matplotlib inlineと記述しましょう。
これでライブラリのインストールは完了です。
シフトとエンターで実行しましょう。
赤いセルでwarningが出てきます。
このプルグラムには影響がないですが、気になるからはこちらを実行してみてください。

pandas_datareaderを使ってデータ取得

それでは、日経平均のデータを取得してみましょう。
startという変数に取得する日を代入しましょう。
あわせて、データの最後の期間もendという変数に代入しましょう。
dfという変数に、pandas_datareaderの省略名のdataドット、データリーダー丸括弧。
丸括弧の最初の引数にシングルクオテーションの中にハットを書いてN225、次の引数にyahooからデータをとってくるのでyahoo。
次に期間であるstartとendを記述しましょう。
実行してみます。
これで、dfという変数にpandasのデータフレームとしてデータが格納されているはずです。
headで上位10件を表示させてみましょう。
データが取得ができているようです。

データの確認

これがデータフレームです。
データフレームはカラムとインデックスとデータ部分の3つから成り立っています。
データフレームについて詳しく知りたい方は、Pandas超入門コースのデータフレームをご覧ください。
取得したデータの意味を説明します。
highは、その日の高値、lowは安値、openは始値 (はじめね)、endが終値です。
Volumeはその日の出来高、つまり、株取引された量です。
出来高は「出来高は株価に先行する」と言われています。
最後に、adj closeです。
adj closeとは、調整後の終値になります。
今回は調整後の終値を使っていきましょう。
データフレームのインデックスをみてみましょう。
インデックス名はdateとなっています。
中身をみてみましょう。
datetimeindexとなっています。
この型になっていると、時系列データとして扱えるので便利です。
またmatplotlibとして可視化するときにも便利です。

グラフの表示とサイズ変更

このインデックスをdateという変数に代入。
adj closeはpriceという変数に代入をしましょう。
では、さっそくこれをmatplotlibを使って可視化をしてみましょう。
plt.plotと書いて丸括弧。丸括弧の一番最初に引数にグラフでいうとx軸、2番目の引数にy軸にするものを記述します。
実行してみましょう。
グラフ化することができました。
ただし、このグラフは小さいです。
グラフのサイズを大きくしましょう。
plt.figureと書いて丸括弧。丸括弧の中にfigsize=と書きます。
今回は30と10にしましょう。
30が横の長さ、10が縦の長さです。
実行してみます。
グラフが大きくなりました。

グラフの名前(凡例)の付け方

線グラフに名前をつけましょう。
線グラフの名前をNikkei225としましょう。
ちなみに、線グラフ一つ一つの名前のことを凡例といいいます。
丸括弧の中にlabelと記述して、つける名前を記述します。今回はNikkei225です。
このラベルを表示させるには、legendを使います。
plt.legendです。
実行してみます。
右上に凡例が表示されました。

グラフのタイトルの付け方

次にグラフのタイトルをつけてみましょう。
plt.titleです。
丸括弧の中にグラフのタイトル。今回はN225としましょう。
フォントのカラーは、colorという引数で設定できます。
blueにします。
タイトルの背景は、backgroundcolorで設定できます。
今回はwhiteで設定します。
sizeは40とします。
最後にタイトルの位置です。locという引数で設定できます。leftやrightが設定できますが、今回はcenterとしましょう。
実行してみます。タイトルがついています。

matplotlibで設定できるカラー一覧

ちなみにmatplotlibで設定できる色はこれだけあります。
キノコードのブログに貼っておきますのでご活用ください。

#配色の参考サイト

https://colorhunt.co/palette/184189

x軸とy軸の名前

次にx軸の名前とy軸の名前を設定していきましょう。
plt.xlabelで設定できます。
丸括弧の最初の引数に、x軸の名前。フォントの色は黒としましょう。フォントサイズは30としましょう。
y軸についてはplt.ylabelで設定できます。y軸の名前はpriceとして、その他はx軸と同じように設定していきましょう。
実行してみます。
x軸とy軸が設定できました。
グラフを描くことができましたが、これだけではいつ買っていつ売るかの意思決定は難しいです。
単純移動平均という指標を追加してみましょう。

移動平均とは

まず移動平均とはなんでしょうか?
スプレッドシートを使って説明をしてきます。
これは先ほどの取得した日経平均をスプレッドシートに落としたものです。
これを使って移動平均を説明します。
移動平均とは、過去〇〇分の平均といいうことになります。
例えば、2019年6月7日時点の過去5日間の移動平均だと、6月3日から7日までの平均になります。
土日を挟んで6月10日の移動平均であれば、6月4日から6月10日までの5日分の平均になります。
このように5日分の窓が移動するように平均をとっていきます。
ちなみに、移動平均には、今紹介した移動平均の他に、6月7日なら6月7日に近い日付の方が、価値が高いとして重みをつけて平均をだす加重移動平均線や、同じように近い日付に重みをつける指数平滑移動平均 (しすうへいかついどうへいきん)などが株の分析には使われます。
さて、これをPythonで実装していきましょう。

移動平均の作成

まず、span01,02,03という3つの変数を準備します。
これに、5と25と50を代入します。
これは過去5日分の移動平均と、25日の移動平均、50日の移動平均を算出するために使います。
pythonで移動平均を算出するには、pandasのrolling()メソッドを使います。
データフレームに単純移動平均の略称sma01というカラムを追加しましょう。
データフレームに追加したいカラム名を記載します。
そして、データフレームから1列取り出したpriceを記述します。
ドットを書いてrollingと記述します。丸括弧の中には移動平均の日数を記述します。
windowという引数に日数を記述します。
先ほど、span01に5という変数を代入したのでこれを使いましょう。
そして、最後の平均という意味のmeanを書いて丸括弧です。
ちなみに、ここにmaxを書くと、過去5日間の最大値を取得できます。
またminと書くと過去5日間の最小値を取得できます。
これと同様にsma02というカラムを作って、過去25日の移動平均を作り、sma03というカラムを作って過去50日間の移動平均を作ります。
実行してみます。
さて、表示させてみます。
head関数を使って上位100件を表示させてみましょう。
新しいカラムが追加されているようです。
また、sma01は過去5日分の平均です。
したがって、4日目までは過去5日分のデータがないのでNanになっています。
sma02についても25日目まではNanになっています。
正しく単純移動平均の指標を作れたようです。
さて、これを先ほどのグラウフのここの部分に追加してみましょう。
実行してみます。
他の線グラフも追加されているようです。
線グラフに色を追加してみましょう。
今までは、色な名前で設定をしてきました。
RGBでも色を設定することができます。
今回はこのように設定してみました。
これは色を選べる便利なサイトがあるので、これを使ってみました。
配色を考えるときに便利です。
プレゼンテーションの時などに使ってみてください。
実行してみます。
いい感じの色のグラフになりました。

ゴールデンクロスとデッドクロス

この移動平均を使って売り買いの意思決定をしてみましょう。
ゴールデンクロスとデッドクロスという分析方法を紹介します。
ゴールデンクロスとは、短期の移動平均線が中期以上の移動平均線を下から上に抜けることをいいます。
つまり、価格が上昇しているサインになります。
例えば、ここ5日の移動平均が、50日の移動平均を下から上に抜けています。
また、ここでも、25日の移動平均が50日の移動平均を下から上に抜けています。
したがって、ここか、ここのタイミングで株を買うことができたら、21000円から24000円まで株の値段が上昇したことになります。
つまり、15%近く価格が上昇しているので、100万円分、株を買っていたら15万円儲けていたことになります。
次にデッドクロスについてです。
デッドクロスはゴールデンクロスの逆です。
デッドクロスは、短期の移動平均線が中期以上の移動平均線を上から下に抜けることをいいます。
ここで、5日と25日の移動平均が50日の移動平均を上から下に抜いています。
これはコロナウィルスの影響ですね。
一気24000円近くあった株価が、17000円まで下落しています。
つまり、30%近く下落しています。
ちなみに、株は、価格が上昇している時だけじゃなく、価格が下がる時も利益をあげることができます。
空売りというやり方です。
したがって、仮に24000円で空売りをして、17000円で再度取引をしたら100万円分買っていたとしたら30万円儲けられることになります。
ただし、これは結果論です。
あとからみると、そうだっただけで、その時点ではその判断は非常に難しいでしょう。
プロのトレーダーは、色々な指標を使って分析をしたり、経験や情報を仕入れて取引をしているようです。
この動画の最後の方に、個別銘柄のデータ取得方法をお教えします。
みなさんも気になる企業のデータ分析をPythonを使ってみてやってみたらいかがでしょうか?
さて、ここまでいかがでしたでしょうか?
データ加工やmatplotlibの使い方はどんな感じなのかイメージをつかめましたでしょうか?
プログラミングの上達方法はご自身でコードを書いてみることです。早速明日からご自身の仕事に生かしてみましょう。
キノコードでは、matplotlibについての詳しく解説をしたmatplotlib入門コースや、pythonを使った業務自動化の動画、他にもPythonを使ったデータ分析の動画をアップしていく予定です。
もしよければ、気に入っていただけましたらチャンネル登録をお願いします。

棒グラフ

次に、棒グラフを作ってみましょう
株のデータ分析では出来高をみることが多いです。
動画の最初の方に説明をしたように「出来高は株価に先行する」と言われているからです。
その出来高を棒グラフにしてみましょう。

グラフを並べて表示

最初は線グラフと同じようにfigsizeを設定します。
横30と縦を15にしましょう。
棒グラフは、plt.plotではなく、plt.barです。
最初にx軸にdateを記述します。次に棒グラフのデータを記述します。今回はdfの中のボリュームです。
labelはボリュームにして、色はグレーにしましょう。
実行してみます。
棒グラフができました。
線グラフと棒グラフと同じグラフの中で2分割して表示させてみましょう。
まず、figsizeを設定しましょう。
今回も、グラフの領域を2分割にする設定にしましょう。
subplot関数を使います。
丸括弧の中に2,1,1と記述します。
一番最初の2は、縦方向に分割する数です。
今回は上下2つに分割をするので、最初は2にします。
次は横方向に分割する記述です。
今回は1列で表示させたいので1と書きます。
最後は、グラフを配置する位置しめすインデックスです。
最初のグラフの番号は1としましょう。
そして、先ほど記述をした線グラフの記述をそのまま使います。
次に2つ目の棒グラフの記述をします。
2,1,2と記述します。
1番目と2番目は同じ記述です。
なぜなら、縦に2、横に1列ということは変わらないからです。
ただし、グラフを配置する番号は2としましょう。
そして、棒グラフの記述をします。
実行します。
グラフが2つ縦にならべて表示させることができました。

日本の個別銘柄の取得

それでは最後に、日本の個別銘柄の株の情報をデータ取得してみましょう。
まず、東京証券取引所のサイトにいきます。
リクルートホールディングスの株価を調べ得てみましょう。
リクルートで検索をしてみましょう。
結果がでてきました。
こちらです。
証券コードは6098のようです。
この証券コードを使ってデータ取得をします。
DataReaderを使って、最初の引数に証券コードを記述します。
Stooq というポーランドのサイトを使ってデータを取得します。
実行してみます。
headを表示させてみましょう。
取得ができているようです。

最小値と最大値

このインデックスの最大値と最小値を取得してみましょう。
df、ドット、インデックスのあとに、minimumのmin。最大値はmaxと記述します。
実行してみます。
最小値は、2015年6月1日。最大値は2020年5月28日
ただし、先ほどみたheadでは、上から下に新しいほうから古い方に並んでいました。
tailでも確認をしてみましょう
やはり新しい方から古い方にならんでいるようです。

インデックスを並び替え

並び替えをしてみましょう。
pandas超入門コースのレッスン3で簡単に紹介しましたが、通常のカラムの並び替えはsort_valuesを使います。
一方、インデックスの場合の並び替えは、sort_index()を使います。
実行して再度dfというデータフレームに代入をしましょう。
headで表示させてみます。
上から古い方から新しいほうに並び替えができています。

日付で抽出

日付の条件を絞ってみます。
さらに日付を絞ってみましょう。
2019年6月1日から2020年の5月1日までとしてみましょう。
df.indexの中から2019年6月1日以上とします。
実行してみます。
そうすると、条件にあうものがTrue、あわないものがFlaseが返ってきました。
これをデータフレームの中に入れます。
実行してみます。
2019年6月1日以上が抽出できました。
続いて、2020年の5月1日以下としてみましょう。
同じように記述をします。
実行してみます。2020年5月1日以下が抽出されました。
この2つの条件をand、日本語で言うと「かつ」の条件で抽出をしてみます。
2019年6月1日以上の記述と、2020年5月1日以下という記述をそれぞれ丸括弧でくくり、&マークでくくります。
実行してみます。
どうやら抽出ができたようです。
このインデックスの最大値と最小値を取得してみましょう。
正しく抽出できているようです。
この日付を自由に変更できるように変数にしてみましょう。
startという変数に2019年6月1日。
endという変数に2020年5月1日を代入をしましょう。
その他の記述は、今までの可視化のグラフの通りです。
実行してみます。
可視化ができました。
2015年6月1日からにしてみましょう。
うまく表示ができたようです。

変数化と関数化

次にユニクロやGUのホールディングス会社のファーストリテイリングの情報を取得してみましょう。
この証券コードの部分も変数にしてみます。
証券コードをcompany_codeという変数に代入をします。
ファーストリテイリングの証券コードは、6502.JPなのでこれを代入。
実行してみましょう。
今までみてきたリクルートホールディングスもファーストリテイリングも同じ記述が2箇所あります。
しかし、これは変数化をしたので、関数にすることができます。
そうすれば、値を渡すだけで結果が返ってきます。
関数のレッスンはpython超入門コースでやっています。詳しく知りたい方は、右上にリンクがでているので勉強してみてください。
概要欄にもURLを貼っておきます。
それでは、関数にしてみましょう。
関数名は企業の株という意味で、company_stockとしましょう。
関数に渡す引数をstart,end,company_codeとします。
コロンを書いて改行。
1画面でみれるようにfigsizeを変更しましょう。20と10に変更します。
以上です。
実行してみましょう。
関数を呼び出す方法は関数名と関数に渡す引数を記述します。
実行します。
表示できました。
期間を変えてみましょう。
2017年1月1日からのデータにしてみます。
うまく表示できているようです。
トヨタの株もみてみましょう。
7203.jpのようです。
実行してみます。
表示できました。
このような感じで関数化をするとコードの記述も短くなり使い回しもできます。
さらにカスタマイズもできますので、みなさん自身でもカスタマイズをしてみて可視化や分析をやってみてください。
以上が株のデータ分析の入門的な内容です。
株のデータ分析については、続きの動画を作りたいと考えています。他の指標を入れたり、もっと深い分析をしていく予定です。
他にも、業務自動化の動画、Pandasやmatplotlib、Pythonを使った人工知能に関するレッスン動画をどんどんアップしていく予定です。
いいねの数で次に作る動画を考えているので、株のデータ分析のこの動画がよければいいねをお願いします。
また、チャンネル登録もしていただけると嬉しいです。
長い時間ご視聴ありがとうございました。
それでは次のレッスンでお会いしましょう