Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7fad62a4ef | ||
|
|
f9ef005e9a | ||
|
|
c09997c7e2 |
+15
-15
@@ -1,27 +1,27 @@
|
|||||||
# TradeAC custom-qlib-code snapshot (auto-generated)
|
# TradeAC custom-qlib-code snapshot (auto-generated)
|
||||||
# parent repo HEAD : e660b4f2dd7c521615c54a142eec9266837f2e64
|
# parent repo HEAD : f9ef005e9aa05e546c11eef760046648cf5a6334
|
||||||
# tac-qlib/tac_qlib/contrib
|
# tac-qlib/tac_qlib/contrib
|
||||||
# tac-qlib/tac_qlib/data
|
# tac-qlib/tac_qlib/data
|
||||||
# per-file hashes (git hash-object):
|
# per-file hashes (git hash-object):
|
||||||
1b6298c4a5652f2e863cbdc385a1014a570fcd59 tac-qlib/tac_qlib/contrib/__init__.py
|
1b6298c4a5652f2e863cbdc385a1014a570fcd59 tac-qlib/tac_qlib/contrib/__init__.py
|
||||||
b5e28b7c0a10ab553eaa6303013a880731742378 tac-qlib/tac_qlib/contrib/__pycache__/__init__.cpython-312.pyc
|
b8112569f9b2537c45b6535e1a505a207878d322 tac-qlib/tac_qlib/contrib/__pycache__/__init__.cpython-312.pyc
|
||||||
c76a9f17f680e74eea766eff27f7624359749ed6 tac-qlib/tac_qlib/contrib/data/__init__.py
|
c76a9f17f680e74eea766eff27f7624359749ed6 tac-qlib/tac_qlib/contrib/data/__init__.py
|
||||||
715ab312125a446af751b928fe41cf41b99ffcd0 tac-qlib/tac_qlib/contrib/data/__pycache__/__init__.cpython-312.pyc
|
8d5333ebd2b44165c50cba639ca2d4ac3fc7cfec tac-qlib/tac_qlib/contrib/data/__pycache__/__init__.cpython-312.pyc
|
||||||
a82a6a236db93097d48748e541c2cf9caa4e48b5 tac-qlib/tac_qlib/contrib/data/__pycache__/handler.cpython-312.pyc
|
18cb37c0354184c49fa2e598396d7df0634cce0f tac-qlib/tac_qlib/contrib/data/__pycache__/handler.cpython-312.pyc
|
||||||
0dd25ef161c6e0f15eafc84886e7e1381deb38c3 tac-qlib/tac_qlib/contrib/data/handler.py
|
871ff1e163c29261f140c3f53d42a41e6504c779 tac-qlib/tac_qlib/contrib/data/handler.py
|
||||||
b151d139a0dcde87d74b21e7c4b729176ba5c39b tac-qlib/tac_qlib/contrib/model/__init__.py
|
b151d139a0dcde87d74b21e7c4b729176ba5c39b tac-qlib/tac_qlib/contrib/model/__init__.py
|
||||||
483221cf1d5bad779d3cf9505269b7fb0b3f165d tac-qlib/tac_qlib/contrib/model/__pycache__/__init__.cpython-312.pyc
|
ab958203f33a99d12c7d923b6efb435189231666 tac-qlib/tac_qlib/contrib/model/__pycache__/__init__.cpython-312.pyc
|
||||||
1286dec07a861f25691b24f71ecc22d8eb3537df tac-qlib/tac_qlib/contrib/model/__pycache__/rank_ensemble.cpython-312.pyc
|
9dc36de7e343073b7d511349ee5aede086c38f94 tac-qlib/tac_qlib/contrib/model/__pycache__/rank_ensemble.cpython-312.pyc
|
||||||
5185764bd55dbc63d16582bfcb6adc11b7e6d342 tac-qlib/tac_qlib/contrib/model/__pycache__/rank_gbdt.cpython-312.pyc
|
9f9014ddd9bce37490061312d51e8e6fe540fec4 tac-qlib/tac_qlib/contrib/model/__pycache__/rank_gbdt.cpython-312.pyc
|
||||||
d3f051f3a8650c42fedc7b367b966f7c74fb5789 tac-qlib/tac_qlib/contrib/model/rank_ensemble.py
|
d3f051f3a8650c42fedc7b367b966f7c74fb5789 tac-qlib/tac_qlib/contrib/model/rank_ensemble.py
|
||||||
ccfe7d554989aa7f3e5a2128ae663e51b2207149 tac-qlib/tac_qlib/contrib/model/rank_gbdt.py
|
ccfe7d554989aa7f3e5a2128ae663e51b2207149 tac-qlib/tac_qlib/contrib/model/rank_gbdt.py
|
||||||
4afcf9058231111c412925f4c4b84e81d656db87 tac-qlib/tac_qlib/contrib/strategy/__init__.py
|
4afcf9058231111c412925f4c4b84e81d656db87 tac-qlib/tac_qlib/contrib/strategy/__init__.py
|
||||||
13a8e4a41ce9afde97a55756d666d3ff5cbbec0e tac-qlib/tac_qlib/contrib/strategy/__pycache__/__init__.cpython-312.pyc
|
74e5ecbbbb20bb71fd5cd083383de4ce88476712 tac-qlib/tac_qlib/contrib/strategy/__pycache__/__init__.cpython-312.pyc
|
||||||
0bb5804a79611c66bc25988226ca0f1cdbe1a7eb tac-qlib/tac_qlib/contrib/strategy/__pycache__/optimal_stop.cpython-312.pyc
|
afaf562aeaa12cebc8529cd916153252e7e3c38a tac-qlib/tac_qlib/contrib/strategy/__pycache__/optimal_stop.cpython-312.pyc
|
||||||
79aaad9e39fcc740a773f4f63c512ce1086cfde0 tac-qlib/tac_qlib/contrib/strategy/optimal_stop.py
|
79aaad9e39fcc740a773f4f63c512ce1086cfde0 tac-qlib/tac_qlib/contrib/strategy/optimal_stop.py
|
||||||
92e6e90eb0cd0a25142034560f27adb6b705b1a8 tac-qlib/tac_qlib/data/__init__.py
|
92e6e90eb0cd0a25142034560f27adb6b705b1a8 tac-qlib/tac_qlib/data/__init__.py
|
||||||
3cbc0686e6f863d306d93c589a607a5bdb7201f2 tac-qlib/tac_qlib/data/__pycache__/__init__.cpython-312.pyc
|
0ed1ead6c1314a3f25784d453e54a15a8a04baaa tac-qlib/tac_qlib/data/__pycache__/__init__.cpython-312.pyc
|
||||||
46bcdbcc173ff3a6281fed33d10c1bcac96876b0 tac-qlib/tac_qlib/data/__pycache__/config.cpython-312.pyc
|
9609782800944c45b78bb58eaa7b51ba1b7f8f43 tac-qlib/tac_qlib/data/__pycache__/config.cpython-312.pyc
|
||||||
6df4f88af22ab4c026c14ef1835f2e630cdf850c tac-qlib/tac_qlib/data/__pycache__/providers.cpython-312.pyc
|
a85628d71d12cfe5b18b1c884c5d829c89594579 tac-qlib/tac_qlib/data/__pycache__/providers.cpython-312.pyc
|
||||||
53c9007a928841fd3c3b08450f9a6520ce1ac091 tac-qlib/tac_qlib/data/config.py
|
686d36f6d101c547491ca866aa143aa542e17518 tac-qlib/tac_qlib/data/config.py
|
||||||
8d0644f6f0d1efb94798ed444cc73e63b643459b tac-qlib/tac_qlib/data/providers.py
|
d9f839be30026f337754a3f015425a8efdbe8e2a tac-qlib/tac_qlib/data/providers.py
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -64,13 +64,9 @@ def check_transform_proc(proc_l, fit_start_time, fit_end_time):
|
|||||||
|
|
||||||
|
|
||||||
def get_common_feature_fields(lake_root=None, market="US", timeframe="1d") -> List[str]:
|
def get_common_feature_fields(lake_root=None, market="US", timeframe="1d") -> List[str]:
|
||||||
"""Discover feature columns present in *every* feature file of the lake.
|
"""Discover ta-lib columns present in *every* features parquet file of the lake.
|
||||||
|
|
||||||
Walks the `family=ta|sp` partition layout (plus any legacy flat files).
|
Returns sorted field names (without the ``$`` prefix). Empty if no features are persisted.
|
||||||
TA and SP columns are disjoint by construction, so the common set is
|
|
||||||
computed per family (columns shared by all symbol files of that family),
|
|
||||||
then the per-family results are unioned. Returns sorted field names
|
|
||||||
(without the ``$`` prefix). Empty if no features are persisted.
|
|
||||||
"""
|
"""
|
||||||
cfg = LakeConfig(lake_root, market)
|
cfg = LakeConfig(lake_root, market)
|
||||||
feat_dir = cfg.features_dir(timeframe)
|
feat_dir = cfg.features_dir(timeframe)
|
||||||
@@ -78,9 +74,8 @@ def get_common_feature_fields(lake_root=None, market="US", timeframe="1d") -> Li
|
|||||||
return []
|
return []
|
||||||
import pyarrow.parquet as pq
|
import pyarrow.parquet as pq
|
||||||
|
|
||||||
def _family_common(fam_dir: Path) -> set:
|
|
||||||
common = None
|
common = None
|
||||||
for p in sorted(fam_dir.glob("symbol=*.parquet")):
|
for p in sorted(feat_dir.glob("symbol=*.parquet")):
|
||||||
try:
|
try:
|
||||||
cols = set(pq.read_schema(p).names) - set(NON_FEATURE_COLUMNS)
|
cols = set(pq.read_schema(p).names) - set(NON_FEATURE_COLUMNS)
|
||||||
except Exception: # pragma: no cover - skip unreadable files
|
except Exception: # pragma: no cover - skip unreadable files
|
||||||
@@ -88,20 +83,7 @@ def get_common_feature_fields(lake_root=None, market="US", timeframe="1d") -> Li
|
|||||||
common = cols if common is None else (common & cols)
|
common = cols if common is None else (common & cols)
|
||||||
if not common:
|
if not common:
|
||||||
break
|
break
|
||||||
return common or set()
|
return sorted(common) if common else []
|
||||||
|
|
||||||
common: set = set()
|
|
||||||
# family tier: features/market=*/timeframe=*/family=*/symbol=*.parquet
|
|
||||||
for fam in ("ta", "sp"):
|
|
||||||
fam_dir = feat_dir / f"family={fam}"
|
|
||||||
if fam_dir.is_dir():
|
|
||||||
common |= _family_common(fam_dir)
|
|
||||||
# legacy flat: features/market=*/timeframe=*/symbol=*.parquet
|
|
||||||
if (feat_dir / "family=ta").exists() or (feat_dir / "family=sp").exists():
|
|
||||||
pass # family layout already covered
|
|
||||||
else:
|
|
||||||
common |= _family_common(feat_dir)
|
|
||||||
return sorted(common)
|
|
||||||
|
|
||||||
|
|
||||||
class DropAllNaN(processor_module.Processor):
|
class DropAllNaN(processor_module.Processor):
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -6,11 +6,10 @@ The lake is a hive-partitioned parquet store (see ``tac-engine/skills/tradeac-la
|
|||||||
├── market=US/
|
├── market=US/
|
||||||
│ └── timeframe=1d/
|
│ └── timeframe=1d/
|
||||||
│ └── symbol=AAPL.parquet # OHLCV bars: t, date, o, h, l, c, v, n, vw
|
│ └── symbol=AAPL.parquet # OHLCV bars: t, date, o, h, l, c, v, n, vw
|
||||||
├── features/ # indicators, wide format, family tier
|
├── features/ # ta-lib indicators, wide format
|
||||||
│ └── market=US/
|
│ └── market=US/
|
||||||
│ └── timeframe=1d/
|
│ └── timeframe=1d/
|
||||||
│ ├── family=ta/symbol=AAPL.parquet # t, sma_5, sma_20, rsi_14, ...
|
│ └── symbol=AAPL.parquet # t, sma_5, sma_20, rsi_14, ...
|
||||||
│ └── family=sp/symbol=AAPL.parquet # t, sp_ou_*, sp_hmm_*, ...
|
|
||||||
├── calendar.parquet # trading days per market
|
├── calendar.parquet # trading days per market
|
||||||
├── coverage.parquet # per (market,timeframe,symbol) loaded windows
|
├── coverage.parquet # per (market,timeframe,symbol) loaded windows
|
||||||
└── symbols.parquet # asset master
|
└── symbols.parquet # asset master
|
||||||
@@ -108,34 +107,8 @@ class LakeConfig:
|
|||||||
return self.lake_root / "features" / f"market={self.market}" / f"timeframe={timeframe}"
|
return self.lake_root / "features" / f"market={self.market}" / f"timeframe={timeframe}"
|
||||||
|
|
||||||
def features_path(self, timeframe: str, symbol: str) -> Path:
|
def features_path(self, timeframe: str, symbol: str) -> Path:
|
||||||
# Legacy flat path (no family tier). Prefer `load_features` which
|
|
||||||
# resolves the family=ta|sp partition layout.
|
|
||||||
return self.features_dir(timeframe) / f"symbol={str(symbol).upper()}.parquet"
|
return self.features_dir(timeframe) / f"symbol={str(symbol).upper()}.parquet"
|
||||||
|
|
||||||
def load_features(self, timeframe: str, symbol: str) -> pd.DataFrame:
|
|
||||||
"""All feature columns for a symbol, merging the `family=ta` and
|
|
||||||
`family=sp` partitions by timestamp. Returns an empty frame when no
|
|
||||||
feature files exist (legacy flat layout falls back transparently)."""
|
|
||||||
sym = str(symbol).upper()
|
|
||||||
frames = []
|
|
||||||
for family in ("ta", "sp"):
|
|
||||||
p = self.features_dir(timeframe) / f"family={family}" / f"symbol={sym}.parquet"
|
|
||||||
if p.exists():
|
|
||||||
frames.append(pd.read_parquet(p))
|
|
||||||
if not frames:
|
|
||||||
flat = self.features_dir(timeframe) / f"symbol={sym}.parquet"
|
|
||||||
if flat.exists():
|
|
||||||
return pd.read_parquet(flat)
|
|
||||||
return pd.DataFrame()
|
|
||||||
if len(frames) == 1:
|
|
||||||
return frames[0]
|
|
||||||
merged = frames[0]
|
|
||||||
for extra in frames[1:]:
|
|
||||||
merged = merged.merge(extra, on="t", how="outer", suffixes=("", "_dup"))
|
|
||||||
for c in [c for c in merged.columns if c.endswith("_dup")]:
|
|
||||||
merged = merged.drop(columns=c)
|
|
||||||
return merged
|
|
||||||
|
|
||||||
def calendar_path(self) -> Path:
|
def calendar_path(self) -> Path:
|
||||||
return self.lake_root / "calendar.parquet"
|
return self.lake_root / "calendar.parquet"
|
||||||
|
|
||||||
|
|||||||
@@ -173,7 +173,8 @@ class LakeFeatureProvider(FeatureProvider):
|
|||||||
def _load_feature_df(self, instrument: str, timeframe: str) -> pd.DataFrame:
|
def _load_feature_df(self, instrument: str, timeframe: str) -> pd.DataFrame:
|
||||||
key = (instrument, timeframe)
|
key = (instrument, timeframe)
|
||||||
if key not in self._feature_cache:
|
if key not in self._feature_cache:
|
||||||
self._feature_cache[key] = self.cfg.load_features(timeframe, instrument)
|
p = self.cfg.features_path(timeframe, instrument)
|
||||||
|
self._feature_cache[key] = pd.read_parquet(p) if p.exists() else pd.DataFrame()
|
||||||
return self._feature_cache[key]
|
return self._feature_cache[key]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|||||||
@@ -1,26 +1,53 @@
|
|||||||
# Re-run of experiment 16 with validated family=ta and family=sp lake features.
|
# -----------------------------------------------------------------------------
|
||||||
|
# EXP 18 - Risk-limit control: reference model + TopkDropout baseline (A).
|
||||||
|
#
|
||||||
|
# Signal/model identical to the reference (tac-rd-rank-ensemble-isolated,
|
||||||
|
# run 0cea66d9...): RankICEnsembleLGBModel (parallel, 5 seeds) on the 50-ETF
|
||||||
|
# SP-5d panel, test 2026-01-04..2026-08-10. This workflow reproduces the
|
||||||
|
# unconstrained TopkDropout baseline net-of-cost so the risk-limited variant
|
||||||
|
# (same pred, liquidity/size/concentration caps) can be compared 1:1.
|
||||||
|
#
|
||||||
|
# The risk_limits spec itself is applied via rd_backtest / rd_strategy_targets
|
||||||
|
# (tool-level param, not a YAML key); this run records the unconstrained
|
||||||
|
# baseline that the limit A/B is measured against.
|
||||||
|
#
|
||||||
|
# Run:
|
||||||
|
# rd_run_workflow config_path=experiments/workflows/exp18-risk-limit/a_baseline.yaml \
|
||||||
|
# experiment_name=tac-rd-risk-limit
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
{%- set LAKE = TAC_LAKE_DIR %}
|
{%- set LAKE = TAC_LAKE_DIR %}
|
||||||
{%- set UNIVERSE = "SPY,QQQ,DIA,IWM,MDY,VTI,VOO,VEA,VWO,VT,EFA,EEM,TLT,IEF,SHY,AGG,BND,LQD,HYG,JNK,EMB,GLD,SLV,USO,UNG,DBA,DBC,XLK,XLF,XLE,XLV,XLI,XLY,XLP,XLU,XLB,XLRE,ARKK,SMH,SOXX,IBB,XBI,ITA,XAR,ICLN,TAN,FDN,IGV,ESPO,REM" %}
|
{%- set UNIVERSE = "SPY,QQQ,DIA,IWM,MDY,VTI,VOO,VEA,VWO,VT,EFA,EEM,TLT,IEF,SHY,AGG,BND,LQD,HYG,JNK,EMB,GLD,SLV,USO,UNG,DBA,DBC,XLK,XLF,XLE,XLV,XLI,XLY,XLP,XLU,XLB,XLRE,ARKK,SMH,SOXX,IBB,XBI,ITA,XAR,ICLN,TAN,FDN,IGV,ESPO,REM" %}
|
||||||
{%- set FEATURES = "$open,$high,$low,$close,$vwap,$volume,sma_5,sma_20,ema_12,ema_26,rsi_14,macd,macd_signal,macd_hist,bb_upper,bb_middle,bb_lower,atr_14,adx_14,sp_ret,sp_ou_half_life,sp_ou_revert,sp_ou_zscore,sp_hmm_p_regime1,sp_hmm_state,sp_jump_ratio,sp_jump_flag,sp_jump_tail,sp_max_down,sp_max_move,sp_max_up,sp_rv1,sp_rv5,sp_rv22,sp_rv_ac1,sp_rv_cv_22,sp_vol_ratio_1_22,sp_vol_ratio_5_22,sp_trend_slope_5,sp_trend_slope_20,sp_trend_slope_60,sp_logp,sp_hurst_exponent,sp_rskew_5,sp_rskew_22,sp_rkurt_5,sp_rkurt_22,sp_dsv_1,sp_dsv_5,sp_dsv_22,sp_dsv_ratio_1,sp_dsv_ratio_5,sp_dsv_ratio_22,sp_sig_level1_lead,sp_sig_level1_lag,sp_sig_level2_lead_lag,sp_sig_level2_lag_lead,sp_sig_level2_lead_lag_5,sp_sig_level2_lag_lead_5" %}
|
{%- set SP_FIELDS = "sp_ret,sp_jump_ratio,sp_jump_flag,sp_jump_tail,sp_max_move,sp_rv1,sp_rv5,sp_rv22,sp_vol_ratio_5_22,sp_vol_ratio_1_22,sp_trend_slope_5,sp_trend_slope_20,sp_trend_slope_60,sp_logp,sp_hurst_exponent,sp_sig_level1_lead,sp_sig_level1_lag,sp_sig_level2_lead_lag,sp_sig_level2_lag_lead" %}
|
||||||
|
|
||||||
qlib_init:
|
qlib_init:
|
||||||
provider_uri: "{{ LAKE }}"
|
provider_uri: "{{ LAKE }}"
|
||||||
region: us
|
region: us
|
||||||
expression_cache: null
|
expression_cache: null
|
||||||
dataset_cache: null
|
dataset_cache: null
|
||||||
|
|
||||||
calendar_provider:
|
calendar_provider:
|
||||||
class: tac_qlib.data.providers.LakeCalendarProvider
|
class: tac_qlib.data.providers.LakeCalendarProvider
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
kwargs:
|
||||||
|
lake_root: "{{ LAKE }}"
|
||||||
|
market: US
|
||||||
instrument_provider:
|
instrument_provider:
|
||||||
class: tac_qlib.data.providers.LakeInstrumentProvider
|
class: tac_qlib.data.providers.LakeInstrumentProvider
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US, markets: {} }
|
kwargs:
|
||||||
|
lake_root: "{{ LAKE }}"
|
||||||
|
market: US
|
||||||
|
markets: {}
|
||||||
feature_provider:
|
feature_provider:
|
||||||
class: tac_qlib.data.providers.LakeFeatureProvider
|
class: tac_qlib.data.providers.LakeFeatureProvider
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
kwargs:
|
||||||
|
lake_root: "{{ LAKE }}"
|
||||||
|
market: US
|
||||||
|
|
||||||
exp_manager:
|
exp_manager:
|
||||||
class: MLflowExpManager
|
class: MLflowExpManager
|
||||||
module_path: qlib.workflow.expm
|
module_path: qlib.workflow.expm
|
||||||
kwargs: { uri: "sqlite:///mlruns.db", default_exp_name: "tac-rd-exp16-db-ta-sp" }
|
kwargs:
|
||||||
|
uri: "sqlite:///{{ LAKE }}/mlruns.db"
|
||||||
|
default_exp_name: "tac-rd-risk-limit"
|
||||||
|
|
||||||
task:
|
task:
|
||||||
model:
|
model:
|
||||||
@@ -41,6 +68,7 @@ task:
|
|||||||
reg_alpha: 0.1
|
reg_alpha: 0.1
|
||||||
reg_lambda: 1.0
|
reg_lambda: 1.0
|
||||||
seeds: "42,7,2026,99,123"
|
seeds: "42,7,2026,99,123"
|
||||||
|
parallel: 5
|
||||||
|
|
||||||
dataset:
|
dataset:
|
||||||
class: DatasetH
|
class: DatasetH
|
||||||
@@ -52,28 +80,39 @@ task:
|
|||||||
kwargs:
|
kwargs:
|
||||||
instruments: "{{ UNIVERSE }}"
|
instruments: "{{ UNIVERSE }}"
|
||||||
start_time: 2015-01-03
|
start_time: 2015-01-03
|
||||||
end_time: 2026-08-10
|
end_time: 2026-08-14
|
||||||
fit_start_time: 2016-01-04
|
fit_start_time: 2016-01-04
|
||||||
fit_end_time: 2025-09-01
|
fit_end_time: 2025-09-01
|
||||||
freq: day
|
freq: day
|
||||||
lake_root: "{{ LAKE }}"
|
lake_root: "{{ LAKE }}"
|
||||||
market: US
|
market: US
|
||||||
label: "Ref($close,-6)/Ref($close,-1)-1"
|
label: "Ref($close,-6)/Ref($close,-1)-1"
|
||||||
feature_fields: "{{ FEATURES }}"
|
feature_fields: "$open,$high,$low,$close,$vwap,$volume,{{ SP_FIELDS }}"
|
||||||
infer_processors:
|
infer_processors:
|
||||||
- { class: DropAllNaN, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
- class: DropAllNaN
|
||||||
- { class: ProcessInf, kwargs: {} }
|
kwargs: {}
|
||||||
- { class: CSRankNorm, kwargs: {} }
|
- class: ProcessInf
|
||||||
- { class: ZScoreNorm, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
kwargs: {}
|
||||||
- { class: Fillna, kwargs: {} }
|
- class: CSRankNorm
|
||||||
|
kwargs: {}
|
||||||
|
- class: ZScoreNorm
|
||||||
|
kwargs: {}
|
||||||
|
- class: Fillna
|
||||||
|
kwargs: {}
|
||||||
segments:
|
segments:
|
||||||
train: [2016-01-04, 2025-09-01]
|
train: [2016-01-04, 2025-09-01]
|
||||||
valid: [2025-09-03, 2026-01-03]
|
valid: [2025-09-03, 2026-01-03]
|
||||||
test: [2026-01-04, 2026-08-10]
|
test: [2026-01-04, 2026-08-10]
|
||||||
|
|
||||||
record:
|
record:
|
||||||
- { class: SignalRecord, module_path: qlib.workflow.record_temp, kwargs: {} }
|
- class: SignalRecord
|
||||||
- { class: SigAnaRecord, module_path: qlib.workflow.record_temp, kwargs: { ana_long_short: true, ann_scaler: 252 } }
|
module_path: qlib.workflow.record_temp
|
||||||
|
kwargs: {}
|
||||||
|
- class: SigAnaRecord
|
||||||
|
module_path: qlib.workflow.record_temp
|
||||||
|
kwargs:
|
||||||
|
ana_long_short: true
|
||||||
|
ann_scaler: 252
|
||||||
- class: PortAnaRecord
|
- class: PortAnaRecord
|
||||||
module_path: qlib.workflow.record_temp
|
module_path: qlib.workflow.record_temp
|
||||||
kwargs:
|
kwargs:
|
||||||
@@ -81,7 +120,12 @@ task:
|
|||||||
strategy:
|
strategy:
|
||||||
class: TopkDropoutStrategy
|
class: TopkDropoutStrategy
|
||||||
module_path: qlib.contrib.strategy
|
module_path: qlib.contrib.strategy
|
||||||
kwargs: { signal: "<PRED>", topk: 10, n_drop: 2, only_tradable: true, risk_degree: 0.95 }
|
kwargs:
|
||||||
|
signal: "<PRED>"
|
||||||
|
topk: 10
|
||||||
|
n_drop: 2
|
||||||
|
only_tradable: true
|
||||||
|
risk_degree: 0.95
|
||||||
backtest:
|
backtest:
|
||||||
start_time: 2026-01-04
|
start_time: 2026-01-04
|
||||||
end_time: 2026-08-10
|
end_time: 2026-08-10
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
# General stochastic-process feature ablation: no TA, HMM, or OU fields.
|
|
||||||
{%- set LAKE = TAC_LAKE_DIR %}
|
|
||||||
{%- set UNIVERSE = "SPY,QQQ,DIA,IWM,MDY,VTI,VOO,VEA,VWO,VT,EFA,EEM,TLT,IEF,SHY,AGG,BND,LQD,HYG,JNK,EMB,GLD,SLV,USO,UNG,DBA,DBC,XLK,XLF,XLE,XLV,XLI,XLY,XLP,XLU,XLB,XLRE,ARKK,SMH,SOXX,IBB,XBI,ITA,XAR,ICLN,TAN,FDN,IGV,ESPO,REM" %}
|
|
||||||
{%- set FEATURES = "$open,$high,$low,$close,$vwap,$volume,sp_ret,sp_jump_ratio,sp_jump_flag,sp_jump_tail,sp_max_down,sp_max_move,sp_max_up,sp_rv1,sp_rv5,sp_rv22,sp_rv_ac1,sp_rv_cv_22,sp_vol_ratio_1_22,sp_vol_ratio_5_22,sp_trend_slope_5,sp_trend_slope_20,sp_trend_slope_60,sp_logp,sp_hurst_exponent,sp_rskew_5,sp_rskew_22,sp_rkurt_5,sp_rkurt_22,sp_dsv_1,sp_dsv_5,sp_dsv_22,sp_dsv_ratio_1,sp_dsv_ratio_5,sp_dsv_ratio_22,sp_sig_level1_lead,sp_sig_level1_lag,sp_sig_level2_lead_lag,sp_sig_level2_lag_lead,sp_sig_level2_lead_lag_5,sp_sig_level2_lag_lead_5" %}
|
|
||||||
|
|
||||||
qlib_init:
|
|
||||||
provider_uri: "{{ LAKE }}"
|
|
||||||
region: us
|
|
||||||
expression_cache: null
|
|
||||||
dataset_cache: null
|
|
||||||
calendar_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeCalendarProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
instrument_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeInstrumentProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US, markets: {} }
|
|
||||||
feature_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeFeatureProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
exp_manager:
|
|
||||||
class: MLflowExpManager
|
|
||||||
module_path: qlib.workflow.expm
|
|
||||||
kwargs: { uri: "sqlite:///mlruns.db", default_exp_name: "tac-rd-exp22-stochastic-general" }
|
|
||||||
|
|
||||||
task:
|
|
||||||
model:
|
|
||||||
class: RankICEnsembleLGBModel
|
|
||||||
module_path: tac_qlib.contrib.model.rank_ensemble
|
|
||||||
kwargs:
|
|
||||||
loss: mse
|
|
||||||
learning_rate: 0.02
|
|
||||||
num_leaves: 31
|
|
||||||
n_estimators: 3000
|
|
||||||
num_boost_round: 3000
|
|
||||||
early_stopping_rounds: 200
|
|
||||||
min_data_in_leaf: 20
|
|
||||||
lambda_l2: 0.5
|
|
||||||
colsample_bytree: 0.8
|
|
||||||
subsample: 0.8
|
|
||||||
subsample_freq: 1
|
|
||||||
reg_alpha: 0.1
|
|
||||||
reg_lambda: 1.0
|
|
||||||
seeds: "42,7,2026,99,123"
|
|
||||||
|
|
||||||
dataset:
|
|
||||||
class: DatasetH
|
|
||||||
module_path: qlib.data.dataset
|
|
||||||
kwargs:
|
|
||||||
handler:
|
|
||||||
class: TACHandler
|
|
||||||
module_path: tac_qlib.contrib.data.handler
|
|
||||||
kwargs:
|
|
||||||
instruments: "{{ UNIVERSE }}"
|
|
||||||
start_time: 2015-01-03
|
|
||||||
end_time: 2026-08-10
|
|
||||||
fit_start_time: 2016-01-04
|
|
||||||
fit_end_time: 2025-09-01
|
|
||||||
freq: day
|
|
||||||
lake_root: "{{ LAKE }}"
|
|
||||||
market: US
|
|
||||||
label: "Ref($close,-6)/Ref($close,-1)-1"
|
|
||||||
feature_fields: "{{ FEATURES }}"
|
|
||||||
infer_processors:
|
|
||||||
- { class: DropAllNaN, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: ProcessInf, kwargs: {} }
|
|
||||||
- { class: CSRankNorm, kwargs: {} }
|
|
||||||
- { class: ZScoreNorm, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: Fillna, kwargs: {} }
|
|
||||||
segments:
|
|
||||||
train: [2016-01-04, 2025-09-01]
|
|
||||||
valid: [2025-09-03, 2026-01-03]
|
|
||||||
test: [2026-01-04, 2026-08-10]
|
|
||||||
|
|
||||||
record:
|
|
||||||
- { class: SignalRecord, module_path: qlib.workflow.record_temp, kwargs: {} }
|
|
||||||
- { class: SigAnaRecord, module_path: qlib.workflow.record_temp, kwargs: { ana_long_short: true, ann_scaler: 252 } }
|
|
||||||
- class: PortAnaRecord
|
|
||||||
module_path: qlib.workflow.record_temp
|
|
||||||
kwargs:
|
|
||||||
config:
|
|
||||||
strategy:
|
|
||||||
class: TopkDropoutStrategy
|
|
||||||
module_path: qlib.contrib.strategy
|
|
||||||
kwargs: { signal: "<PRED>", topk: 10, n_drop: 2, only_tradable: true, risk_degree: 0.95 }
|
|
||||||
backtest:
|
|
||||||
start_time: 2026-01-04
|
|
||||||
end_time: 2026-08-10
|
|
||||||
account: 1000000
|
|
||||||
benchmark: SPY
|
|
||||||
exchange_kwargs:
|
|
||||||
codes: "{{ UNIVERSE }}"
|
|
||||||
deal_price: $close
|
|
||||||
freq: day
|
|
||||||
open_cost: 0.0005
|
|
||||||
close_cost: 0.0015
|
|
||||||
min_cost: 5.0
|
|
||||||
risk_analysis_freq: 1d
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
# Exact compact stochastic feature set requested for a new run in MLflow exp 25.
|
|
||||||
{%- set LAKE = TAC_LAKE_DIR %}
|
|
||||||
{%- set UNIVERSE = "SPY,QQQ,DIA,IWM,MDY,VTI,VOO,VEA,VWO,VT,EFA,EEM,TLT,IEF,SHY,AGG,BND,LQD,HYG,JNK,EMB,GLD,SLV,USO,UNG,DBA,DBC,XLK,XLF,XLE,XLV,XLI,XLY,XLP,XLU,XLB,XLRE,ARKK,SMH,SOXX,IBB,XBI,ITA,XAR,ICLN,TAN,FDN,IGV,ESPO,REM" %}
|
|
||||||
{%- set FEATURES = "$open,$high,$low,$close,$vwap,$volume,sp_ret,sp_jump_ratio,sp_jump_flag,sp_jump_tail,sp_max_move,sp_rv1,sp_rv5,sp_rv22,sp_vol_ratio_5_22,sp_vol_ratio_1_22,sp_trend_slope_5,sp_trend_slope_20,sp_trend_slope_60,sp_logp,sp_hurst_exponent,sp_sig_level1_lead,sp_sig_level1_lag,sp_sig_level2_lead_lag,sp_sig_level2_lag_lead" %}
|
|
||||||
|
|
||||||
qlib_init:
|
|
||||||
provider_uri: "{{ LAKE }}"
|
|
||||||
region: us
|
|
||||||
expression_cache: null
|
|
||||||
dataset_cache: null
|
|
||||||
calendar_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeCalendarProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
instrument_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeInstrumentProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US, markets: {} }
|
|
||||||
feature_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeFeatureProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
exp_manager:
|
|
||||||
class: MLflowExpManager
|
|
||||||
module_path: qlib.workflow.expm
|
|
||||||
kwargs: { uri: "sqlite:///mlruns.db", default_exp_name: "tac-rd-exp22-stochastic-general" }
|
|
||||||
|
|
||||||
task:
|
|
||||||
model:
|
|
||||||
class: RankICEnsembleLGBModel
|
|
||||||
module_path: tac_qlib.contrib.model.rank_ensemble
|
|
||||||
kwargs:
|
|
||||||
loss: mse
|
|
||||||
learning_rate: 0.02
|
|
||||||
num_leaves: 31
|
|
||||||
n_estimators: 3000
|
|
||||||
num_boost_round: 3000
|
|
||||||
early_stopping_rounds: 200
|
|
||||||
min_data_in_leaf: 20
|
|
||||||
lambda_l2: 0.5
|
|
||||||
colsample_bytree: 0.8
|
|
||||||
subsample: 0.8
|
|
||||||
subsample_freq: 1
|
|
||||||
reg_alpha: 0.1
|
|
||||||
reg_lambda: 1.0
|
|
||||||
seeds: "42,7,2026,99,123"
|
|
||||||
|
|
||||||
dataset:
|
|
||||||
class: DatasetH
|
|
||||||
module_path: qlib.data.dataset
|
|
||||||
kwargs:
|
|
||||||
handler:
|
|
||||||
class: TACHandler
|
|
||||||
module_path: tac_qlib.contrib.data.handler
|
|
||||||
kwargs:
|
|
||||||
instruments: "{{ UNIVERSE }}"
|
|
||||||
start_time: 2015-01-03
|
|
||||||
end_time: 2026-08-10
|
|
||||||
fit_start_time: 2016-01-04
|
|
||||||
fit_end_time: 2025-09-01
|
|
||||||
freq: day
|
|
||||||
lake_root: "{{ LAKE }}"
|
|
||||||
market: US
|
|
||||||
label: "Ref($close,-6)/Ref($close,-1)-1"
|
|
||||||
feature_fields: "{{ FEATURES }}"
|
|
||||||
infer_processors:
|
|
||||||
- { class: DropAllNaN, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: ProcessInf, kwargs: {} }
|
|
||||||
- { class: CSRankNorm, kwargs: {} }
|
|
||||||
- { class: ZScoreNorm, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: Fillna, kwargs: {} }
|
|
||||||
segments:
|
|
||||||
train: [2016-01-04, 2025-09-01]
|
|
||||||
valid: [2025-09-03, 2026-01-03]
|
|
||||||
test: [2026-01-04, 2026-08-10]
|
|
||||||
|
|
||||||
record:
|
|
||||||
- { class: SignalRecord, module_path: qlib.workflow.record_temp, kwargs: {} }
|
|
||||||
- { class: SigAnaRecord, module_path: qlib.workflow.record_temp, kwargs: { ana_long_short: true, ann_scaler: 252 } }
|
|
||||||
- class: PortAnaRecord
|
|
||||||
module_path: qlib.workflow.record_temp
|
|
||||||
kwargs:
|
|
||||||
config:
|
|
||||||
strategy:
|
|
||||||
class: TopkDropoutStrategy
|
|
||||||
module_path: qlib.contrib.strategy
|
|
||||||
kwargs: { signal: "<PRED>", topk: 10, n_drop: 2, only_tradable: true, risk_degree: 0.95 }
|
|
||||||
backtest:
|
|
||||||
start_time: 2026-01-04
|
|
||||||
end_time: 2026-08-10
|
|
||||||
account: 1000000
|
|
||||||
benchmark: SPY
|
|
||||||
exchange_kwargs:
|
|
||||||
codes: "{{ UNIVERSE }}"
|
|
||||||
deal_price: $close
|
|
||||||
freq: day
|
|
||||||
open_cost: 0.0005
|
|
||||||
close_cost: 0.0015
|
|
||||||
min_cost: 5.0
|
|
||||||
risk_analysis_freq: 1d
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
# Compact stochastic feature set with reduced turnover: n_drop=1 instead of 2.
|
|
||||||
# Same setup as exp24 (compact baseline) but replacing the TopkDropout n_drop 2 with 1.
|
|
||||||
{%- set LAKE = TAC_LAKE_DIR %}
|
|
||||||
{%- set UNIVERSE = "SPY,QQQ,DIA,IWM,MDY,VTI,VOO,VEA,VWO,VT,EFA,EEM,TLT,IEF,SHY,AGG,BND,LQD,HYG,JNK,EMB,GLD,SLV,USO,UNG,DBA,DBC,XLK,XLF,XLE,XLV,XLI,XLY,XLP,XLU,XLB,XLRE,ARKK,SMH,SOXX,IBB,XBI,ITA,XAR,ICLN,TAN,FDN,IGV,ESPO,REM" %}
|
|
||||||
{%- set FEATURES = "$open,$high,$low,$close,$vwap,$volume,sp_ret,sp_jump_ratio,sp_jump_flag,sp_jump_tail,sp_max_move,sp_rv1,sp_rv5,sp_rv22,sp_vol_ratio_5_22,sp_vol_ratio_1_22,sp_trend_slope_5,sp_trend_slope_20,sp_trend_slope_60,sp_logp,sp_hurst_exponent,sp_sig_level1_lead,sp_sig_level1_lag,sp_sig_level2_lead_lag,sp_sig_level2_lag_lead" %}
|
|
||||||
|
|
||||||
qlib_init:
|
|
||||||
provider_uri: "{{ LAKE }}"
|
|
||||||
region: us
|
|
||||||
expression_cache: null
|
|
||||||
dataset_cache: null
|
|
||||||
calendar_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeCalendarProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
instrument_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeInstrumentProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US, markets: {} }
|
|
||||||
feature_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeFeatureProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
exp_manager:
|
|
||||||
class: MLflowExpManager
|
|
||||||
module_path: qlib.workflow.expm
|
|
||||||
kwargs: { uri: "sqlite:///mlruns.db", default_exp_name: "tac-rd-exp22-stochastic-general" }
|
|
||||||
|
|
||||||
task:
|
|
||||||
model:
|
|
||||||
class: RankICEnsembleLGBModel
|
|
||||||
module_path: tac_qlib.contrib.model.rank_ensemble
|
|
||||||
kwargs:
|
|
||||||
loss: mse
|
|
||||||
learning_rate: 0.02
|
|
||||||
num_leaves: 31
|
|
||||||
n_estimators: 3000
|
|
||||||
num_boost_round: 3000
|
|
||||||
early_stopping_rounds: 200
|
|
||||||
min_data_in_leaf: 20
|
|
||||||
lambda_l2: 0.5
|
|
||||||
colsample_bytree: 0.8
|
|
||||||
subsample: 0.8
|
|
||||||
subsample_freq: 1
|
|
||||||
reg_alpha: 0.1
|
|
||||||
reg_lambda: 1.0
|
|
||||||
seeds: "42,7,2026,99,123"
|
|
||||||
|
|
||||||
dataset:
|
|
||||||
class: DatasetH
|
|
||||||
module_path: qlib.data.dataset
|
|
||||||
kwargs:
|
|
||||||
handler:
|
|
||||||
class: TACHandler
|
|
||||||
module_path: tac_qlib.contrib.data.handler
|
|
||||||
kwargs:
|
|
||||||
instruments: "{{ UNIVERSE }}"
|
|
||||||
start_time: 2015-01-03
|
|
||||||
end_time: 2026-08-10
|
|
||||||
fit_start_time: 2016-01-04
|
|
||||||
fit_end_time: 2025-09-01
|
|
||||||
freq: day
|
|
||||||
lake_root: "{{ LAKE }}"
|
|
||||||
market: US
|
|
||||||
label: "Ref($close,-6)/Ref($close,-1)-1"
|
|
||||||
feature_fields: "{{ FEATURES }}"
|
|
||||||
infer_processors:
|
|
||||||
- { class: DropAllNaN, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: ProcessInf, kwargs: {} }
|
|
||||||
- { class: CSRankNorm, kwargs: {} }
|
|
||||||
- { class: ZScoreNorm, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: Fillna, kwargs: {} }
|
|
||||||
segments:
|
|
||||||
train: [2016-01-04, 2025-09-01]
|
|
||||||
valid: [2025-09-03, 2026-01-03]
|
|
||||||
test: [2026-01-04, 2026-08-10]
|
|
||||||
|
|
||||||
record:
|
|
||||||
- { class: SignalRecord, module_path: qlib.workflow.record_temp, kwargs: {} }
|
|
||||||
- { class: SigAnaRecord, module_path: qlib.workflow.record_temp, kwargs: { ana_long_short: true, ann_scaler: 252 } }
|
|
||||||
- class: PortAnaRecord
|
|
||||||
module_path: qlib.workflow.record_temp
|
|
||||||
kwargs:
|
|
||||||
config:
|
|
||||||
strategy:
|
|
||||||
class: TopkDropoutStrategy
|
|
||||||
module_path: qlib.contrib.strategy
|
|
||||||
kwargs: { signal: "<PRED>", topk: 10, n_drop: 1, only_tradable: true, risk_degree: 0.95 }
|
|
||||||
backtest:
|
|
||||||
start_time: 2026-01-04
|
|
||||||
end_time: 2026-08-10
|
|
||||||
account: 1000000
|
|
||||||
benchmark: SPY
|
|
||||||
exchange_kwargs:
|
|
||||||
codes: "{{ UNIVERSE }}"
|
|
||||||
deal_price: $close
|
|
||||||
freq: day
|
|
||||||
open_cost: 0.0005
|
|
||||||
close_cost: 0.0015
|
|
||||||
min_cost: 5.0
|
|
||||||
risk_analysis_freq: 1d
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
# M2 isolation run: base compact set + risk-adjusted drift sp_sharpe_22.
|
|
||||||
# Exact copy of exp26 (reference: expId=25 run=21afc6afdb674a399b59dd76c97628ce)
|
|
||||||
# except feature_fields. 5-seed ensemble.
|
|
||||||
{%- set LAKE = TAC_LAKE_DIR %}
|
|
||||||
{%- set UNIVERSE = "SPY,QQQ,DIA,IWM,MDY,VTI,VOO,VEA,VWO,VT,EFA,EEM,TLT,IEF,SHY,AGG,BND,LQD,HYG,JNK,EMB,GLD,SLV,USO,UNG,DBA,DBC,XLK,XLF,XLE,XLV,XLI,XLY,XLP,XLU,XLB,XLRE,ARKK,SMH,SOXX,IBB,XBI,ITA,XAR,ICLN,TAN,FDN,IGV,ESPO,REM" %}
|
|
||||||
{%- set FEATURES = "$open,$high,$low,$close,$vwap,$volume,sp_ret,sp_jump_ratio,sp_jump_flag,sp_jump_tail,sp_max_move,sp_rv1,sp_rv5,sp_rv22,sp_vol_ratio_5_22,sp_vol_ratio_1_22,sp_trend_slope_5,sp_trend_slope_20,sp_trend_slope_60,sp_logp,sp_hurst_exponent,sp_sig_level1_lead,sp_sig_level1_lag,sp_sig_level2_lead_lag,sp_sig_level2_lag_lead,sp_sharpe_22" %}
|
|
||||||
|
|
||||||
qlib_init:
|
|
||||||
provider_uri: "{{ LAKE }}"
|
|
||||||
region: us
|
|
||||||
expression_cache: null
|
|
||||||
dataset_cache: null
|
|
||||||
calendar_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeCalendarProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
instrument_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeInstrumentProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US, markets: {} }
|
|
||||||
feature_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeFeatureProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
exp_manager:
|
|
||||||
class: MLflowExpManager
|
|
||||||
module_path: qlib.workflow.expm
|
|
||||||
kwargs: { uri: "sqlite:///mlruns.db", default_exp_name: "tac-rd-exp30-m2-sharpe" }
|
|
||||||
|
|
||||||
task:
|
|
||||||
model:
|
|
||||||
class: RankICEnsembleLGBModel
|
|
||||||
module_path: tac_qlib.contrib.model.rank_ensemble
|
|
||||||
kwargs:
|
|
||||||
loss: mse
|
|
||||||
learning_rate: 0.02
|
|
||||||
num_leaves: 31
|
|
||||||
n_estimators: 3000
|
|
||||||
num_boost_round: 3000
|
|
||||||
early_stopping_rounds: 200
|
|
||||||
min_data_in_leaf: 20
|
|
||||||
lambda_l2: 0.5
|
|
||||||
colsample_bytree: 0.8
|
|
||||||
subsample: 0.8
|
|
||||||
subsample_freq: 1
|
|
||||||
reg_alpha: 0.1
|
|
||||||
reg_lambda: 1.0
|
|
||||||
seeds: "42,7,2026,99,123"
|
|
||||||
|
|
||||||
dataset:
|
|
||||||
class: DatasetH
|
|
||||||
module_path: qlib.data.dataset
|
|
||||||
kwargs:
|
|
||||||
handler:
|
|
||||||
class: TACHandler
|
|
||||||
module_path: tac_qlib.contrib.data.handler
|
|
||||||
kwargs:
|
|
||||||
instruments: "{{ UNIVERSE }}"
|
|
||||||
start_time: 2015-01-03
|
|
||||||
end_time: 2026-08-10
|
|
||||||
fit_start_time: 2016-01-04
|
|
||||||
fit_end_time: 2025-09-01
|
|
||||||
freq: day
|
|
||||||
lake_root: "{{ LAKE }}"
|
|
||||||
market: US
|
|
||||||
label: "Ref($close,-6)/Ref($close,-1)-1"
|
|
||||||
feature_fields: "{{ FEATURES }}"
|
|
||||||
infer_processors:
|
|
||||||
- { class: DropAllNaN, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: ProcessInf, kwargs: {} }
|
|
||||||
- { class: CSRankNorm, kwargs: {} }
|
|
||||||
- { class: ZScoreNorm, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: Fillna, kwargs: {} }
|
|
||||||
segments:
|
|
||||||
train: [2016-01-04, 2025-09-01]
|
|
||||||
valid: [2025-09-03, 2026-01-03]
|
|
||||||
test: [2026-01-04, 2026-08-10]
|
|
||||||
|
|
||||||
record:
|
|
||||||
- { class: SignalRecord, module_path: qlib.workflow.record_temp, kwargs: {} }
|
|
||||||
- { class: SigAnaRecord, module_path: qlib.workflow.record_temp, kwargs: { ana_long_short: true, ann_scaler: 252 } }
|
|
||||||
- class: PortAnaRecord
|
|
||||||
module_path: qlib.workflow.record_temp
|
|
||||||
kwargs:
|
|
||||||
config:
|
|
||||||
strategy:
|
|
||||||
class: TopkDropoutStrategy
|
|
||||||
module_path: qlib.contrib.strategy
|
|
||||||
kwargs: { signal: "<PRED>", topk: 10, n_drop: 1, only_tradable: true, risk_degree: 0.95 }
|
|
||||||
backtest:
|
|
||||||
start_time: 2026-01-04
|
|
||||||
end_time: 2026-08-10
|
|
||||||
account: 1000000
|
|
||||||
benchmark: SPY
|
|
||||||
exchange_kwargs:
|
|
||||||
codes: "{{ UNIVERSE }}"
|
|
||||||
deal_price: $close
|
|
||||||
freq: day
|
|
||||||
open_cost: 0.0005
|
|
||||||
close_cost: 0.0015
|
|
||||||
min_cost: 5.0
|
|
||||||
risk_analysis_freq: 1d
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
# M3 isolation run: base compact set + GARCH(1,1) vol-regime trio.
|
|
||||||
# Exact copy of exp26 (reference: expId=25 run=21afc6afdb674a399b59dd76c97628ce)
|
|
||||||
# except feature_fields. 5-seed ensemble.
|
|
||||||
{%- set LAKE = TAC_LAKE_DIR %}
|
|
||||||
{%- set UNIVERSE = "SPY,QQQ,DIA,IWM,MDY,VTI,VOO,VEA,VWO,VT,EFA,EEM,TLT,IEF,SHY,AGG,BND,LQD,HYG,JNK,EMB,GLD,SLV,USO,UNG,DBA,DBC,XLK,XLF,XLE,XLV,XLI,XLY,XLP,XLU,XLB,XLRE,ARKK,SMH,SOXX,IBB,XBI,ITA,XAR,ICLN,TAN,FDN,IGV,ESPO,REM" %}
|
|
||||||
{%- set FEATURES = "$open,$high,$low,$close,$vwap,$volume,sp_ret,sp_jump_ratio,sp_jump_flag,sp_jump_tail,sp_max_move,sp_rv1,sp_rv5,sp_rv22,sp_vol_ratio_5_22,sp_vol_ratio_1_22,sp_trend_slope_5,sp_trend_slope_20,sp_trend_slope_60,sp_logp,sp_hurst_exponent,sp_sig_level1_lead,sp_sig_level1_lag,sp_sig_level2_lead_lag,sp_sig_level2_lag_lead,sp_garch_cond_var,sp_garch_persistence,sp_garch_std_resid" %}
|
|
||||||
|
|
||||||
qlib_init:
|
|
||||||
provider_uri: "{{ LAKE }}"
|
|
||||||
region: us
|
|
||||||
expression_cache: null
|
|
||||||
dataset_cache: null
|
|
||||||
calendar_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeCalendarProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
instrument_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeInstrumentProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US, markets: {} }
|
|
||||||
feature_provider:
|
|
||||||
class: tac_qlib.data.providers.LakeFeatureProvider
|
|
||||||
kwargs: { lake_root: "{{ LAKE }}", market: US }
|
|
||||||
exp_manager:
|
|
||||||
class: MLflowExpManager
|
|
||||||
module_path: qlib.workflow.expm
|
|
||||||
kwargs: { uri: "sqlite:///mlruns.db", default_exp_name: "tac-rd-exp31-m3-garch" }
|
|
||||||
|
|
||||||
task:
|
|
||||||
model:
|
|
||||||
class: RankICEnsembleLGBModel
|
|
||||||
module_path: tac_qlib.contrib.model.rank_ensemble
|
|
||||||
kwargs:
|
|
||||||
loss: mse
|
|
||||||
learning_rate: 0.02
|
|
||||||
num_leaves: 31
|
|
||||||
n_estimators: 3000
|
|
||||||
num_boost_round: 3000
|
|
||||||
early_stopping_rounds: 200
|
|
||||||
min_data_in_leaf: 20
|
|
||||||
lambda_l2: 0.5
|
|
||||||
colsample_bytree: 0.8
|
|
||||||
subsample: 0.8
|
|
||||||
subsample_freq: 1
|
|
||||||
reg_alpha: 0.1
|
|
||||||
reg_lambda: 1.0
|
|
||||||
seeds: "42,7,2026,99,123"
|
|
||||||
|
|
||||||
dataset:
|
|
||||||
class: DatasetH
|
|
||||||
module_path: qlib.data.dataset
|
|
||||||
kwargs:
|
|
||||||
handler:
|
|
||||||
class: TACHandler
|
|
||||||
module_path: tac_qlib.contrib.data.handler
|
|
||||||
kwargs:
|
|
||||||
instruments: "{{ UNIVERSE }}"
|
|
||||||
start_time: 2015-01-03
|
|
||||||
end_time: 2026-08-10
|
|
||||||
fit_start_time: 2016-01-04
|
|
||||||
fit_end_time: 2025-09-01
|
|
||||||
freq: day
|
|
||||||
lake_root: "{{ LAKE }}"
|
|
||||||
market: US
|
|
||||||
label: "Ref($close,-6)/Ref($close,-1)-1"
|
|
||||||
feature_fields: "{{ FEATURES }}"
|
|
||||||
infer_processors:
|
|
||||||
- { class: DropAllNaN, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: ProcessInf, kwargs: {} }
|
|
||||||
- { class: CSRankNorm, kwargs: {} }
|
|
||||||
- { class: ZScoreNorm, kwargs: { fit_start_time: "2016-01-04", fit_end_time: "2025-09-01" } }
|
|
||||||
- { class: Fillna, kwargs: {} }
|
|
||||||
segments:
|
|
||||||
train: [2016-01-04, 2025-09-01]
|
|
||||||
valid: [2025-09-03, 2026-01-03]
|
|
||||||
test: [2026-01-04, 2026-08-10]
|
|
||||||
|
|
||||||
record:
|
|
||||||
- { class: SignalRecord, module_path: qlib.workflow.record_temp, kwargs: {} }
|
|
||||||
- { class: SigAnaRecord, module_path: qlib.workflow.record_temp, kwargs: { ana_long_short: true, ann_scaler: 252 } }
|
|
||||||
- class: PortAnaRecord
|
|
||||||
module_path: qlib.workflow.record_temp
|
|
||||||
kwargs:
|
|
||||||
config:
|
|
||||||
strategy:
|
|
||||||
class: TopkDropoutStrategy
|
|
||||||
module_path: qlib.contrib.strategy
|
|
||||||
kwargs: { signal: "<PRED>", topk: 10, n_drop: 1, only_tradable: true, risk_degree: 0.95 }
|
|
||||||
backtest:
|
|
||||||
start_time: 2026-01-04
|
|
||||||
end_time: 2026-08-10
|
|
||||||
account: 1000000
|
|
||||||
benchmark: SPY
|
|
||||||
exchange_kwargs:
|
|
||||||
codes: "{{ UNIVERSE }}"
|
|
||||||
deal_price: $close
|
|
||||||
freq: day
|
|
||||||
open_cost: 0.0005
|
|
||||||
close_cost: 0.0015
|
|
||||||
min_cost: 5.0
|
|
||||||
risk_analysis_freq: 1d
|
|
||||||
Reference in New Issue
Block a user