數據的取得非常重要,在正式開始學習FinRL教學範例之前,先直接調用Yahoo Finance,嘗試獲取之後可以用於訓練的股票價格資料。
yfinance 抓取 S&P 500 的 15 分鐘資料下面是一個具體範例,從 Yahoo Finance 下載 S&P 500 指數在指定兩天內的每 15 分鐘的歷史資料。
這些數據將包括開盤價(Open)、最高價(High)、最低價(Low)、收盤價(Close)、調整後的收盤價(Adj Close)以及成交量(Volume)。
start_date 和 end_date: 我們選擇了 2 天的日期範圍,這適合使用 15m 這樣的高頻資料。interval: 15m 代表每 15 分鐘抓取一次資料,適合短期交易分析。intervals 參數參考yf.download的定義註解
Valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo Intraday data cannot extend last 60 days
一開始嘗試抓取
2023-08-01~2023-08-02被拒絕
YFPricesMissingError('$%ticker%: possibly delisted; no price data found (15m 2023-08-01 -> 2023-08-02) (Yahoo error = "15m data not available for startTime=1690862400 and endTime=1690948800. The requested range must be within the last 60 days.")')
import yfinance as yf
import pandas as pd
# 設定參數
start_date = '2024-08-01'  # 設定開始日期
end_date = '2024-08-02'    # 設定結束日期
interval = '15m'            # 設定時間週期為 15 分鐘
# 抓取 S&P 500 數據
ticker = '^GSPC'  # Yahoo Finance 中 S&P 500 的代號
sp500_data = yf.download(ticker, start=start_date, end=end_date, interval=interval)
# 顯示數據
print(sp500_data.head())
yfinance 一次抓取多隻股票的資料import yfinance as yf
import pandas as pd
# 設定參數
start_date = '2024-08-01'  # 設定開始日期
end_date = '2024-08-02'    # 設定結束日期
interval = '15m'            # 設定時間週期為 15 分鐘
# 設定多支股票的代號
tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA']  # 股票代號
# 抓取多支股票的數據
data = yf.download(tickers, start=start_date, end=end_date, interval=interval, group_by='ticker')
# 顯示數據
for ticker in tickers:
    print(f"--- {ticker} ---")
    print(data[ticker].head())
    print("\n")
FinRL 進行特徵工程股市中有很多常見的指標,這些技術指標像是移動平均收斂散度(MACD)、相對強弱指數(RSI)等等。因為很多人使用這些指標,導致股票的波動很多時候會對這些指標有反應,因此在訓練時,可以考慮將這些指標做為特徵丟給網路當作輸入;這邊使用FinRL的API可以很輕鬆地取得這些指標數值來做特徵工程。
在應用特徵工程之前,我們需要對數據進行一些預處理步驟,包括添加必要的欄位並將欄位名稱轉換為小寫,以符合 FeatureEngineer 的預期格式。
在進行特徵工程之前,我們需要確保數據框包含 date 和 tic 欄位。date 欄位用來表示時間戳,而 tic 欄位用來表示股票的代號。
# 添加必要的欄位
sp500_data = sp500_data.reset_index()  # 重設索引,將日期移到普通欄位
sp500_data['date'] = sp500_data['Datetime']  # 添加 'date' 欄位
sp500_data['tic'] = '^GSPC'  # 添加 'tic' 欄位,這裡 '^GSPC' 是 S&P 500 的代號
# 移除原本的 'Datetime' 欄位
sp500_data = sp500_data.drop(columns=['Datetime'])
# 將所有欄位名稱轉為小寫,以符合 FeatureEngineer 的預期格式
sp500_data.columns = [col.lower() for col in sp500_data.columns]
# 顯示處理後的數據
print(sp500_data.head())
FeatureEngineer 進行特徵工程現在我們可以使用 FeatureEngineer 來添加技術指標並進行特徵工程。
from finrl.meta.preprocessor.preprocessors import FeatureEngineer
# 定義我們要使用的技術指標
INDICATORS = ['macd', 'rsi', 'cci', 'dx']
# 初始化 FeatureEngineer
fe = FeatureEngineer(use_technical_indicator=True, tech_indicator_list=INDICATORS)
# 將技術指標應用於 S&P 500 的數據
sp500_data_with_indicators = fe.preprocess_data(sp500_data)
# 顯示結果
print(sp500_data_with_indicators.head())
經過特徵工程處理後,我們的數據集將包含原始的 OHLCV 資料以及計算出的技術指標。
範例輸出:
          open         high          low        close    adj close     volume                date    tic      macd  rsi         cci          dx
0  5537.839844  5564.850098  5537.839844  5563.870117  5563.870117  103701490 2024-08-01 09:30:00  ^GSPC  0.000000  0.0   66.666667  100.000000
1  5563.919922  5566.160156  5552.790039  5556.890137  5556.890137  127984568 2024-08-01 09:45:00  ^GSPC -0.156602  0.0   66.666667  100.000000
2  5556.299805  5559.220215  5536.430176  5537.759766  5537.759766  133276389 2024-08-01 10:00:00  ^GSPC -0.792774  0.0 -100.000000   87.020657