Python

【コード解説】Pythonで株価データを取得する!【3つの方法を解説】

2020年12月5日

こんにちは。TATです。

 

今日のテーマは株価です!

僕が運営するもう一つのサイト「投資でニート生活」では、投資に必要な様々な情報を集めています。

ここでは株価データはもちろんですが、そのほかにも決算短信や業績予想などのXBRLデータから、株式分割や自社株買いなどのPDFファイルまで収集し、それらのデータを解析して自動ニュースとして記事を自動作成しています。

これらすべての行程はPythonで完全自動化されています。

 

そしてこの「投資でニート生活」を運営するにあたって、「株の情報収集や分析のやり方を教えてください」といった内容の問い合わせの件数が増えてきました。

ありがたい限りですね。ということで、こちらの「気ままなブログ」で解説していきます。

 

今回がその記念すべき第1回目で、テーマは「Pythonで株価データを取得する」です。

ここでは、Pythonで株価データを取得する方法についてコード付きで解説していこうと思います。

やり方も複数あるのでここでは代表的な3つの方法をご紹介します。

難易度の低い方法から順番に紹介していきますね。

 

また、Pythonで株価データを扱う記事については記事が散在しているのでこちらにまとめました!

テクニカル分析の計算方法や可視化についてはこちらからどうぞ。

関連記事
【まとめ】Pythonで株価データを扱う
【まとめ】Pythonで株価データを扱う

続きを見る

目次

 

【コード解説】Pythonで株価データを取得する!【3つの方法を解説】

方法①:ダウンロードしたCSVファイルを扱う

1つ目は、ダウンロードしたCSVファイルを扱う方法です。

これが一番シンプルで最も簡単に実行できます。

ただし少しデータ整形は必要になります。

そこも含めて解説します。

 

世の中には無料で株価データをCSV形式でダウンロードできるサイトがあります。

いい世の中です。

ここでは無料で株価データがダウンロードできるサイトとして、Investing.comを例にご紹介します。

 

無料登録が必要です。

株価データを取得するには無料の会員登録が必要になります。

必要なのはこれだけです。

お金もかからないので余裕ですね。

 

日足、週足、月足データがダウンロード可能

会員登録を済ませてログインしたら、日足、週足、月足のデータがダウンロードできるようになります。

検索ボックスから任意の銘柄を探してダウンロードページにいきます。

こんな感じです。こちらはトヨタ(7203)です。

https://jp.investing.com/equities/toyota-motor-corporation-historical-data

 

時間枠と任意の期間を設定して「データをダウンロードする」を押すと、CSV形式で株価データをダウンロードすることができます。

これをPythonで読み込めば、株価データを扱うことができるようになります。

一番手っ取り早いやり方です。

 

PythonでCSVファイルを読み込む

それではダウンロードしたCSVファイルをPythonで読み込んでみます

コードはとってもシンプルでこんな感じです。

 

pandasはデータ分析用のライブラリです。

通常はpdと略して定義して使います。

pandasにはread_csv(ファイル名)という名前の通りの関数があるので、これを使ってCSVファイルを読み込みます。

これでCSVファイルを読み込むことができます。簡単ですね。

head()で冒頭の5行だけを表示しています。

 

日付と数値データを変換する

ただし、読み込んだデータをみてみると問題点があります。

なんとこちらすべて文字列なんですね(笑)

ゆえに、データ分析に使うためにはこの型を数値とか日付に変換してあげる必要があります

やるべきことは以下の通りです。

  • 「日付け」データはdatetimeフォーマットに変換する
  • その他のカラムをfloatに変換する

 

ちなみに株価データはintでもいいのかなとも思いますが、指数データ(日経平均とかマザーズとか)を扱う際にはfloatで扱うことになるので、ここは統一してfloatにしておいたほうが後々使いまわしていく時に楽になりますw

こういったことも想定しながらプログラミングは設計するべきですね。

 

では、データを整形するコードの一例をご紹介します。

この他にもやり方はたくさんあるので、自由にパクりつつ適宜改善していっていただければと思います!

 

