Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ Canonical profile names were simplified in this branch. The old names are not ke

These profiles use platform-provided `market_history` and do not require a separate snapshot artifact before the strategy entrypoint can produce target weights.

The combo wrapper `hk_equity_combo` is retained for research/orchestration only and should not be treated as a runtime-enabled profile.

| Profile | Name | Input | Benchmark | Current role |
| --- | --- | --- | --- | --- |
| `hk_global_etf_tactical_rotation` | HK Global ETF Tactical Rotation | `market_history` | `02800` | Retained HK ETF runtime profile with broader ETF exposure and heavier product checks. |
Expand Down
4 changes: 2 additions & 2 deletions src/hk_equity_strategies/catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
)
HK_SNAPSHOT_BACKED_PROFILES = frozenset({HK_LOW_VOL_DIVIDEND_QUALITY_SNAPSHOT_PROFILE})
HK_EXTERNAL_SNAPSHOT_SCAFFOLD_PROFILES = frozenset()
HK_RESEARCH_BACKTEST_ONLY_PROFILES = frozenset()
HK_RESEARCH_BACKTEST_ONLY_PROFILES = frozenset({HK_EQUITY_COMBO_PROFILE})

STRATEGY_PLATFORM_COMPATIBILITY: dict[str, frozenset[str]] = {
HK_GLOBAL_ETF_TACTICAL_ROTATION_PROFILE: frozenset({"ibkr", "longbridge"}),
Expand Down Expand Up @@ -190,7 +190,7 @@ def _build_strategy_definition(
asset_scope="hk_equity_combo",
benchmark="2800",
role="hk_equity_combo",
status="runtime_enabled",
status="research_backtest_only",
),
}

Expand Down
18 changes: 17 additions & 1 deletion src/hk_equity_strategies/live_enablement_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,23 @@ def _common_platform_evidence_requirements(profile: str) -> tuple[str, ...]:
),
}

RESEARCH_ONLY_PROFILES: dict[str, dict[str, object]] = {}
RESEARCH_ONLY_PROFILES: dict[str, dict[str, object]] = {
"hk_equity_combo": {
"display_name": "HK Equity Combo",
"profile_type": "research_backtest_only",
"reason": "Retained combo wrapper for research comparison only; not part of the HK runtime allowlist.",
"required_next_evidence": (
"long_history_backtest_replay",
"platform_dry_run_order_preview",
"live_enablement_review_pack",
),
"research_evidence_urls": (
"docs/research/hk_equity_combo_backtest_20260628.json",
"docs/research/hk_strategy_selection_20260603.md",
"docs/research/hk_quant_strategy_ideas.md",
),
},
}



Expand Down
3 changes: 1 addition & 2 deletions tests/test_catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,9 @@ def test_profile_groups_keep_runtime_research_and_snapshot_scaffolds_separate():
)
assert get_snapshot_backed_profiles() == frozenset({HK_LOW_VOL_DIVIDEND_QUALITY_SNAPSHOT_PROFILE})
assert get_external_snapshot_scaffold_profiles() == frozenset()
assert get_research_backtest_only_profiles() == frozenset()
assert get_research_backtest_only_profiles() == frozenset({HK_EQUITY_COMBO_PROFILE})
assert get_runtime_enabled_profiles() == frozenset(
{
HK_EQUITY_COMBO_PROFILE,
HK_GLOBAL_ETF_TACTICAL_ROTATION_PROFILE,
HK_LOW_VOL_DIVIDEND_QUALITY_SNAPSHOT_PROFILE,
}
Expand Down
8 changes: 4 additions & 4 deletions tests/test_live_enablement_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ def test_live_enablement_matrix_keeps_only_runtime_profiles_selectable_or_listed
matrix = build_live_enablement_matrix()

assert set(matrix["selectable_profiles"]) == get_runtime_enabled_profiles()
assert matrix["selectable_profile_count"] == 3
assert matrix["selectable_profile_count"] == 2
assert matrix["profile_count"] == 3
assert matrix["blocked_profile_count"] == 0
assert matrix["blocked_profile_count"] == 1
assert get_external_snapshot_scaffold_profiles() == frozenset()
assert get_research_backtest_only_profiles() == frozenset()
assert get_research_backtest_only_profiles() == frozenset({HK_EQUITY_COMBO_PROFILE})
assert matrix["first_snapshot_candidates"] == [HK_LOW_VOL_DIVIDEND_QUALITY_SNAPSHOT_PROFILE]
assert matrix["snapshot_required_repository_policies"] == ["quality_yield_live_enablement_policy"]
assert matrix["backtest_validation_policy"]["policy_version"] == "hk_backtest_validation_policy.v1"
Expand Down Expand Up @@ -142,5 +142,5 @@ def test_print_hk_live_enablement_matrix_json():
payload = json.loads(completed.stdout)

assert payload["profile_count"] == 3
assert payload["blocked_profile_count"] == 0
assert payload["blocked_profile_count"] == 1
assert set(payload["selectable_profiles"]) == get_runtime_enabled_profiles()
Loading