プログラミング初心者がPythonで株価分析をやってみた -データ分析編-  

2024年10月8日掲載

AZ-900合格体験記

こんにちは、クラウドエンジニアの須藤です。 

この記事では、株価の分析を Python というプログラミング言語を用いてデータを可視化するまでに必要な基礎知識や分析を行うまでの流れについていろいろ勉強・経験をしたので紹介していきます。

この記事は、プログラミング初心者が経験した内容を「データ分析を通して Python を勉強してみたい」、「Python を勉強し始めたいがきっかけがない」という初心者の方に向けて書いた記事です。参考にしていただければ幸いです。

 Python 実行環境の構築方法については「プログラミング初心者がPythonで株価分析をやってみた-実行環境編- 」で投稿していますので、まだ読んでいない方は併せてご覧ください。

今回はデータの取得から分析をおこなっていきます。今回の分析にあたって自分の知識だけではなく、キノコードさんのブログも参考にさせていただきながら分析を進めました。

目次

この記事では
  • Python をはじめてみたい初心者の方向けです。
  • Python を用いたデータ分析について紹介します。

データの取得の仕方

前回の記事「プログラミング初心者がPythonで株価分析をやってみた-実行環境編-   」にて、Python を扱う環境の選定を行いましたので、本記事では JupyterLab を用いてデータ分析を進めていきます。ノートを新規に作成したところから今回はスタートです。

まずは、データ分析を行うためには当たり前ですが、分析対象のデータが必要です。今回でいうと「日付」と「株価」のデータが必要です。データを取得するためにいい方法がないかと探していたら、データを取得するためのよい方法が見つかりました。それが「pandas-datareader」ですPython のライブラリの一種で、Web 上のさまざまな情報を API を使って簡単に取得できる便利なツールのようです。Webサイトから株価のデータも取得できるようなので今回はこの方法を使ってみたいと思います。

この pandas-datareader は Anaconda には含まれていないライブラリのようなので、まずはこれをインストールする必要があるようなのでインストールします。

続いて、インストールしたpandas_datareader を使えるようにしたいので以下のコマンドを実行します。

さて、データを取得できるツールを利用することができるようになったので、実際にデータを取得してみようと思いますが、どうやって取得するか分からないのでここも調べてみました。調べてみた結果、pandas ライブラリの「DataFrame」の手法を使うと、取得したデータを行と列の表形式のデータ構造として構成してくれるようです。ちょうど今回、「株価」と「日にち」のデータを取得して可視化してみたいと思っていたので、この方法を試してみたいと思います。まずは pandas ライブラリを使えるようにして、

次に DataFrame 型で株価と日時のデータを取得してみようと思います。コードは以下の通りです。9434.JP はソフトバンク株式会社の証券番号で、データを取得してくるサイトは「stooq」を指定します。(※こちらが stooq のサイトです。)ここの値は個人の好きなように編集することができるので、他の企業の株価や他のサイトからデータを取得してみたい方がいましたら変えてみるといいと思います。

さて、データを取得できましたが、上の画面のように何も出てきません。「え?なんで?」と思いましたが、この取得したデータを見るためには、自分で定義した変数名の「df」を入力しなくては出てこないらしいので確認してみましょう。

これで確認することができました!初心者にとっては正直データを取得できたことすら嬉しいです笑。次にこれらのデータはそれぞれ何を表しているのかを見てみようと思います。

  • Date は、年月日の時系列のデータを表しています。
  • 始値(Open)、高値(High)、安値(Low)、終値(Close) はその日の株価の価格を表していて、始値(Open)はその日の取引開始時の株価の価格で、始値(Open)はその日の取引終了時の株価の価格を表しています。高値(High)、安値(Low)はそれぞれその日の株の取引時間内の一番高くなった値と低くなった値を表しています。
  • 出来高(Volume)はその日のうちに証券取引所で株券などが売買された数量のことを指すようです。

