# 加載模塊
from functools import partial
import polars as pl
from alpha.dataset import process_drop_na, process_cs_norm
from alpha.dataset.datasets.alpha_158 import Alpha158
from trader.constant import Interval
from alpha import AlphaLab, AlphaDataset
# 創(chuàng)建數(shù)據(jù)中心
lab: AlphaLab = AlphaLab("./lab/etfs")
# 設(shè)置任務(wù)參數(shù)
name = "etfs"
index_symbol: str = "000300.SSE"
start: str = "2008-01-01"
end: str = "2023-12-31"
interval: Interval = Interval.DAILY
extended_days: int = 100
# 加載所有成分股代碼
component_symbols: list[str] = lab.load_component_symbols(index_symbol, start, end)
# 加載模塊
# 加載成分股數(shù)據(jù)
df: pl.DataFrame = lab.load_bar_df(component_symbols, interval, start, end, extended_days)
# 創(chuàng)建數(shù)據(jù)集對(duì)象
dataset: AlphaDataset = Alpha158(
df,
train_period = ("2008-01-01", "2014-12-31"),
valid_period = ("2015-01-01", "2016-12-31"),
test_period = ("2017-01-01", "2020-8-31"),
)
# 添加數(shù)據(jù)預(yù)處理器
dataset.add_processor("learn", partial(process_drop_na, names=["label"]))
dataset.add_processor("learn", partial(process_cs_norm, names=["label"], method="zscore"))
# 收集指數(shù)成分過(guò)濾器
filters: dict[str, list[str]] = lab.load_component_filters(index_symbol, start, end)
# 準(zhǔn)備特征和標(biāo)簽數(shù)據(jù)
dataset.prepare_data(filters, max_workers=3)
# 保存到文件緩存
lab.save_dataset(name, dataset)
# 加載模塊
import numpy as np
from alpha import Segment, AlphaDataset, AlphaModel
from alpha.model.models.lgb_model import LgbModel
# 從文件緩存加載
dataset: AlphaDataset = lab.load_dataset(name)# 創(chuàng)建模型對(duì)象
model: AlphaModel = LgbModel(seed=42)
# 使用數(shù)據(jù)集訓(xùn)練模型
model.fit(dataset)
# 保存模型
lab.save_model(name, model)
# 用模型在測(cè)試集上預(yù)測(cè)
pre: np.ndarray = model.predict(dataset, Segment.TEST)
# 加載測(cè)試集數(shù)據(jù)
df_t: pl.DataFrame = dataset.fetch_infer(Segment.TEST)
# 合并預(yù)測(cè)信號(hào)列
df_t = df_t.with_columns(pl.Series(pre).alias("signal"))
# 提取信號(hào)數(shù)據(jù)
signal: pl.DataFrame = df_t["datetime", "vt_symbol", "signal"]
# 加載模塊
import importlib
from datetime import datetime
from alpha.strategy import BacktestingEngine
import alpha.strategy.strategies.equity_demo_strategy as equity_demo_strategy
# 重載策略類
importlib.reload(equity_demo_strategy)
EquityDemoStrategy = equity_demo_strategy.EquityDemoStrategy
# 從文件加載信號(hào)數(shù)據(jù)
signal = lab.load_signal(name)
# 創(chuàng)建回測(cè)引擎對(duì)象
engine = BacktestingEngine(lab)
# 設(shè)置回測(cè)參數(shù)
engine.set_parameters(
vt_symbols=component_symbols,
interval=Interval.DAILY,
start=datetime(2017, 1, 1),
end=datetime(2020, 8, 1),
capital=100000000
)
# 添加策略實(shí)例
setting = {"top_k": 30, "n_drop": 3, "hold_thresh": 3}
engine.add_strategy(EquityDemoStrategy, setting, signal)
# 執(zhí)行回測(cè)任務(wù)
engine.load_data()
engine.run_backtesting()
engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()