サクッと解説しておくと、まず、datetimeというライブラリーを利用して日付けデータをdatetimeに変換します。

lambda関数を使うことでコードがスッキリします。

 

次にその他のカラムをfloatに変換します。

ここには、共通で利用できるnumber_converterという関数を定義します。

やることは単純で、文字列から不要な文字を除去してfloatに変換するだけです。

これを日付け以外の各カラムに適用すればデータ変換は完了です。

シンプルですね。

 

データがきれいに変換されていることが確認できます。

 

日付けでソートする

最後にこのデータを日付けでソートします。

これは、時系列データを扱う際に便利なためで、古いものから順に表示されるようにします。

これをやっておくと後に行うデータ分析が楽になります。

コードとしては1行で完了します。

日付けでソートして、データを置き換えます。

 

これでデータのソートが完了です。

 

以上でデータ整形はすべて終了です。

データ分析の準備万端です。

 

いちいちダウンロードするのがだるいw

ここで紹介したCSVファイルを扱う方法は、最も簡単な方法ではありますが、一つ一つファイルをダウンロードする必要があります

一回限りの作業なら問題ありませんが、毎日やるとなるとなかなか辛いものがあります。

さらにたくさんの銘柄の株価データを集めたい場合にも、それぞれの株価データをダウンロードする必要があるので手間がかかります。

単純にだるいですよね。

よって、この方法は一回限りのプロジェクトやプログラミング作業量を極限に削りたい場合のやり方になります。

毎日の作業やたくさんの銘柄を扱いたい場合には、この後紹介する方法②か方法③を活用した方が良いです。

 

方法②:ライブラリーを利用する

2つ目の方法はライブラリーを活用する方法です。

Pythonには、株価を扱えるライブラリーが存在しており、そちらを利用することで株価データを簡単に取得することができます。

Pythonまじで神です。

データ整形が必要ないことを考えたらこっちの方が楽かもですw

 

pandas_datareader

ライブラリーはpandas_datareaderを使います。

これは、経済データや金融商品(株とか指数とか)の価格データを取得することができるライブラリーです。

こんなに素晴らしいライブラリーがPythonにはあるんですね。

 

早速使ってみます。

pandas_datareaderの中にあるdataを使います。

 

ダウ平均を取得する

こちらのコードでは、yahooからダウ平均のデータを取得しています。

なんの設定もせずに実行すると過去10年分のデータが取れます。

このデータの場合は、すでに古いものから順番に並んでいますので、整形の必要はありません。

このまま使えます。

 

もちろん日付の指定もできます。

 

これで2020年11月1日から14日までの2週間分のデータを取得することができます。

 

個別株(例:アップル)を取得する

個別株の株価データも取得できます。

例としてアップルの株価を取得してみます。

アップルのティッカーシンボルはAAPLなので、これを指定すればOKです。

 

こんな感じで取得できています。

最新データを表示するために、headではなくてtailを使っています。

これはラスト5行を表示します。

日付の指定は先ほどの同様です。

 

日本株も取得できます!!!

そして朗報です。

なんと日本株の株価データも取得できちゃいます。

ただし、データの取得先がyahooでは取得することができません。

日本株のデータを取得する場合にはデータの取得先をstooqとします。

ちなみにstooqはポーランドのサイトっぽいです。詳しいことはよくわかりませんw

 

例としてトヨタの株価データを取得してみます。

 

トヨタの証券コードは7203です。

これに.JPをつけると日本株を指定することができます。

ちゃんと取得できていることが確認できます。

ちなみにstooqの場合は日付の指定うまく動かず、存在するデータが根こそぎ取られる感じでしたw

一部は日付の指定はうまくいかずとも、ライブラリーを活用すると指数から個別株まで、あらゆるデータを取得することができます。

 

デメリットは当日データがないこと

ただし、デメリットが一つだけあります。

それが当日のデータが存在しないことです。

上記のデータは2020年12月4日に取得したものです。

証拠のために日付を表示しておきます。