私が行いたいのはまず、株価の価格が日ごとに動いていることを示す折れ線グラフのようなものを作成したいと思っていますが、これらのデータを見て考えなくてはいけないことがあったので以下に記述します。

  • 株価の価格の変動を表すグラフには終値を使うのか?始値を使うのか?それとも終値と始値の平均値を扱うのか?それとも他の値を新しく出す必要があるのか?
  • 株価が小数点以下の値はどう処理するべきか?

1つ目の疑問に関しては株価の値やチャートを公開しているサイトを調べてみたところ、終値を使っていたので、今回データを可視化するのに使用するデータは終値(Close)を使おうと思います。

また、2つ目の疑問に関してはこちらも株価の値やチャートを公開しているサイトを調べてみたところ、小数点以下の値も公開していたのでこちらも特に値を修正せずにデータを使おうと思います。※小数点以下の株価の扱い方がちゃんとあるらしいです。

番外編-データの編集-

ここで少し道を外れますが、もし小数点を切り捨てる・四捨五入することになった場合のデータ加工方法について調べてみたいと思います。

まずは値を四捨五入できるようにしましょう。自分で調べてみた結果、Python で四捨五入を行うためには、decimalモジュールというものを使うようなので、以下のコマンドを入力して使えるようにします。

続いて、データフレームから終値(Close) の列を個別に抜き出します。あとでまた四捨五入した値を新しい列として加えて、比較するために今回は個別に抜き出します。

今回、四捨五入を行うための decimal モジュールが扱えるデータ型に変換しなくてはなりません。このままの float 型では使えないので、データの型を以下のコードを入力して変更します。

データの型が変更されました。それでは以下のコードを入力して四捨五入を行います。

これで四捨五入されました。あとは比較のためにもとのデータフレームのところにこの列を新しく追加すれば完了です。

せっかく整数の形にしてあげたので、データ型を int 型に変換しておきます。さらにこのまま新しくカラムを追加しても、一番後ろに列が新しく追加されて見づらくなってしまうので、列を入れ替えて見やすくしてあげました。個人的な感想としては Python で四捨五入の方法を調べるのにも時間がかかりました。こんなにも Python で四捨五入を行うためには手順を踏まなくてはいけないのかと思いました。

続いて、シンプルに小数点以下の値を切り捨てて整数にする方法です。つまりデータの型を小数点型から整数型にすればいいということです。まず行うべきことは、それぞれの列ごとのデータ型を確かめなくてはならないようです。

今、扱われているデータ型は浮動小数点数といわれる小数点を扱うデータ型のようなのでこれを整数型(int)に変えてみたいと思います。さきほどの四捨五入の際には、object型からint 型に変換しましたが、同じことを行えばいいだけです。

ちょっと横道にそれましたが、データ処理・加工方法について調べて試してみました。

データの取得の仕方の続き

さあ話を戻しましょう。可視化するのに必要なデータは取得できました。その使用するデータに対して欠損値や異常値があってはいけないので、それも確認してみようと思います。欠損値を確認する方法は Pandasのisnull()関数を使えばできるようです。

上はそれぞれの列が欠損値を含むかどうかの確認、下はそれぞれの列にいくつ欠損値を含むかの確認するコードの実行結果です。どうやら今回は1つも欠損値がないようなので、欠損値の処理は必要ないようです。おそらく今回は Web サイトからすでに綺麗に処理されたデータを持ってきているので、欠損値処理のデータを処理する必要がないのですが、分析する際には、欠損値だらけのデータを扱うほうが多いと思います(私は実際に業務で欠損値のデータを処理した経験があって、本当にその処理が大変だったことを今でも覚えています…)。機会があれば今度ブログで欠損値を処理する方法等についても紹介をしようかなと思います。

異常値に関してはグラフに可視化してから確認をしたいと思います。

そういえば「Date」の列の型は?

