LEANのストラテジー間パリティ監査
コード Machine Learning for Trading
サマリー
このノートブックは、保持された実際のストラテジーの実行結果と、それに対応するML4Tバックテストのプロファイルを比較する監査から、LEANエンジンの結果を切り分けています。対応する4つのワークロードとして、ETF配分、暗号資産無期限先物の資金調達、USD建てのFX配分、US株式パネルを特定しています。凍結されたCME先物バンドルは、対応するネイティブLEANサブスクリプションの作成に必要な日付付き契約チェーンとロールマップがないため、対象外です。比較では、約定、評価額、タイムスタンプの一致、株式価値と最終価値の差、ネガティブコントロールの検出を報告します。
別の計測セクションでは、ウォームアップとプロセスを分離したサンプルを用いて、エンジン呼び出しのみを測定しています。データ読み込み、推論、準備、レポート作成は測定区間に含まれません。このノートブックは、計測に関する結論を、この監査で固定したバージョン、データバンドル、測定境界に明示的に限定しています。また、合成ストレステストの結果と実際のストラテジーとの同等性は分けて扱っています。提示されたテキストでは対応行のステータス確認が成功したことが示されていますが、監査の基礎となる数値は含まれていないため、より広範な性能の主張を裏付けるものではありません。
主なアイデア
- パリティ監査では、共通の凍結入力を使い、保持されたLEANの結果と対応するバックテストプロファイルを比較します。
- 提供されたバンドルでは、この比較にETF、暗号資産無期限先物、USD建てのFX、US株式の各ワークロードが対応しています。
- バンドルに日付付き契約とロールマップがないため、CME先物のワークロードは除外されています。
- パリティは、約定、評価額とタイムスタンプ、株式価値の差、最終価値、ネガティブコントロールの検出によって評価します。
- エンジンのみの計測では周辺のワークフロー工程を除外し、指定されたバージョンとバンドルに限って適用します。
タグ
全文
# 15_lean_engine_parity.py
```py
# ---
# jupyter:
# jupytext:
# cell_metadata_filter: tags,-all
# text_representation:
# extension: .py
# format_name: percent
# format_version: '1.3'
# jupytext_version: 1.19.3
# kernelspec:
# display_name: Python 3
# language: python
# name: python3
# ---
# %% [markdown]
# # LEAN Parity on Current Case-Study Strategies
#
# This notebook isolates the LEAN rows from the current real-strategy audit. It uses retained results
# generated by the native LEAN engine and the matching ML4T Backtest profiles. The shared inputs are
# frozen before engine execution.
#
# **Learning objectives**
#
# - Identify which selected asset classes are valid LEAN comparisons
# - Read LEAN parity across fills, valuations, and terminal value
# - Interpret LEAN engine-only timing on the measured strategies
# - Keep synthetic stress evidence separate from real-strategy equivalence
#
# **Book reference**: Chapter 16, Section 16.3
# %% [markdown]
# ## Setup
# %%
"""Current LEAN parity evidence."""
import json
import polars as pl
from IPython.display import Markdown, display
from utils.paths import get_chapter_dir
# %% tags=["parameters"]
# Production defaults - Papermill injects overrides after this cell
ROUND_SECONDS = 3
# %% tags=["results"]
AUDIT_PATH = get_chapter_dir(16) / "resources" / "framework_parity_audit.json"
audit = json.loads(AUDIT_PATH.read_text(encoding="utf-8"))
lean = audit["frameworks"]["lean"]
LEAN_NAME = f"{lean['display_name']} {lean['version']}"
CASE_NAMES = {
"etfs": "ETF allocation",
"cme_futures": "CME futures",
"crypto_perps_funding": "Crypto perpetual funding",
"fx_pairs": "FX allocation (USD-quoted pairs)",
"us_equities_panel": "US equity panel",
}
# %% tags=["results"]
display(Markdown(f"**Pinned engine:** {LEAN_NAME} with ML4T profile `{lean['profile']}`"))
# %% [markdown]
# ## 1. Supported real strategies
#
# LEAN is required for the ETF, crypto-perpetual, USD-quoted foreign-exchange, and US equity-panel
# workloads. The CME row is unsupported for this particular frozen bundle: it contains continuous
# root prices but lacks the dated contract chain and roll map needed to construct a native LEAN
# futures subscription.
# %% tags=["results"]
lean_results = (
pl.DataFrame(audit["real_strategy_records"])
.filter(pl.col("framework") == "lean")
.with_columns(pl.col("case_study").replace_strict(CASE_NAMES).alias("strategy"))
.select(
"strategy",
"status",
"fills",
"valuations",
"valuation_timestamps_match",
"equity_gap",
"equity_raw_gap",
"terminal_gap",
"terminal_raw_gap",
"negative_control_detected",
)
)
assert lean_results.height == 4
assert lean_results["status"].to_list() == ["pass"] * 4
assert lean_results["valuation_timestamps_match"].all()
assert lean_results["negative_control_detected"].all()
display(lean_results)
# %% tags=["results"]
lean_unsupported = (
pl.DataFrame(audit["unsupported_records"])
.filter(pl.col("framework") == "lean")
.with_columns(pl.col("case_study").replace_strict(CASE_NAMES).alias("strategy"))
.select("strategy", "reason")
)
display(lean_unsupported)
# %% [markdown]
# The table reports the complete fill and valuation counts for each supported workload. LEAN uses
# native equity, crypto-future, and foreign-exchange securities. The audit does not convert the
# continuous CME roots into a different instrument merely to add a LEAN row.
# %% [markdown]
# ## 2. Engine-only timing
#
# The timer starts immediately before the engine call and stops when it returns. One warmup and ten
# process-isolated samples are used. Input loading, model inference, target construction, adapter
# preparation, result extraction, and reporting are outside the timed region.
# %% tags=["results"]
lean_timing = (
pl.DataFrame(audit["performance_records"])
.filter(pl.col("framework") == "lean")
.with_columns(
pl.col("case_study").replace_strict(CASE_NAMES).alias("strategy"),
pl.col("framework_median_seconds").round(ROUND_SECONDS).alias("lean_seconds"),
pl.col("ml4t_median_seconds").round(ROUND_SECONDS).alias("ml4t_seconds"),
pl.col("framework_to_ml4t_ratio").round(2).alias("lean_div_ml4t"),
)
.select("strategy", "lean_seconds", "ml4t_seconds", "lean_div_ml4t")
)
display(lean_timing)
# %% [markdown]
# The timing result applies to these pinned versions, bundles, and engine boundaries. It is not a
# general LEAN performance claim.
# %% [markdown]
# ## 3. Synthetic stress remains diagnostic
# %% tags=["results"]
lean_stress = (
pl.DataFrame(audit["synthetic_stress"]["records"])
.filter(pl.col("framework") == "lean")
.select("intents", "fills", "trades", "terminal_value", "status")
)
display(lean_stress)
# %% [markdown]
# The retained stress row tests scale and the calibrated LEAN profile on generated inputs. The
# supported rows above provide the real-data evidence.
```出典を明記したうえで、ライセンスに従って全文を掲載しています。 ライセンス: MIT
この要約は原文をもとにStratmillのリサーチエージェントが作成したもので、出典の複製ではありません。