市場がすでに閉まっているにも関わらず、取得できるデータは前日の2020年12月3日までのものになります。

よって、バックテストや分析のために利用するにはいいかもしれませんが、当日のデータを必要とする場合にはなかなか厳しくなります。

この場合は、次に紹介するスクレイピングという手段を使うことになります。

 

参考

【2021年3月28日追記】

yahoo_finance_api2というライブラリーを使えば、当日データを含めて株価データを取得できます。

日本株のデータにもバッチリ対応しているのでおすすめです。

おすすめ
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する

続きを見る

 

yahooから日本株データも取得可能!【2021/07/20追記】

pandas_datareaderを使うと日本株のデータをyahooから取得することも可能です。

この場合、当日データも取得できます。

使い方はこれまでと同じです。

日本株を指定する際には、{証券コード}.Tの形で指定します。stooqから取得する際にと指定方法が変わるのでご注意ください。

トヨタなら7203.Tといった具合です。

 

期間の指定も可能です。startとendをいう引数を利用すればOKです。

指定せずとも、証券コード、情報ソース元、開始日、終了日の順番に指定すればOKです。

 

使い勝手抜群ですね。基本的に、特にこだわりがない場合はyahooを指定するのが便利そうです。

ただし、ざっと見たところ日足データしか取得できないようです。(指定方法わかる方いたら教えてください)

また、利用制限とかもあるかもしれないので、使いすぎには要注意です。

 

複数の証券コードを指定することも可能!【2021/07/20追記】

さらに複数の証券コードを指定することも可能です。

この場合はリスト形式で指定します。

例として、トヨタと日産のデータをまとめて取得してみます。

こんな感じでそれぞれのデータがきちんと取得できていることがわかります。

 

方法③:【悪用厳禁】スクレイピングして株価を取得する

3つ目が、スクレイピングして株価を取得する方法です。

これが最後の手段になりますが、一番だるいですw

 

スクレイピングを禁止しているサイトに注意!

そして、スクレイピングを禁止しているサイトもあるので、使うには注意が必要です。

Yahooファイナンスは一発アウトですw

こちらのページに明確にスクレイピングは禁止と書かれています。

Yahoo!ファイナンス掲載情報の自動取得(スクレイピング)は禁止しています

 

株探は明記はされていないけど、調子乗ったらダメ

また僕が大好きな株探もスクレイピングはグレーです。

株探の規約では、「スクレイピングは禁止」との明確な表記はありませんが、サーバーへの負担をかけるような行為はアウトと書かれています。

→ 株探利用規約

 

スクレイピングは調子に乗るとサーバー側に負担をかけてしまうので、非常に怪しいところです。

スクレイピングしないほうが無難ですね。

 

ちなみにこちらの記事を公開した時は株探をスクレイピングするコードを公開していましたが、ちょっと想像以上にアクセスが集中したので、株探のサーバーへ配慮して公開を伏せました。

ご指摘いただいたTwitterのフォロワーさんに深く感謝いたします。

僕、株探大好きなので嫌われたくない・・・m(_ _)m

 

ミンカブも同様

ミンカブも同様です。

ミンカブと株探は運営会社が同じなので、規約もほぼ一緒です。

株探がダメならミンカブもダメです。

やらないほうが無難です。

基本的にはファイナンス系のサイトはスクレイピングしないほうがよいです(涙)。

 

株探は株式分割・併合が組み込まれている

(どうでもいいですが、)ちなみに僕が株探が好きな理由を上げておくと、サイト構造がシンプルなことに加えて、株式分割や併合を組み込んだ株価データがあることです。

例として、最近株式分割が行われた神戸物産を見てみます。

Yahooファイナンスの場合はここが組み込まれていないので、こんな感じになります。

https://info.finance.yahoo.co.jp/history/?code=3038.T&sy=2020&sm=9&sd=5&ey=2020&em=12&ed=4&tm=d&p=2

 

株式分割前は5,000円台だった株価が、2020年10月29日に株式分割が行われて2,000円台になっています。

