😀

PythonでFRED、Alpha Vantage、Binanceからデータを取得する方法

2024/11/26に公開

この記事では、Pythonを使用してFRED(Federal Reserve Economic Data)、Alpha Vantage、そしてBinanceからデータを取得する方法について解説します。これらのデータソースを活用することで、経済指標や株価、暗号通貨の市場データを効率的に取得・分析することが可能になります。

目次

  1. 必要なライブラリのインストール
  2. .envファイルの設定
  3. FRED APIからのデータ取得
  4. Alpha Vantage APIからのデータ取得
  5. ccxtを使用したBinanceからのデータ取得
  6. 実行方法
  7. まとめ

必要なライブラリのインストール

まず、必要なPythonライブラリをインストールします。以下のコマンドを実行してください。

pip install requests pandas python-dotenv ccxt
  • requests: HTTPリクエストを送信するためのライブラリ
  • pandas: データ解析・操作のためのライブラリ
  • python-dotenv: .envファイルから環境変数を読み込むためのライブラリ
  • ccxt: 暗号通貨取引所のAPIにアクセスするためのライブラリ

.envファイルの設定

APIキーを安全に管理するために、プロジェクトのルートディレクトリに.envファイルを作成し、以下のように記述します。

FRED_API_KEY=あなたのFRED_APIキー
ALPHA_VANTAGE_API_KEY=あなたのAlpha Vantage APIキー

注意: .envファイルは機密情報を含むため、.gitignoreに追加してバージョン管理システムに含めないようにしましょう。

.env

FRED APIからのデータ取得

FREDは米国セントルイス連邦準備銀行が提供する経済データのプラットフォームです。以下の関数fetch_fred_dataを使用して、指定したシリーズIDのデータを取得します。

import os
import requests
import pandas as pd
from dotenv import load_dotenv

# .envファイルの読み込み
load_dotenv()

# 環境変数からAPIキーを取得
FRED_API_KEY = os.getenv("FRED_API_KEY")

# FRED APIからデータを取得する関数
def fetch_fred_data(series_id):
    api_key = os.getenv("FRED_API_KEY")
    url = f"https://api.stlouisfed.org/fred/series/observations?series_id={series_id}&api_key={api_key}&file_type=json"
    response = requests.get(url)
    data = response.json()
    df = pd.DataFrame(data['observations'])
    df['indicator_name'] = series_id
    return df

使用例

GDPデータ(シリーズID: GDPC1)を取得して表示します。

def main():
    # FRED APIからGDPデータを取得
    gdp_df = fetch_fred_data("GDPC1")
    print(gdp_df.head())

Alpha Vantage APIからのデータ取得

Alpha Vantageは株価や為替、暗号通貨のデータを提供するAPIです。以下の関数fetch_alpha_vantage_dataを使用して、指定したシンボルのデイリーデータを取得します。

# Alpha Vantage APIからデータを取得する関数
def fetch_alpha_vantage_data(symbol, function="TIME_SERIES_DAILY"):
    api_key = os.getenv("ALPHA_VANTAGE_API_KEY")
    url = f"https://www.alphavantage.co/query?function={function}&symbol={symbol}&apikey={api_key}"
    response = requests.get(url)
    data = response.json()
    df = pd.DataFrame.from_dict(data['Time Series (Daily)'], orient='index')
    return df

使用例

Apple Inc.(AAPL)のデイリーデータを取得して表示します。

def main():
    # Alpha Vantage APIからAAPLデータを取得
    aapl_df = fetch_alpha_vantage_data("AAPL")
    print(aapl_df.head())

ccxtを使用したBinanceからのデータ取得

ccxtライブラリを使用すると、複数の暗号通貨取引所からデータを取得できます。以下の関数fetch_binance_dataを使用して、Binanceから指定したシンボルのOHLCVデータを取得します。

import ccxt

# ccxtを使用したデータ取得の例
def fetch_binance_data(symbol, timeframe='1d', since=None):
    exchange = ccxt.binance()
    if since:
        since = exchange.parse8601(since)
    bars = exchange.fetch_ohlcv(symbol, timeframe=timeframe, since=since)
    data = pd.DataFrame(bars, columns=['Date', 'Open', 'High', 'Low', 'Close', 'Volume'])
    data['Date'] = pd.to_datetime(data['Date'], unit='ms')
    data.set_index('Date', inplace=True)
    return data

