Improve Trader V4 training pipeline

Align entry labels with max future edge, tune direction labeling, and harden regression evaluation.

Add training diagnostics, price-plan search, feature screening, and nonlinear benchmark scripts.
This commit is contained in:
Codex
2026-06-27 19:57:29 +08:00
parent e58e4a5572
commit 9acb3460a1
27 changed files with 2059 additions and 341 deletions
+8 -8
View File
@@ -12,14 +12,14 @@ def main() -> None:
parser = argparse.ArgumentParser()
add_common_args(parser)
parser.add_argument("--replay-path", type=Path)
parser.add_argument("--fit-inner-start", default="2025-06-20")
parser.add_argument("--fit-inner-end", default="2026-01-15")
parser.add_argument("--tune-inner-start", default="2026-01-16")
parser.add_argument("--tune-inner-end", default="2026-02-28")
parser.add_argument("--validation-locked-start", default="2026-03-01")
parser.add_argument("--validation-locked-end", default="2026-04-30")
parser.add_argument("--latest-stress-start", default="2026-05-01")
parser.add_argument("--latest-stress-end", default="2026-06-19")
parser.add_argument("--fit-inner-start", default="2025-05-01")
parser.add_argument("--fit-inner-end", default="2026-01-31")
parser.add_argument("--tune-inner-start", default="2026-02-01")
parser.add_argument("--tune-inner-end", default="2026-03-15")
parser.add_argument("--validation-locked-start", default="2026-03-16")
parser.add_argument("--validation-locked-end", default="2026-05-15")
parser.add_argument("--latest-stress-start", default="2026-05-16")
parser.add_argument("--latest-stress-end", default="2026-06-25")
parser.add_argument("--gap-minutes", type=int, default=60)
parser.add_argument("--fold-count", type=int, default=3)
args = parser.parse_args()
+2 -1
View File
@@ -5,7 +5,7 @@ from pathlib import Path
import _bootstrap # noqa: F401
from trader_training.features import build_feature_frame
from trader_training.io_utils import add_common_args, setup_logging
from trader_training.io_utils import DEFAULT_RAW_ROOT, add_common_args, setup_logging
def main() -> None:
@@ -13,6 +13,7 @@ def main() -> None:
add_common_args(parser)
parser.add_argument("--replay-path", type=Path)
parser.add_argument("--split-manifest-path", type=Path)
parser.add_argument("--raw-root", type=Path, default=DEFAULT_RAW_ROOT)
parser.add_argument("--allow-incomplete-days", action="store_true")
args = parser.parse_args()
setup_logging()
@@ -0,0 +1,19 @@
from __future__ import annotations
import argparse
import _bootstrap # noqa: F401
from trader_training.diagnostics import diagnose_training_run
from trader_training.io_utils import add_common_args, setup_logging
def main() -> None:
parser = argparse.ArgumentParser()
add_common_args(parser)
args = parser.parse_args()
setup_logging()
diagnose_training_run(args)
if __name__ == "__main__":
main()
+35
View File
@@ -0,0 +1,35 @@
from __future__ import annotations
import argparse
from pathlib import Path
import _bootstrap # noqa: F401
from trader_training.io_utils import add_common_args, setup_logging
from trader_training.price_plan_search import search_price_plans
def _float_tuple(value: str) -> tuple[float, ...]:
return tuple(float(item.strip()) for item in value.split(",") if item.strip())
def _int_tuple(value: str) -> tuple[int, ...]:
return tuple(int(item.strip()) for item in value.split(",") if item.strip())
def main() -> None:
parser = argparse.ArgumentParser()
add_common_args(parser)
parser.add_argument("--feature-path", type=Path)
parser.add_argument("--replay-path", type=Path)
parser.add_argument("--label-config-path", type=Path)
parser.add_argument("--cost-config-path", type=Path)
parser.add_argument("--horizons", type=_int_tuple)
parser.add_argument("--targets", type=_float_tuple)
parser.add_argument("--stops", type=_float_tuple)
args = parser.parse_args()
setup_logging()
search_price_plans(args)
if __name__ == "__main__":
main()
@@ -0,0 +1,20 @@
from __future__ import annotations
import argparse
import _bootstrap # noqa: F401
from trader_training.entry_feature_screen import screen_entry_features
from trader_training.io_utils import add_common_args, setup_logging
def main() -> None:
parser = argparse.ArgumentParser()
add_common_args(parser)
parser.add_argument("--min-bucket-rows", type=int, default=300)
args = parser.parse_args()
setup_logging()
screen_entry_features(args)
if __name__ == "__main__":
main()
@@ -0,0 +1,21 @@
from __future__ import annotations
import argparse
import logging
from pathlib import Path
import _bootstrap # noqa: F401
from trader_training.nonlinear_benchmark import benchmark_nonlinear_models
def main() -> None:
parser = argparse.ArgumentParser(description="Run diagnostic nonlinear benchmarks for Direction and Entry.")
parser.add_argument("--run-id", required=True)
parser.add_argument("--data-root", required=True, type=Path)
args = parser.parse_args()
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s event=%(message)s")
benchmark_nonlinear_models(args)
if __name__ == "__main__":
main()