Skip to content

Commit 0c18dc5

Browse files
committed
add tqqq hybrid overlay research follow-ups
1 parent 0c99a02 commit 0c18dc5

20 files changed

Lines changed: 3048 additions & 0 deletions

research/backtest_hybrid_growth_continuous_scaling_followup.py

Lines changed: 469 additions & 0 deletions
Large diffs are not rendered by default.

research/backtest_hybrid_growth_idle_throttle_followup.py

Lines changed: 405 additions & 0 deletions
Large diffs are not rendered by default.

research/backtest_hybrid_growth_indicator_variants.py

Lines changed: 770 additions & 0 deletions
Large diffs are not rendered by default.

research/backtest_hybrid_growth_position_scaling_followup.py

Lines changed: 498 additions & 0 deletions
Large diffs are not rendered by default.

research/results/tqqq_hybrid_continuous_scaling_followup_comparison.csv

Lines changed: 73 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"baseline_growth_reference": {
3+
"idle_asset": "QQQ",
4+
"oos_cagr": 0.38770315883497886,
5+
"oos_max_drawdown": -0.3211199087725741,
6+
"oos_ulcer": 9.627918627041247,
7+
"oos_ir_vs_qqq": 0.7502300923853346
8+
},
9+
"baseline_defensive_reference": {
10+
"idle_asset": "BOXX",
11+
"oos_cagr": 0.23860213021458554,
12+
"oos_max_drawdown": -0.20112252200733738,
13+
"oos_ulcer": 7.51404066842126
14+
},
15+
"continuous_candidate": {
16+
"scaling": "ma20_gap_trim_only",
17+
"idle_asset": "QQQ",
18+
"oos_cagr": 0.3721585108293748,
19+
"oos_max_drawdown": -0.31763500064867334,
20+
"oos_ulcer": 9.637568131252396,
21+
"oos_ir_vs_qqq": 0.695452288733183,
22+
"turnover_per_year": 2.8632596159147603,
23+
"average_scale_while_invested": 0.9654877542375832
24+
},
25+
"verdict": "The trim-only continuous mapping is cleaner than the earlier score-based variants, but it still does not clearly beat the baseline. It smooths the path mainly by carrying a bit less TQQQ, not by creating a meaningfully better OOS growth profile."
26+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# TQQQ continuous position-scaling follow-up
2+
3+
## Setup
4+
- Keep the existing MA200 + ATR TQQQ entry/exit framework.
5+
- Change only the TQQQ position size while already invested.
6+
- Use one continuous indicator only: QQQ distance vs MA20.
7+
- Compare two idle assets: `BOXX` and `QQQ`.
8+
9+
## OOS 2023+ (5 bps)
10+
| scaling | idle_asset | CAGR | Max Drawdown | Ulcer Index | Information Ratio vs QQQ | Alpha Ann vs QQQ | Turnover/Year | Average TQQQ Weight | Average Scale While Invested |
11+
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
12+
| baseline | BOXX | 0.238602 | -0.201123 | 7.514041 | -0.187183 | -0.031695 | 1.237510 | 0.457729 | 1.000000 |
13+
| baseline | QQQ | 0.387703 | -0.321120 | 9.627919 | 0.750230 | -0.054166 | 1.138170 | 0.455575 | 1.000000 |
14+
| ma20_gap_linear | BOXX | 0.210636 | -0.199751 | 8.330539 | -0.353209 | -0.050267 | 4.403525 | 0.467389 | 1.020293 |
15+
| ma20_gap_linear | QQQ | 0.365982 | -0.326197 | 10.136864 | 0.645963 | -0.067824 | 4.436067 | 0.466023 | 1.020293 |
16+
| ma20_gap_trim_only | BOXX | 0.218393 | -0.182403 | 7.528751 | -0.341663 | -0.035422 | 2.910826 | 0.442867 | 0.965488 |
17+
| ma20_gap_trim_only | QQQ | 0.372159 | -0.317635 | 9.637568 | 0.695452 | -0.057661 | 2.863260 | 0.440277 | 0.965488 |
18+
19+
## Full Sample (5 bps)
20+
| scaling | idle_asset | CAGR | Max Drawdown | Ulcer Index | Information Ratio vs QQQ | Turnover/Year | Average TQQQ Weight | Average Scale While Invested |
21+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
22+
| baseline | BOXX | 0.221402 | -0.454508 | 12.312903 | 0.212472 | 1.270941 | 0.394726 | 1.000000 |
23+
| baseline | QQQ | 0.284755 | -0.499827 | 17.100661 | 0.746109 | 1.240954 | 0.378468 | 1.000000 |
24+
| ma20_gap_linear | BOXX | 0.219139 | -0.394992 | 11.705114 | 0.188906 | 3.749817 | 0.400119 | 1.022352 |
25+
| ma20_gap_linear | QQQ | 0.285719 | -0.461445 | 16.880328 | 0.768228 | 3.672616 | 0.385694 | 1.022352 |
26+
| ma20_gap_trim_only | BOXX | 0.214930 | -0.387385 | 11.232493 | 0.164054 | 2.596423 | 0.379484 | 0.962610 |
27+
| ma20_gap_trim_only | QQQ | 0.283283 | -0.458986 | 16.580457 | 0.779122 | 2.568179 | 0.363742 | 0.962610 |
28+
29+
## 2022 (5 bps)
30+
| scaling | idle_asset | Total Return | 2022 Return | Max Drawdown | Ulcer Index | Turnover/Year |
31+
| --- | --- | --- | --- | --- | --- | --- |
32+
| baseline | BOXX | -0.161162 | -0.161162 | -0.173794 | 17.021359 | 0.512380 |
33+
| baseline | QQQ | -0.387752 | -0.387752 | -0.412978 | 31.478228 | 0.505886 |
34+
| ma20_gap_linear | BOXX | -0.136642 | -0.136642 | -0.149992 | 14.721060 | 0.742490 |
35+
| ma20_gap_linear | QQQ | -0.376827 | -0.376827 | -0.402736 | 30.365284 | 0.742490 |
36+
| ma20_gap_trim_only | BOXX | -0.136243 | -0.136243 | -0.149094 | 14.629202 | 0.670105 |
37+
| ma20_gap_trim_only | QQQ | -0.376170 | -0.376170 | -0.401873 | 30.269567 | 0.670105 |
38+
39+
## Recommendation
40+
- The trim-only continuous mapping is cleaner than the earlier score-based variants, but it still does not clearly beat the baseline. It smooths the path mainly by carrying a bit less TQQQ, not by creating a meaningfully better OOS growth profile.