使用例

Bitcoin(BTC)とTether(USDT)のペア(BTC/USDT)のデイリーデータを取得して表示します。

def main():
    # Binance APIからBTC/USDTデータを取得
    btc_df = fetch_binance_data("BTC/USDT")
    print(btc_df.head())

実行方法

すべての関数を統合し、main関数で実行します。以下が完全なスクリプトです。

# app/api/data_fetch.py
import os
import requests
import pandas as pd
from dotenv import load_dotenv
import ccxt

# .envファイルの読み込み
load_dotenv()

# 環境変数からAPIキーを取得
FRED_API_KEY = os.getenv("FRED_API_KEY")
ALPHA_VANTAGE_API_KEY = os.getenv("ALPHA_VANTAGE_API_KEY")

# FRED APIからデータを取得する関数
def fetch_fred_data(series_id):
    api_key = os.getenv("FRED_API_KEY")
    url = f"https://api.stlouisfed.org/fred/series/observations?series_id={series_id}&api_key={api_key}&file_type=json"
    response = requests.get(url)
    data = response.json()
    df = pd.DataFrame(data['observations'])
    df['indicator_name'] = series_id
    return df

# Alpha Vantage APIからデータを取得する関数
def fetch_alpha_vantage_data(symbol, function="TIME_SERIES_DAILY"):
    api_key = os.getenv("ALPHA_VANTAGE_API_KEY")
    url = f"https://www.alphavantage.co/query?function={function}&symbol={symbol}&apikey={api_key}"
    response = requests.get(url)
    data = response.json()
    df = pd.DataFrame.from_dict(data['Time Series (Daily)'], orient='index')
    return df

# ccxtを使用したデータ取得の例
def fetch_binance_data(symbol, timeframe='1d', since=None):
    exchange = ccxt.binance()
    if since:
        since = exchange.parse8601(since)
    bars = exchange.fetch_ohlcv(symbol, timeframe=timeframe, since=since)
    data = pd.DataFrame(bars, columns=['Date', 'Open', 'High', 'Low', 'Close', 'Volume'])
    data['Date'] = pd.to_datetime(data['Date'], unit='ms')
    data.set_index('Date', inplace=True)
    return data

# 実効するためのコード
def main():
    # FRED APIからGDPデータを取得
    gdp_df = fetch_fred_data("GDPC1")
    print("GDPデータ(FRED):")
    print(gdp_df.head())

    # Alpha Vantage APIからAAPLデータを取得
    aapl_df = fetch_alpha_vantage_data("AAPL")
    print("\nAAPLデータ(Alpha Vantage):")
    print(aapl_df.head())

    # Binance APIからBTC/USDTデータを取得
    btc_df = fetch_binance_data("BTC/USDT")
    print("\nBTC/USDTデータ(Binance):")
    print(btc_df.head())

if __name__ == "__main__":
    main()

実行結果の例

GDPデータ(FRED):
        date    value indicator_name
0  1947-01-01  243.1          GDPC1
1  1947-04-01  246.3          GDPC1
2  1947-07-01  250.1          GDPC1
3  1947-10-01  260.3          GDPC1
4  1948-01-01  266.2          GDPC1

AAPLデータ(Alpha Vantage):
                1. open    2. high     3. low   4. close    5. volume
2024-04-25  170.0000  175.0000  169.0000  174.0000  1000000
2024-04-26  174.0000  176.0000  172.0000  175.5000   850000
2024-04-29  175.5000  178.0000  175.0000  177.0000   900000
2024-04-30  177.0000  180.0000  176.5000  179.5000  1200000
2024-05-01  179.5000  181.0000  178.0000  180.0000  1100000

BTC/USDTデータ(Binance):
                     Open    High     Low   Close     Volume
Date                                                       
2024-04-25  28000.000000  28500.0  27500.0  28250.0  3500.0000
2024-04-26  28250.000000  29000.0  28000.0  28800.0  4200.0000
2024-04-27  28800.000000  29500.0  28500.0  29000.0  3900.0000
2024-04-28  29000.000000  30000.0  28900.0  29800.0  5000.0000
2024-04-29  29800.000000  30500.0  29500.0  30300.0  4800.0000

まとめ

コードの解説はAIです。
今後もデータ収集・加工、アプリ開発の記事を書くことが多いと思いますので、もしよければフォロー&良いねお願いします!

参考資料

Discussion