さきほど、dtypesのコードでそれぞれの列のデータ型を確認したところですが、そういえば一番左の列の「Date」の型が出ていませんでした。「あれ?列として認識されていないのか?」と思ったので調べてみることにしました。調べてみた結果、そもそも Pandas のDataFrame型は以下の図のように列と行からできており、「Date」の部分は列ではなく、行の名前にあたる「インデックス」と呼ばれる部分になります。それぞれの行の番号にあたる部分のようですが、今回のデータの場合には日付がこのインデックスになっているようです。

このインデックスにもタイプがあるようなので、そのタイプを調べてみます。

出力の先頭に「DatetimeIndex」と表示されています。これは時系列データ処理や、日時データをインデックスとして使用する際に適したインデックスです。よって、このインデックスのデータを日時のデータとしてそのまま使いたいと思います。

可視化をしてみよう!

ということで必要なデータが揃いました。日時にはインデックス(Date)を用いて、株価には終値(Close) を用いて可視化を行いましょう。まずは変数を扱いやすいように定義します。

続いてデータを可視化するために、matplotlibという Python のライブラリをインポートして扱えるようにします。

さあ!グラフ化をしてみましょう!方法は簡単で以下のようにコードをx軸とy軸の値を指定するだけで簡単に作成できます。

ようやく可視化することができました!!データを可視化するまでの道のりを超えてようやく株価の変動のグラフを作成することができました。このグラフを見る限り異常値と見受けられる値(株価)はないので、今回の分析においては、異常値の処理は行わないということにします。グラフとして不足している部分や自分なりに編集したい部分があるので少し編集してみようと思います。まず、期間を2022年9月1日から2024年の8月31日までにしたいと思います。新しく変数も df0 と定義します。

ちゃんとデータを取得できているか確認したいと思います。head()関数と tail()関数を使用すると定義してあるデータフレームの先頭と後方のデータの詳細を見ることができます。特に()の中で数を指定してあげると、その分の行数のデータを見ることができます。

それでは matplotlib ライブラリを使用して再びデータを可視化してみましょう。

これでx軸やy軸のラベル等やタイトルを追加できました。この過去の株価のデータを可視化したところからもう一歩踏み込んでみて、分析を行ってみましょう。

単純移動平均線を使って株価を分析してみた

自分は株に対してあまり知識がないので詳しい分析まではできないです。ただ、株は買った時の株価と売った時の株価の差で損益が決まることは私でも知っています。ということは、もし株を買う時のタイミングと売る時のタイミングがある程度わかることができればいいのではないかと思いました(おそらくそんなに単純ではないと思うのですが…)。「株を買っている企業のネガティブなニュースが流れたら株価は下落する可能性が高いから売ったほうがいい。」、「その企業の業績が良い・将来性があったら株を買って、業績が悪かったら株を売ったほうがいい。」などのことが挙げられますが、私が行いたいのは「過去の株価のデータを駆使して株の売買のタイミングを判断できないか?」というあくまでもデータ目線で注目してみることです。株価の分析にはテクニカル指標というものがあり、その指標はさまざまなものがあるようです。その中でもテクニカル指標で一般的な「単純移動平均線」という指標を用いて分析を行ってみようと思います。

単純移動平均線(Simple Moving Average)とは、ある一定の期間の株価の平均を線でつなぎ合わせたもののことを言います。例えば、今回分析対象にしているソフトバンク株式会社の株価を例にしてみましょう。

日付終値単純移動平均(5日間)

2024-08-19

1940.0

1907.1

2024-08-20

1967.0

1922.9

2024-08-21

1972.5

1940.3

2024-08-22

1995.5

1960.4

2024-08-23

2005.0

1976.0

2024-08-26

2002.5

1988.5

2024-08-27

2017.5

1998.6

2024-08-28

2038.0

2011.7

2024-08-29

2042.5

2021.1

2024-08-30

2038.0

2027.7

以上の表のように、例えば単純移動平均の期間の設定を5日間にすると、「2024-08-30」の単純移動平均の値は、2024-08-26~2024-08-30までの株価の終値の平均値となります。これらの値をそれぞれの日にちで算出して線で結ぶと単純移動平均線となります。