この表をそのままスクレイピングしたらデータの整形がめんどくなるわけです。

そもそもYahooファイナンスはスクレイピング禁止なので関係ありませんがw

 

株探の場合はここが組み込まれているので見やすいです。

https://kabutan.jp/stock/kabuka?code=3038

 

これを見ると、株式分割が行われる2020年10月29日以前の株価も2,000円台であることがわかります。

これならデータの扱いとしても楽ですよね。

これをガバッとコピペしてエクセルとかに貼り付けるならアリですね。

 

「株式投資メモ」:スクレイピングできるサイトはここです。

じゃあどのサイトならスクレイピングしていいんだよ!と思われるかもしれません。

安心してください。

株式投資メモ」というサイトはスクレイピングを禁止していません。

 

URL構造の理解

次に「株式投資メモ」のURL構造を見ていきます。

例としてトヨタの株価データを見ると、URLはこんな感じです。

https://kabuoji3.com/stock/7203/

 

トヨタの証券コードは7203なので、ここを任意の証券コードを切り替えればデータは取れそうですね。

ページの切り替えなども行いたい場合はさらにURL構造の解析が必要になりますが、ここでは割愛します。

 

コードの一例を公開

とりあえず、簡単にコードを書いてみたのでご紹介します。(美しさは求めてないですwww)

ご参考になると嬉しいです。

 

コメントをたくさんつけたので、順番に追っていくと理解しやすいかと思います。

適当に書いたので、関数もなしにベタ書きですがw

 

headersを入れないとエラーになります

ここでrequestsで使用しているheadersについて解説しておきます。

株式投資メモ」の場合は、これがないとこんな感じでエラーになります。

 

403エラーなのでアクセス拒否ですねw

この場合は、リクエストを送る際にheader情報としてUser-Agent情報を付与してあげると解決できます

header情報は、サーバーがリクエストを受けた時に利用されており、「どんな奴がリクエストを送ってきたのかな〜」とチェックするために使います。(その他の使い方もあります)

そして条件に合致しない場合にはリクエストを拒否するみたいな処理ができるんですね。

 

今回はそれにぶちあたったので、ここを突破します。

そのためにはUser-Agent情報を付与します。

これは自分が利用しているブラウザ情報です。

Chromeをお使いなら、右クリックして「検証」をクリックし、Networkタブから確認することができます。

僕の場合だとこんな感じですね。

ここの「Mozilla~~~」の部分をガバッとコピーしてコードの「"ご自身で設定してください"」と置き換えてください。

これでブラウザ情報を送ることができ、きちんとデータを取得することができるようになります。

 

最強は方法②あるいは方法②と方法③の合わせ技

一番楽なのは、方法②でご紹介したpandas_datareaderでyahooからデータを取得することです。

期間の指定もできて大変便利です。

ただし、これには利用制限があるかもしれないので、調子に乗ってデータを取りまくってるとアクセスが禁止される可能性も無きにしも非ずです。

よって、バックアッププランとして、方法②と方法③を組み合わせる方法をご紹介します。

 

スクレイピングには極力配慮しましょう!

ただ、「株式投資メモ」がスクレイピングを禁止していないと言っても、それでもサイトに負担をかけるのは忍びないので、ここは配慮しておいたほうが親切です。

スクレイピングを行う際にはサーバーに配慮をきかせて優しさを前面に押し出していくべきですw

 

配慮したやり方として、ここでは過去データはライブラリーを利用して取得して、最新のデータだけを「株式投資メモ」からスクレイピングで取得するというやり方ご紹介します。

方法②と方法③の合わせ技になります。

スクレイピングする際には、対象サイトに極限まで配慮しながらやっていきます。

 

「株式投資メモ」のデータは株式分割が考慮されていない

もう一つ理由を挙げておくと、「株式投資メモ」の株価データは株式分割などの株価調整がなされていないのに対して、方法②で紹介したやり方ではここが調整されています。

よって、最新データを「株式投資メモ」からいただき、過去データはライブラリーから取得することでデータ整形が楽になります。

 

