今回は、各種投資対象の価格データから、経済データまで幅広く公開されているinvesting.comからのデータ取得方法を紹介していきます。
investing.com
Webサイトからのデータ取得
トップページの上部にある検索バーにキーワードを入力して詳細なデータを取得したい銘柄を探します。
今回は、例えば、TOPIXデータを取得する場合を考えてみます。
銘柄の詳細ページの真ん中にあるHistrical dataを選択すると過去データの一覧が表示されます。
取得したいデータの頻度や期間を入力後、ダウンロードボタンをクリックすると、データをダウンロードできます。
Pythonによるデータ取得
公式の方法があるわけではありませんが、以前はPythonで取得するライブラリとして、investpyというライブラリが存在していました。
こちらのライブラリが、サイトの仕様変更で使えなくなってからは、investinyというライブラリがありましたが、こちらも2024年時点では使えなくなっています。
現在使えるAPIとしてはこちらのサイトが提供しているAPIがあるようですので、今回は、こちらのAPIを使って、データを取得する関数を作成しました。
取得可能なデータの種類と必要な入力は以下のようになります。
required_params = {
'stocks': { 'type', 'country', 'symbol', 'from_date', 'to_date'},
'cryptos': { 'type', 'symbol', 'from_date', 'to_date'},
'currency_crosses': { 'type', 'name', 'from_date', 'to_date'},
'bonds': { 'type', 'from_date', 'to_date'},
'commodities': { 'type', 'from_date', 'to_date'},
'etfs': { 'type', 'from_date', 'to_date'},
'funds': { 'type', 'from_date', 'to_date'},
'indices': { 'type', 'from_date', 'to_date'},
'certificates': { 'type', 'from_date', 'to_date'}
}
import urllib.parse
import httpx as req
import pandas as pd
def generate_url(email, product, **kwargs):
base_url = "http://api.scraperlink.com/investpy/"
# 各製品の必須パラメータを定義
required_params = {
'stocks': { 'type', 'country', 'symbol', 'from_date', 'to_date'},
'cryptos': { 'type', 'symbol', 'from_date', 'to_date'},
'currency_crosses': { 'type', 'name', 'from_date', 'to_date'},
'bonds': { 'type', 'from_date', 'to_date'},
'commodities': { 'type', 'from_date', 'to_date'},
'etfs': { 'type', 'from_date', 'to_date'},
'funds': { 'type', 'from_date', 'to_date'},
'indices': { 'type', 'from_date', 'to_date'},
'certificates': { 'type', 'from_date', 'to_date'}
}
# 指定された製品が存在しない場合はエラーを発生させる
if product not in required_params:
raise ValueError("Invalid product specified.")
# 必須パラメータのチェック
missing_params = required_params[product] - set(kwargs.keys())
if missing_params:
raise ValueError(f"Required parameters are missing: {', '.join(missing_params)}")
# URLパラメータの作成
params = urllib.parse.urlencode(kwargs)
# 完全なURLの作成
full_url = f"{base_url}?email={email}&product={product}&{params}"
return full_url
def get_data(url):
# APIにリクエストを送信し、データを取得
res = req.get(url, timeout=60)
if res.text.lower() in ('email verification sent.', 'email address not verified.'):
raise PermissionError('The Scraper API sent a verification link to your email address. Please verify your email before running the code again.')
if res.status_code in (400, 404, 401):
raise HTTPError(f'Failure in getting stock data. Bad request. {res.status_code}: {res.text}')
if res.status_code == 500:
raise HTTPError(f'Failure in getting stock data. Server error. {res.status_code}: {res.text}')
if res.status_code != 200:
raise HTTPError(f'Unknown error. {res.status_code}: {res.text}')
# レスポンスをDataFrameに変換
res_json = res.json()['data']
raw_df = pd.DataFrame(res_json)
# 列をリネームし、日付を整形
df = raw_df[['last_close', 'last_open', 'last_max', 'last_min', 'volumeRaw', 'change_precent']]
df.rename(
{'last_close': 'Price', 'last_open': 'Open', 'last_max': 'High', 'last_min': 'Low', 'volumeRaw': 'Vol', 'change_precent': 'Change'},
inplace=True,
axis=1
)
df['Date'] = pd.to_datetime(pd.to_datetime(raw_df.rowDateTimestamp)).dt.strftime('%Y-%m-%d')
return df
例えば、テスラの株価を取得するサンプルを書いてみます。
# Example usage:
url = generate_url(
email="メールアドレス",
product="stocks",
type='Daily',
country="united states",
symbol="TSLA",
from_date="2022-09-27",
to_date="2022-09-28"
)
print(url)
get_data(url)
このようにして、取得が可能です。
symbolはwebページにある()でくくられた中身が該当します。
一部取得できないデータは存在しますが、こちらを使うことで、ある程度自動でデータの取得が可能になります。