Skip to content

Commit 87c5b93

Browse files
committed
Rename historical tech pullback research labels
1 parent 07b38a0 commit 87c5b93

4 files changed

Lines changed: 23 additions & 23 deletions

research/backtest_growth_pullback_v1_4_cash_buffer_refinement.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,10 @@ def build_recommendation(
394394
level = "cash_buffer_branch_candidate"
395395
reason = "cash-buffer branch direction still exists, but the refined candidates do not keep enough relative-to-QQQ edge"
396396
elif honest_ok and occupancy_ok and concentration_ok and best_is_current_default and (stable_margin or no_material_gain_over_current):
397-
level = "tech_pullback_cash_buffer_frozen"
397+
level = "qqq_tech_enhancement_frozen"
398398
reason = "current honest cash-buffer branch is already good enough; small refinements do not justify further spec churn"
399399
elif honest_ok and performance_ok:
400-
level = "tech_pullback_cash_buffer"
400+
level = "qqq_tech_enhancement"
401401
reason = "a refined honest cash-buffer candidate is strong enough to act as the branch default, but the spec is not fully frozen yet"
402402
else:
403403
level = "cash_buffer_branch_candidate"

research/backtest_growth_pullback_v1_5_freeze_review.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,15 @@ def resolve_paths(configs_dir: Path, results_dir: Path) -> dict[str, Path]:
7272
def build_canonical_spec(center_cfg: gp.GrowthPullbackConfig, previous_candidate_name: str) -> CanonicalBranchSpec:
7373
config = replace(
7474
center_cfg,
75-
name="tech_pullback_cash_buffer",
75+
name="qqq_tech_enhancement",
7676
holdings_count=8,
7777
single_name_cap=0.10,
7878
sector_cap=0.40,
7979
hold_bonus=0.10,
8080
exposures=gp.suite.ExposureConfig("80_60_0", 0.60, 0.00),
8181
)
8282
return CanonicalBranchSpec(
83-
name="tech_pullback_cash_buffer",
83+
name="qqq_tech_enhancement",
8484
previous_candidate_name=previous_candidate_name,
8585
config=config,
8686
risk_on_exposure=0.80,
@@ -95,7 +95,7 @@ def build_canonical_spec(center_cfg: gp.GrowthPullbackConfig, previous_candidate
9595

9696
def canonical_spec_to_dict(spec: CanonicalBranchSpec) -> dict[str, object]:
9797
return {
98-
"role": "tech_pullback_cash_buffer",
98+
"role": "qqq_tech_enhancement",
9999
"status": "research_only",
100100
"strategy": "growth_pullback_systematic_v1",
101101
"branch_name": "cash_buffer_branch",
@@ -295,7 +295,7 @@ def build_consistency_checks(
295295
},
296296
{
297297
"check": "recommendation_matches_branch_default_role",
298-
"passed": recommendation_level == "tech_pullback_cash_buffer",
298+
"passed": recommendation_level == "qqq_tech_enhancement",
299299
"detail": f"recommendation={recommendation_level}",
300300
},
301301
{
@@ -390,7 +390,7 @@ def build_role_table(
390390
qqq_full = v12.extract_period_row(qqq_reference_rows, "QQQ", MAIN_COST_BPS, "Full Sample")
391391
rows.extend([
392392
{
393-
"strategy": "tech_pullback_cash_buffer",
393+
"strategy": "qqq_tech_enhancement",
394394
"role": "cash-buffered parallel branch",
395395
"full_cagr": canonical_summary["full_cagr"],
396396
"oos_cagr": canonical_summary["oos_cagr"],
@@ -486,15 +486,15 @@ def build_freeze_recommendation(
486486
level = "candidate"
487487
reason = "branch role is valid, but consistency or performance checks are not strong enough for default status"
488488
elif frozen_blockers:
489-
level = "tech_pullback_cash_buffer"
489+
level = "qqq_tech_enhancement"
490490
reason = "canonical naming and branch role are now clear, but avg names / 2022 profile / recent micro-adjustment mean it should stop at default, not frozen"
491491
else:
492-
level = "tech_pullback_cash_buffer_frozen"
492+
level = "qqq_tech_enhancement_frozen"
493493
reason = "branch semantics, deployment consistency, and behavior are all stable enough to freeze"
494494

495495
return {
496496
"research_recommendation": level,
497-
"branch_name": "tech_pullback_cash_buffer",
497+
"branch_name": "qqq_tech_enhancement",
498498
"previous_candidate_name": "cash_buffer_a__hb10__base__adv50",
499499
"reason": reason,
500500
"frozen_blockers": frozen_blockers,
@@ -638,7 +638,7 @@ def main() -> None:
638638
"information_ratio_vs_qqq_oos": float(v12.extract_period_row(full_rows_df, "coherent_full_deployment_branch", MAIN_COST_BPS, "OOS Sample")["Information Ratio vs QQQ"]),
639639
})
640640

641-
preliminary_recommendation_level = "tech_pullback_cash_buffer"
641+
preliminary_recommendation_level = "qqq_tech_enhancement"
642642
manifest = build_manifest(
643643
spec=spec,
644644
canonical_summary=canonical_summary,

tests/test_growth_pullback_v1_4_cash_buffer_refinement.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def test_freeze_decision_logic_can_freeze_current_default():
115115
all_candidates=candidate_table,
116116
)
117117

118-
assert rec['research_recommendation'] == 'tech_pullback_cash_buffer_frozen'
118+
assert rec['research_recommendation'] == 'qqq_tech_enhancement_frozen'
119119
assert rec['keep_parallel_branch'] is True
120120
assert rec['role_vs_qqq_plus_current_default'] == '并行分支'
121121

@@ -154,7 +154,7 @@ def test_result_export_not_empty(tmp_path):
154154
}
155155
]),
156156
recommendation={
157-
'research_recommendation': 'tech_pullback_cash_buffer',
157+
'research_recommendation': 'qqq_tech_enhancement',
158158
'selected_refined_default': 'coherent_cash_buffer_branch',
159159
'keep_parallel_branch': True,
160160
'role_vs_qqq_plus_current_default': '并行分支',

tests/test_growth_pullback_v1_5_freeze_review.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def test_canonical_config_export(tmp_path):
2929
module.save_canonical_spec(out, spec)
3030
payload = json.loads(out.read_text(encoding='utf-8'))
3131

32-
assert payload['name'] == 'tech_pullback_cash_buffer'
32+
assert payload['name'] == 'qqq_tech_enhancement'
3333
assert payload['previous_candidate_name'] == 'cash_buffer_a__hb10__base__adv50'
3434
assert payload['holdings_count'] == 8
3535
assert payload['single_name_cap'] == 0.10
@@ -56,10 +56,10 @@ def test_manifest_fields_non_empty():
5656
'return_2022': -0.120121,
5757
},
5858
qqq_plus_oos=pd.Series({'CAGR': 0.33401}),
59-
recommendation_level='tech_pullback_cash_buffer',
59+
recommendation_level='qqq_tech_enhancement',
6060
)
6161

62-
assert manifest['branch_name'] == 'tech_pullback_cash_buffer'
62+
assert manifest['branch_name'] == 'qqq_tech_enhancement'
6363
assert manifest['role']
6464
assert manifest['intended_use']
6565
assert manifest['why_this_is_a_cash_buffer_branch']
@@ -98,7 +98,7 @@ def test_geometry_and_deployment_consistency_checks():
9898
v14_summary=v14_summary,
9999
previous_candidate_name='cash_buffer_a__hb10__base__adv50',
100100
canonical_summary=canonical_summary,
101-
recommendation_level='tech_pullback_cash_buffer',
101+
recommendation_level='qqq_tech_enhancement',
102102
manifest=manifest,
103103
)
104104

@@ -123,7 +123,7 @@ def test_recommendation_logic_defaults_but_not_frozen():
123123
]),
124124
)
125125

126-
assert recommendation['research_recommendation'] == 'tech_pullback_cash_buffer'
126+
assert recommendation['research_recommendation'] == 'qqq_tech_enhancement'
127127
assert recommendation['keep_parallel_branch'] is True
128128
assert recommendation['role_vs_qqq_plus_current_default'] == '并行分支'
129129
assert 'average_names_held_still_low' in recommendation['frozen_blockers']
@@ -135,15 +135,15 @@ def test_result_export_not_empty(tmp_path):
135135
module.write_markdown_report(
136136
md_path,
137137
canonical_payload={
138-
'name': 'tech_pullback_cash_buffer',
138+
'name': 'qqq_tech_enhancement',
139139
'previous_candidate_name': 'cash_buffer_a__hb10__base__adv50',
140140
'holdings_count': 8,
141141
'single_name_cap': 0.10,
142142
'sector_cap': 0.40,
143143
},
144144
comparison_df=pd.DataFrame([
145145
{
146-
'strategy': 'tech_pullback_cash_buffer',
146+
'strategy': 'qqq_tech_enhancement',
147147
'role': 'cash-buffered parallel branch',
148148
'oos_cagr': 0.34068,
149149
}
@@ -152,16 +152,16 @@ def test_result_export_not_empty(tmp_path):
152152
{'check': 'geometry_capacity_matches_target', 'passed': True, 'detail': 'ok'}
153153
]),
154154
recommendation={
155-
'research_recommendation': 'tech_pullback_cash_buffer',
155+
'research_recommendation': 'qqq_tech_enhancement',
156156
'previous_candidate_name': 'cash_buffer_a__hb10__base__adv50',
157-
'branch_name': 'tech_pullback_cash_buffer',
157+
'branch_name': 'qqq_tech_enhancement',
158158
'role_vs_qqq_plus_current_default': '并行分支',
159159
'keep_parallel_branch': True,
160160
'reason': 'test',
161161
'frozen_blockers': ['average_names_held_still_low'],
162162
},
163163
manifest={
164-
'branch_name': 'tech_pullback_cash_buffer',
164+
'branch_name': 'qqq_tech_enhancement',
165165
'role': 'cash-buffered parallel branch',
166166
'previous_candidate_name': 'cash_buffer_a__hb10__base__adv50',
167167
'benchmark': 'QQQ',

0 commit comments

Comments
 (0)