今回は、各種投資対象の価格データから、経済データまで幅広く公開されている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ページにある()でくくられた中身が該当します。
一部取得できないデータは存在しますが、こちらを使うことで、ある程度自動でデータの取得が可能になります。

 
  
  
  
  