(やる人いないと思いますが、)「株式投資メモ」からデータを根こそぎとる場合には、株式分割などの調整を自分で行う必要があります

これは過去の株式分割・併合のデータを集めて適用させる必要があります。

相当大変なので、ここで紹介するライブラリーとスクレイピングの合わせ技がベストだと思います。

 

コード紹介

それではコードの一例をご紹介します。

ザザーっと書いたので汚いかもですが、参考にしていただけたらと思います。

スクレイピングが禁止されていないと言っても、利用する際にはモラルの範疇で行うようにしてください。

とんでもない回数のリクエストを送ると、サーバーへ大きな負担をかけることになります。

複数銘柄取得する際には数秒の間隔をあけるとか、配慮しながらやってくださいますようお願いします!

 

それではコードをどうぞ。

 

一気にコードを出してしまったので、なるべく多くコメントをつけました。

コメントを確認しながら順番に見ていただけるとわかりやすいのではないかなと思います。

 

これで任意の証券コードを指定すれば、株価データを取得することができます。

スクレイピングしたデータについては型変換などのデータ整形がきちんとされて、ライブラリーから取得したデータときちんと結合されていることがわかります。

このやり方なら、株式分割などを気にする事なく取得することができ、ライブラリーの弱点である最新のデータも合わせて取得することができるようになります。

こちらのコードはご自由にお使いいただきつつ、適宜改善していっちゃってください。

ただしスクレイピングのやりすぎにはご注意を。

繰り返しになりますが、複数銘柄を連続で取得する場合には、間隔を空けるなどの配慮をお願いします。

 

日付の指定はデータ取得後に!

ちなみにですが、日付を指定したい場合はデータ取得後にできます

取得時には引数に日付を指定してもうまく機能しないので、とりあえず全部とって、後から整形する感じになります。

例としてはこんな感じです。

先ほどのトヨタ自動車で2020年のデータを抽出します。

こんな感じでフィルタリングすれば、任意のデータを抽出することができます。

 

遅延はあります・・・

ただ、この合わせ技については弱点なしを書きましたが、実際にはデータの反映には遅延があります。

方法②よりかは遅延は小さくなりますが、それでも遅延は発生します。

この問題を解決するライブラリーとしてyahoo_finance_api2というものがあるので、ぜひこちら↓の記事をご参照ください。

 

参考

【2021年3月28日追記】

yahoo_finance_api2というライブラリーを使えば、当日データを含めて株価データを取得できます。

日本株のデータにもバッチリ対応しているのでおすすめです。

おすすめ
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する

続きを見る

 

(おまけ)方法④:APIを利用する

最後におまけとして4つ目の方法を紹介しておきます。

それがAPIです。

日本の証券会社では、この記事を書いている2020年12月4日時点ではauカブコム証券株式会社が提供しています。

これを使うとAPI経由で株価データを取得できるので、簡単に株価データを取得できるようになります。

感覚的には方法②のライブラリーに近いようなイメージです。

さらにAPIを経由して株の売買注文などもできるので、完全な自動売買ができるようになります。

僕はauカブコム証券株式会社のアカウントを持っていないので利用することができませんが、選択肢としてはアリだと思うので紹介しておきます。

 

スクレイピングやデータ分析にはPythonが最適です!

ここまで、「Pythonで株価データを取得する」というテーマで色々な取得方法を解説してきましたが、ここで紹介したコードは全てPythonを使っています。

 

Pythonはデータ分析やスクレイピングなどを得意とするプログラミング言語で、比較的学びやすい点からも人気が集まっています。

さらにAI関連のライブラリーが豊富なので、昨今のAIブームで需要が爆発していることも人気の理由の一つです。

おすすめ
【いますぐ始められます】データ分析をするならPythonが最適です。【学習方法もご紹介します!】
おすすめ
【人気上昇中】今人気のプログラミング言語「Python」は何ができるのか?できることまとめます【転職でも有利です】

 

