數據的取得非常重要,在正式開始學習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