細かい説明は後にして、実際にこの線を先ほどの株価のグラフに追加してみようと思います。まずは以下のコードを入力して、単純移動平均線の値をデータに追加します。期間は10日間と75日間を設定します。なお、1つ1つ平均値を計算で出していくのは途方もなく時間がかかるので、pandas の rolling 関数を用いると、DataFrame に対してデータ区間を移動させながら関数を扱うことができるので今回はそちらを使用したいと思います。そしてその関数で定義した値を DataFrame に新しく追加していきます。

このsma10 と sma75 を加えた株価のグラフを作成してみようと思います。

単純移動平均線が上を向いているときは株価は上昇トレンド、単純移動平均線が下を向いているときは株価は下降トレンドということが図から分かります。つまり単純平均移動線は株価の傾向を知るための指標の1つです。また図から単純平均移動線の設定期間が短ければ、株価の傾向をいち早く捉えることが可能ですが、長期的な株のトレンドを見ることには向いていませんので、その場合は長期の期間の設定を行います。実際にはこの移動平均線は短期、中期や長期の複数のグラフを用意して株の売買の分析に用いるようです。それでは実際にやってみるために、上のグラフで移動平均線の期間で設定した10日間と75日間を1つのグラフに反映してみようと思います。

※ちなみに移動平均線の期間の値は決められていないようですが、短期:5,10,20日間など、中期:50,75日間など、長期:75,100,200日間とよく使われる指標があるようです。

設定期間が異なる2本の単純移動平均線を追加してみました。この2本の移動平均線を追加することで私が知りたかった株の売買のタイミングを暗示してくれるものがあるようです。それはゴールデンクロスとデッドクロスと呼ばれるものです。ゴールデンクロスは短期の移動平均線が長期の移動平均線を下から上に交差するタイミングのことを指し、株を買うシグナルと言われています。またデッドクロスはその逆で長期の移動平均線が短期の移動平均線を下から上に交差するタイミングのことを指し、株を売るシグナルと言われています。たしかに上記の図の2023年7月ごろにゴールデンクロスが起こっており、株価はそこから一定期間上昇していることがグラフから分かります。2024年4月ごろにデッドクロスが起こっており、株価は下落していることがグラフから分かります。このゴールデンクロス時に株を買い、デッドクロス時に株を売れば図を見る限りおよそ1株で400円ほど儲けが出ていたことになります。

ただ、2024年7月手前のようなゴールデンクロスが発生していても、その後の株価の傾向が上昇していかないことがあったりするので、絶対的な売買のタイミングではないということは頭に入れておかなければいけないようです。自分でも検証を行ってみましたが、当然、単純移動平均の設定期間を変更すれば株価の売買タイミングのサインの1つであるゴールデンクロスとデッドクロスの交差する位置は変わってきます。

そのためこの移動平均線の期間を変えてみてどの設定が儲かるかを最適化してみたり、別のテクニカル指標を使って株価の分析をしている方が多いようです。

まとめ

今回は Python を用いてデータ分析を行うという目的として株価を分析してみました。実は新卒時代に先輩方からデータ分析の手法を教わって、それを忘れたくなかったので株価を分析してみたことも理由の1つです。今回は Python の実行環境、データの取得方法、取得したデータの理解やデータの処理方法、欠損値の確認、データを可視化してみて思いついたこと(株価の売買タイミングはいつか?)を調査してみることまで行ってみました。本来はデータ分析は可視化するまでのデータの処理や準備などに時間をほとんど割かれてしまうのですが、今回は元のデータがすでに整っていたために処理などの工程をあまり詳しく行うことができませんでした。次にデータ分析を行う際には元のデータに欠損値や異常値などが含まれているデータを分析してみて、機会があればこのブログでも紹介しようと思います。また、株価分析の他のテクニカル指標を分析した結果や今回分析したテクニカル指標の1つである移動平均線のさらなる検証についても余力があればブログで紹介しようと思います。

おすすめの記事

条件に該当するページがございません