Pythonは、僕自身も独学で習得できたくらい学びやすい言語なので、スキルを身に付けたい方などにもオススメです。

僕の場合は社会人になってから独学でPythonを習得して転職にも成功しました。Pythonをきっかけに人生が大きく変わりました。

おすすめ
【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。

続きを見る

 

僕自身の独学の経験をベースに、Python独学ロードマップをまとめたので、もしご興味があればご覧ください。

おすすめ
【決定版】Python独学ロードマップ【完全初心者からでもOKです】
【決定版】Python独学ロードマップ【完全初心者からでもOKです】

続きを見る

 

僕自身はUdemyでPythonを独学しました。

おすすめ
プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
おすすめ
【目的別】Pythonが学べるUdemyのおすすめコースを紹介します【随時更新】

 

まとめ

いかがでしたでしょうか。

今回は、「Pythonで株価データを取得する」というテーマで、株価データを取得する3つの方法についてコード付きで解説しました。

Pythonはシンプルなコードで複雑な処理ができるので、武器にできるとかなり重宝します。

転職でも有利になりますし、わりと短期間で習得できるのでオススメです。

こちらで紹介したコードも自由にパクりつつ、参考にしてもらえたら嬉しいです。

 

今回はかなり長い記事になってしまいましたが、ここまで読んでくださってありがとうございました。

 

また、Pythonで株価データを扱う記事については記事が散在しているのでこちらにまとめました!

テクニカル分析の計算方法や可視化についてはこちらからどうぞ。

関連記事
【まとめ】Pythonで株価データを扱う
【まとめ】Pythonで株価データを扱う

続きを見る

 

参考

【2021年3月28日追記】

本記事で紹介した方法だと、最新のデータの反映に時間がかかります。

yahoo_finance_api2というライブラリーを使えば、当日データを含めて株価データを取得できます。

日本株のデータにもバッチリ対応しているのでおすすめです。

おすすめ
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する

続きを見る

 

おすすめ
【決定版】Python独学ロードマップ【完全初心者からでもOKです】
【決定版】Python独学ロードマップ【完全初心者からでもOKです】

続きを見る

おすすめ
プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
おすすめ
【目的別】Pythonが学べるUdemyのおすすめコースを紹介します【随時更新】

データ販売を始めました


オニールとミネルヴィニの投資手法を日本株に適用するために必要なデータの販売を始めました。

あらゆるデータを集約して、誰でも簡単にスクリーニングできるようにCSV形式でデータを提供します。

オニールとミネルヴィニの投資手法を日本株に適用するために必要なデータを販売します!

続きを見る




Pythonの独学ならUdemyがオススメ!


Udemyなら、セール中だと90%オフとかで買えるのでコスパ最強です。

僕はUdemyでPython独学に成功しました。

関連
【目的別】Pythonが学べるUdemyのおすすめコースを紹介します【随時更新】

続きを見る



関連
プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】

続きを見る



Udemyを詳しく見る!



プログラミングスクールもオススメ!



プログラミングスクールもオススメの選択肢です。

初心者をしっかりサポートしてくれるシステムが整っているので、挫折する可能性が一気に下がります。

効率よく最速で学ぶならプログラミングスクールが最適です。

関連
【まとめ】Pythonが学べるおすすめプログラミングスクール

続きを見る



関連
プログラミング学習は独学とプログラミングスクールどちらにすべきか?【結論、全部試すべし!】

続きを見る



関連
高額なプログラミングスクールを利用する価値はあるのか?【結論、人それぞれですw】

続きを見る




TechAcademy (テックアカデミー)


オンラインに特化したプログラミングスクールで、プログラミングの他に動画編集などの豊富なコースが用意されています。







TechAcademyを詳しく見る!



TECH::CAMP (テックキャンプ)


いつでも講師に質問できるチャットシステムが最強です!







TECH::CAMPを詳しく見る!



 

CodeCamp (コードキャンプ)


講師とのマンツーマンレッスンで挫折しない!







CodeCampを詳しく見る!


-Python
-, , ,

© 2021 気ままなブログ