【Python金融データ】investing.comからのデータ取得

投資・ファイナンス

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

今回使用したコードはこちらのGoogleColabで確認できます。

タイトルとURLをコピーしました