research/results/tqqq_hybrid_idle_throttle_followup_comparison.csv

Lines changed: 73 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"best_baseline_by_cagr": {
3+
"idle_asset": "QQQ",
4+
"oos_cagr": 0.3865033212434974,
5+
"oos_max_drawdown": -0.32111996059789283,
6+
"oos_ir_vs_qqq": 0.7513739398647076,
7+
"return_2022": null
8+
},
9+
"safest_baseline_idle_asset": {
10+
"idle_asset": "BOXX",
11+
"oos_cagr": 0.2394659221932549,
12+
"oos_max_drawdown": -0.20112252329052704
13+
},
14+
"best_throttle_candidate": {
15+
"idle_asset": "QQQ",
16+
"oos_cagr": 0.37331214938527135,
17+
"oos_max_drawdown": -0.293642217228371,
18+
"oos_ir_vs_qqq": 0.7329349938113593,
19+
"return_2022": null
20+
},
21+
"verdict": "Keep the baseline. The simple MA60 half-throttle improves 2022 and drawdown only when paired with defensive idle assets, but it gives up too much CAGR and still loses to baseline+QQQ on growth metrics."
22+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# TQQQ idle-asset and minimal-throttle follow-up
2+
3+
## Setup
4+
- Attack-only normalization: isolate the TQQQ sleeve and compare idle assets directly.
5+
- Baseline: existing MA200 + ATR staged TQQQ logic.
6+
- Minimal throttle: if QQQ closes below MA60, cut the computed TQQQ target by 50%.
7+
- Idle assets tested: `CASH`, `BOXX`, `QQQ`.
8+
9+
## OOS 2023+ (5 bps)
10+
| throttle | idle_asset | CAGR | Max Drawdown | Information Ratio vs QQQ | Alpha Ann vs QQQ | Turnover/Year | Average TQQQ Weight | Average Idle Asset Weight |
11+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
12+
| baseline | BOXX | 0.239466 | -0.201123 | -0.172266 | -0.029705 | 1.241688 | 0.458291 | 0.491709 |
13+
| baseline | CASH | 0.211531 | -0.202525 | -0.338829 | -0.052564 | 1.244173 | 0.458611 | 0.541389 |
14+
| baseline | QQQ | 0.386503 | -0.321120 | 0.751374 | -0.052876 | 1.142013 | 0.456134 | 0.493866 |
15+
| ma60_half | BOXX | 0.223423 | -0.180200 | -0.308919 | -0.010823 | 3.820005 | 0.421460 | 0.528540 |
16+
| ma60_half | CASH | 0.195971 | -0.184140 | -0.473194 | -0.033980 | 3.834373 | 0.422757 | 0.577243 |
17+
| ma60_half | QQQ | 0.373312 | -0.293642 | 0.732935 | -0.041658 | 3.711045 | 0.413514 | 0.536486 |
18+
19+
## 2022 (5 bps)
20+
| throttle | idle_asset | Total Return | 2022 Return | Max Drawdown | Turnover/Year | Average TQQQ Weight | Average Idle Asset Weight |
21+
| --- | --- | --- | --- | --- | --- | --- | --- |
22+
| baseline | BOXX | -0.161162 | -0.161162 | -0.173794 | 0.512380 | 0.027606 | 0.922394 |
23+
| baseline | CASH | -0.161719 | -0.161719 | -0.173794 | 0.512380 | 0.027606 | 0.972394 |
24+
| baseline | QQQ | -0.387752 | -0.387752 | -0.412978 | 0.505886 | 0.027191 | 0.922809 |
25+
| ma60_half | BOXX | -0.117219 | -0.117219 | -0.131439 | 0.550353 | 0.017447 | 0.932553 |
26+
| ma60_half | CASH | -0.117805 | -0.117805 | -0.131439 | 0.550353 | 0.017447 | 0.982553 |
27+
| ma60_half | QQQ | -0.361779 | -0.361779 | -0.388075 | 0.505886 | 0.015588 | 0.934412 |
28+
29+
## Recommendation
30+
- Keep the baseline. The simple MA60 half-throttle improves 2022 and drawdown only when paired with defensive idle assets, but it gives up too much CAGR and still loses to baseline+QQQ on growth metrics.

0 commit comments

Comments
 (0)