Google Colab&ChatGPTで株価を取得する方法
本日のデジタルファーストキャンプで、株価一覧を取り出したい、というお題に取り組んでいる人がいました。
自分の仕事に活かそうとしているのが凄いと、課題が終わって一安心している私との違いに反省しました。
そこで、株価を取り出す方法をカチカチして研究してみました。
試行錯誤の結果、株価を特定して取得する方法まではクリア出来ました!
ヤッター!
参考にしたサイトはコチラ。
以下では、私がどの様な過程でエラーを克服していったのか、ChatGPTとのやり取りの記録を公開します。
丁寧に見ていくと、やり取りの過程で、少しずつ問題がクリアされていく過程がわかります。
https://qiita.com/passive-radio/items/cf3740f9601675b0a8dd
前提条件:事前準備としてのanacondaは導入せず、Google Colab上でプログラムカキカキ。
1.株価取得方法について
株価取得には、元データの種類、対象期間、銘柄コードを指定することで取得可能です。
日本の株価を取得できるサイトは2種あるとのことです。
1)Stooq
ポーランドのサイト
2)Yahoo
どちらのサイトも、ホームページから無料でCSVのダウンロードができるので、プログラムが欠けなくてもホームページからダウンロードすればデータの取得は可能。
以下の項目が取得可能。
Date 日付
Open 始値
High 高値
Low 安値
Close 終値
Volume 出来高
Adj Close 調整後終値 (Yahoo Financeのみ)
2.実験結果
コードの詳細は、上記HPをご参照ください。
Stooq→うまく行かず
Yahoo→エラーが出る
3.ChatGPT先生にご相談
pandas_datareaderは、Pythonのデータ分析ライブラリpandasと連携して、さまざまなオンラインソースから金融データを直接取得するためのライブラリです。このライブラリを使用すると、Web APIから株価、経済データ、その他の金融データを簡単に取得できます。取得したデータはpandasのDataFrameオブジェクトとして返されるため、分析や可視化が容易になります。
インストール
pandas_datareaderは通常のPythonパッケージと同様にpipでインストールできます。
bashCopy code
pip install pandas_datareader
基本的な使い方
以下は、Yahoo FinanceからApple Inc.の株価データを取得する簡単な例です。
pythonCopy code
import pandas_datareader as pdr import datetime # 日付の設定 start = datetime.datetime(2020, 1, 1) end = datetime.datetime(2021, 1, 1) # Yahoo FinanceからApple Inc.の株価データを取得 df = pdr.get_data_yahoo('AAPL', start, end) # 最初の5行を表示 print(df.head())
pandas_datareaderは、他にも多くのデータソース(Google Finance、World Bank、OECD、など)に対応しています。各データソースで許されているクエリや取得できるデータは異なる場合がありますので、公式ドキュメントを参照することをお勧めします。
注意点
pandas_datareaderはWeb上のデータを取得するため、そのデータソースが変更されると、コードの修正が必要な場合があります。
各データソースの利用規約や制限(レートリミットなど)に注意してください。
以上が基本的な使い方ですが、具体的な用途や取得したいデータに応じてオプションが変わる場合もありますので、公式ドキュメントを参照することをお勧めします。
4.1回目エラー
以下では、コードをGoogle Colabにコピペして、エラーをChatGPTに分析してもらった結果を順に追っていきましょう。
まずは、1回目のエラーを貼った回答から。
エラーメッセージによれば、TypeError: string indices must be integersという問題が発生しています。このエラーは、通常、文字列に対して整数以外のインデックス(例えば、文字列やリストなど)を使用しようとした場合に発生します。しかし、このコードではそのような操作は明示的に行われていないようです。
この問題は、内部的にpandas_datareaderのyahooモジュールがYahoo Financeからデータを取得しようとしたときに発生している可能性が高いです。原因としてはいくつかの可能性が考えられます:
データの形式が変更された: Yahoo FinanceのAPIが返すデータの形式が変更され、pandas_datareaderがそれに対応していない可能性があります。
APIの使用制限: Yahoo FinanceのAPIには使用制限がある場合があり、その制限を超えたために正常なデータが返されていない可能性があります。
パッケージのバージョン: 使用しているpandas_datareaderのバージョンが古く、最新のAPIに対応していない可能性があります。
解決策
パッケージの更新: pandas_datareaderが最新版であるか確認し、必要であれば更新してください。
エラーのデバッグ: トレースバックを詳しく調査し、どの部分でエラーが発生しているのか確認します。エラーメッセージによれば、問題はyahoo/daily.pyの_read_one_dataメソッド内で発生しています。この情報を元に問題を特定できるかもしれません。
代替のデータソース: Yahoo Finance以外のデータソースを使用することを考慮してみてください。pandas_datareaderは複数のデータソースに対応しています。
エラーハンドリング: 一時的な問題である可能性も考慮し、エラーハンドリングを追加することで、失敗した場合にリトライする等の対応を取ることができます。
公式ドキュメントやコミュニティ: この種の問題は他のユーザーも経験している可能性が高いので、pandas_datareaderのGitHubリポジトリや関連するフォーラム、Stack Overflowで情報を探してみてください。
Action→ 1.パッケージの更新のみ実行
5.2回めエラー
このエラーメッセージは、`pandas_datareader`の内部で何らかの問題が発生していることを示しています。具体的には、Yahoo Financeから取得したJSONデータをパースする段階で、文字列に対して整数以外のインデックスを使用しようとしているようです。
以下は、この問題を解決するためのいくつかの提案です。
バージョンの確認と更新
`pandas_datareader`や依存するパッケージが古い場合、新しいAPIの仕様に対応していない可能性があります。まずはパッケージを最新バージョンに更新してみてください。
!pip install --upgrade pandas_datareader
代替のメソッドやデータソースの使用
Yahoo Finance以外のデータソースを使用する、または`pandas_datareader`以外の方法でデータを取得することを考慮してみてください。例えば、`yfinance`というライブラリもYahoo Financeのデータを取得することができます。
!pip install yfinance
import yfinance as yf
data = yf.download("AAPL", start="2020-01-01", end="2021-01-01")
エラーハンドリング
一時的な問題である可能性も考慮し、エラーハンドリングを追加してリトライするなどの対応を取ることができます。
import time
for _ in range(3): # 3回リトライ
try:
df = web.DataReader(ticker_symbol_dr, data_source='yahoo', start=start, end=end)
break # 成功したらループを抜ける
except Exception as e:
print(f"An error occurred: {e}")
time.sleep(5) # 5秒待つ
コミュニティでの情報収集
この種の問題は他のユーザーも経験している可能性があります。`pandas_datareader`のGitHubリポジトリやStack Overflowなどで、同様の問題に対する解決策がないか探してみてください。
以上のいずれかの方法で問題が解決しない場合、更に詳しい情報が必要となる可能性があります。その場合は、使用しているコードの一部や、設定している`ticker_symbol_dr`、`start`、`end`の値など、問題の再現に必要な情報を提供していただけると助かります。
Action→問題が「`pandas_datareader`の内部で何らかの問題が発生していることを示しています。」と特定されてきた。バージョン更新を実行。
6.3回目エラー
元のコードを見ると、`pandas_datareader`を使ってYahoo Financeから特定の銘柄(この場合は、7177.T、すなわちGMO-AP)の株価データを取得しようとしているようです。
コード自体には特に問題が見受けられないため、エラーの原因はおそらく`pandas_datareader`やYahoo FinanceのAPIの内部にある可能性が高いです。
トラブルシューティングの提案:
バージョンの確認: pandas_datareaderのバージョンを最新にしてみてください。
pythonCopy code
日付の形式: startをdatetime.dateオブジェクトにしてみてください。
pythonCopy code
エラーハンドリング: データ取得の部分でエラーが出ている場合、リトライするなどしてみてください。
pythonCopy code
ローカルファイルへの保存: Google Colabではos.path.dirname(__file__)が使えないので、ファイルの保存パスを指定する際にはこの部分を省いてください。
pythonCopy code
代替手段: yfinanceライブラリを使ってYahoo Financeからデータを取得する方法もあります。
pythonCopy code
これらの提案の中から適用可能なものを試して、問題が解決するか確認してみてください。
Action→「コード自体には特に問題が見受けられないため、エラーの原因はおそらく`pandas_datareader`やYahoo FinanceのAPIの内部にある可能性が高いです。」
問題解決のコードを聞く。
7.4回目のエラー
エラーメッセージによると、`web.DataReader`の部分でエラーが発生しており、その結果`df`(DataFrame)が定義されていない状態で`df.insert()`が呼び出されています。
これは`pandas_datareader`がYahoo FinanceのAPIと適切に通信できていない、またはAPIのレスポンスが予期せぬ形式である可能性を示しています。
以下に修正したコードを示します。こちらでは、`pandas_datareader`が失敗した場合に`yfinance`ライブラリを使用してデータを取得します。
# Google Colab上で手動で実行してください: !pip install --upgrade pandas_datareader
# !pip install yfinance
import os
import time
import datetime as dt
import pandas_datareader.data as web
import yfinance as yf
# 銘柄コード入力(7177はGMO-APです。)
ticker_symbol = "7177"
ticker_symbol_dr = ticker_symbol + ".T"
# 2022-01-01以降の株価取得
start = dt.datetime.strptime('2022-01-01', '%Y-%m-%d').date()
end = dt.date.today()
df = None
# データ取得(pandas_datareaderを試みる)
for _ in range(3): # 3回リトライ
try:
df = web.DataReader(ticker_symbol_dr, data_source='yahoo', start=start, end=end)
break # 成功したらループを抜ける
except Exception as e:
print(f"An error occurred with pandas_datareader: {e}")
time.sleep(5) # 5秒待つ
# pandas_datareaderが失敗した場合、yfinanceを使用
if df is None:
try:
df = yf.download(ticker_symbol_dr, start=start, end=end)
except Exception as e:
print(f"An error occurred with yfinance: {e}")
# DataFrameが正常に取得できた場合、後続の処理を行う
if df is not None:
# 2列目に銘柄コード追加
df.insert(0, "code", ticker_symbol, allow_duplicates=False)
# CSV保存(Google Colabに適した方法で保存)
save_path = f'y_stock_data_{ticker_symbol}.csv'
df.to_csv(save_path)
print(f"Data saved to {save_path}")
else:
print("Data could not be fetched.")
このコードは、まず`pandas_datareader`でデータを取得しようと試み、それが失敗した場合は`yfinance`を使用します。どちらの方法も失敗した場合は、"Data could not be fetched."と表示されます。この修正によって、データ取得の成功率が向上するはずです。
Action→「`web.DataReader`の部分でエラーが発生しており、その結果`df`(DataFrame)が定義されていない状態で`df.insert()`が呼び出されています。」と原因が更に特定。
→修正されたコードを聞く。
8.5回目のエラー
コードを実行していただき、ありがとうございます。結果はどうでしたか?データは正常に取得できましたか、それとも何らかのエラーが発生しましたか?
このコードは`pandas_datareader`と`yfinance`の両方を試してデータを取得するように設計されています。何か問題が発生した場合、エラーメッセージが表示されるはずです。その情報があれば、更に問題の原因を特定しやすくなります。
何か問題や質問があれば、どうぞお知らせください。
Action→エラーをコピペしたら上記の返信。
9.6回目のエラー
ようやく成功!
データが`yfinance`を用いて正常に取得・保存できたようで、良かったです。
`pandas_datareader`で発生したエラーは、ライブラリ内部またはYahoo Finance APIの変更によるものである可能性が高いです。一方で、`yfinance`が成功しているので、この問題は特定のライブラリに依存するものと考えられます。
今後このコードを使用する際は、`yfinance`がデータ取得に成功しているため、`pandas_datareader`の部分はオプショナルとして考えても良いかもしれません。
何か他に質問や疑問点がありましたら、どうぞお知らせください。
10. おまけ
Google Colabでは、ファイルはノートブックと同じ作業ディレクトリに保存されます。この作業ディレクトリは一時的なもので、ノートブックのセッションが終了するとリセットされます。したがって、長期間データを保存する必要がある場合は、それをダウンロードするか、Google Driveに保存することをお勧めします。
ファイルの位置を確認する
Colabノートブックで以下のコマンドを実行すると、現在の作業ディレクトリの内容を確認できます。
!ls
ファイルをダウンロードする
以下のようなコードでファイルをダウンロードできます。
from google.colab import files
files.download('y_stock_data_7177.csv')
Google Driveに保存する
Google DriveとColabを連携させてファイルを保存することもできます。
from google.colab import drive
drive.mount('/content/drive')
このコードを実行すると、Google Driveをマウントするための認証プロセスが始まります。認証が完了したら、`/content/drive/`以下にGoogle Driveの内容が表示され、そこにファイルを保存できます。
たとえば、
df.to_csv('/content/drive/My Drive/y_stock_data_7177.csv')
このようなコードで、Google Driveの`My Drive`フォルダにCSVファイルを保存できます。
これらの方法で、Google Colab上で作成したデータを安全に保存できます。何か他の質問があれば、どうぞお知らせください。
11 . まとめ
上記のように、何度もエラーメッセージをChatGPTに投げ返して、エラーの分析と新たなコードの提案を繰り返した結果、今回は株価の書き出しに至ることが出来ました。
Web Scrapingはうまく行かないことも多いように感じますが、今後も、色々トライしてみたいと思います。
そしてデジタル修行は続く。。。。。。。
この記事が気に入ったらサポートをしてみませんか?