From 3e3ecbc28f21306a46f0954b55769300af40bed2 Mon Sep 17 00:00:00 2001 From: Pigbibi <20649888+Pigbibi@users.noreply.github.com> Date: Tue, 7 Apr 2026 08:43:18 +0800 Subject: [PATCH] add tqqq hybrid overlay research follow-ups --- ...brid_growth_continuous_scaling_followup.py | 469 +++++++++++ ...st_hybrid_growth_idle_throttle_followup.py | 405 +++++++++ ...cktest_hybrid_growth_indicator_variants.py | 770 ++++++++++++++++++ ...hybrid_growth_position_scaling_followup.py | 498 +++++++++++ ...continuous_scaling_followup_comparison.csv | 73 ++ ...nuous_scaling_followup_recommendation.json | 26 + ...rid_continuous_scaling_followup_summary.md | 40 + ...brid_idle_throttle_followup_comparison.csv | 73 ++ ...idle_throttle_followup_recommendation.json | 22 + ...q_hybrid_idle_throttle_followup_summary.md | 30 + ...q_hybrid_indicator_variants_comparison.csv | 193 +++++ ...rid_indicator_variants_recommendation.json | 50 ++ .../tqqq_hybrid_indicator_variants_summary.md | 45 + ...d_position_scaling_followup_comparison.csv | 97 +++ ...ition_scaling_followup_recommendation.json | 26 + ...ybrid_position_scaling_followup_summary.md | 46 ++ ...brid_growth_continuous_scaling_followup.py | 44 + ...st_hybrid_growth_idle_throttle_followup.py | 40 + .../test_hybrid_growth_indicator_variants.py | 55 ++ ...hybrid_growth_position_scaling_followup.py | 46 ++ 20 files changed, 3048 insertions(+) create mode 100644 research/backtest_hybrid_growth_continuous_scaling_followup.py create mode 100644 research/backtest_hybrid_growth_idle_throttle_followup.py create mode 100644 research/backtest_hybrid_growth_indicator_variants.py create mode 100644 research/backtest_hybrid_growth_position_scaling_followup.py create mode 100644 research/results/tqqq_hybrid_continuous_scaling_followup_comparison.csv create mode 100644 research/results/tqqq_hybrid_continuous_scaling_followup_recommendation.json create mode 100644 research/results/tqqq_hybrid_continuous_scaling_followup_summary.md create mode 100644 research/results/tqqq_hybrid_idle_throttle_followup_comparison.csv create mode 100644 research/results/tqqq_hybrid_idle_throttle_followup_recommendation.json create mode 100644 research/results/tqqq_hybrid_idle_throttle_followup_summary.md create mode 100644 research/results/tqqq_hybrid_indicator_variants_comparison.csv create mode 100644 research/results/tqqq_hybrid_indicator_variants_recommendation.json create mode 100644 research/results/tqqq_hybrid_indicator_variants_summary.md create mode 100644 research/results/tqqq_hybrid_position_scaling_followup_comparison.csv create mode 100644 research/results/tqqq_hybrid_position_scaling_followup_recommendation.json create mode 100644 research/results/tqqq_hybrid_position_scaling_followup_summary.md create mode 100644 tests/test_hybrid_growth_continuous_scaling_followup.py create mode 100644 tests/test_hybrid_growth_idle_throttle_followup.py create mode 100644 tests/test_hybrid_growth_indicator_variants.py create mode 100644 tests/test_hybrid_growth_position_scaling_followup.py diff --git a/research/backtest_hybrid_growth_continuous_scaling_followup.py b/research/backtest_hybrid_growth_continuous_scaling_followup.py new file mode 100644 index 0000000..82bd867 --- /dev/null +++ b/research/backtest_hybrid_growth_continuous_scaling_followup.py @@ -0,0 +1,469 @@ +#!/usr/bin/env python3 +"""Minimal continuous position-scaling study for the TQQQ attack sleeve.""" + +from __future__ import annotations + +import argparse +import json +import math +import sys +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +import pandas as pd + +CURRENT_DIR = Path(__file__).resolve().parent +if str(CURRENT_DIR) not in sys.path: + sys.path.insert(0, str(CURRENT_DIR)) + +import backtest_hybrid_growth_indicator_variants as base # noqa: E402 +import backtest_stock_alpha_suite as suite # noqa: E402 +from us_equity_strategies.strategies.hybrid_growth_income import get_hybrid_allocation # noqa: E402 + +DEFAULT_RESULTS_DIR = Path(__file__).resolve().parent / "results" +DEFAULT_START = "2018-01-01" +DEFAULT_COSTS_BPS = (0.0, 5.0, 10.0) +PERIODS = ( + ("Full Sample", None, None), + ("2018-2021", "2018-01-01", "2021-12-31"), + ("2022", "2022-01-01", "2022-12-31"), + ("2023+", "2023-01-01", None), +) +CASH_SYMBOL = base.CASH_SYMBOL +SAFE_HAVEN = base.SAFE_HAVEN + + +@dataclass(frozen=True) +class ScalingConfig: + name: str + description: str + + +@dataclass +class StrategyRun: + strategy_name: str + display_name: str + gross_returns: pd.Series + weights_history: pd.DataFrame + turnover_history: pd.Series + scale_history: pd.Series + metadata: dict[str, object] + + +SCALING_CONFIGS = ( + ScalingConfig( + name="baseline", + description="No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.", + ), + ScalingConfig( + name="ma20_gap_linear", + description="Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.", + ), + ScalingConfig( + name="ma20_gap_trim_only", + description="Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.", + ), +) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--results-dir", default=str(DEFAULT_RESULTS_DIR)) + parser.add_argument("--start", default=DEFAULT_START) + parser.add_argument("--end", default=None) + parser.add_argument( + "--cost-bps", + nargs="*", + type=float, + default=list(DEFAULT_COSTS_BPS), + ) + return parser.parse_args() + + +def compute_ulcer_index(net_returns: pd.Series) -> float: + equity_curve = (1.0 + net_returns).cumprod() + drawdown_pct = (equity_curve / equity_curve.cummax() - 1.0) * 100.0 + return float(np.sqrt(np.mean(np.square(drawdown_pct)))) + + +def continuous_scale(config_name: str, row: pd.Series) -> float: + if config_name == "baseline": + return 1.0 + if config_name not in {"ma20_gap_linear", "ma20_gap_trim_only"}: + raise KeyError(f"Unknown scaling config: {config_name}") + + close = float(row["close"]) + ma20 = float(row["ma20"]) if pd.notna(row["ma20"]) else float("nan") + if not pd.notna(ma20) or ma20 <= 0.0: + return 1.0 + + gap = close / ma20 - 1.0 + if config_name == "ma20_gap_trim_only": + if gap >= 0.0: + return 1.0 + negative_gap = max(gap, -0.08) + return 1.0 + (negative_gap / 0.08) * 0.45 + + if gap >= 0.0: + positive_gap = min(gap, 0.04) + return 1.0 + (positive_gap / 0.04) * 0.15 + + negative_gap = max(gap, -0.08) + return 1.0 + (negative_gap / 0.08) * 0.45 + + +def run_backtest( + qqq_ohlc: pd.DataFrame, + asset_returns: pd.DataFrame, + indicators: pd.DataFrame, + *, + scaling: ScalingConfig, + idle_asset: str, + starting_equity: float = base.ATTACK_ONLY_STARTING_EQUITY, + cash_reserve_ratio: float = 0.05, + rebalance_threshold_ratio: float = 0.01, + alloc_tier1_breakpoints=(0, 15_000, 30_000, 70_000), + alloc_tier1_values=(1.0, 0.95, 0.85, 0.70), + alloc_tier2_breakpoints=(70_000, 140_000), + alloc_tier2_values=(0.70, 0.50), + risk_leverage_factor: float = 3.0, + risk_agg_cap: float = 0.50, + risk_numerator: float = 0.30, + atr_exit_scale: float = 2.0, + atr_entry_scale: float = 2.5, + exit_line_floor: float = 0.92, + exit_line_cap: float = 0.98, + entry_line_floor: float = 1.02, + entry_line_cap: float = 1.08, +) -> StrategyRun: + idle_asset = idle_asset.upper() + index = asset_returns.index.intersection(qqq_ohlc.index) + strategy_symbols = ["TQQQ", SAFE_HAVEN, "QQQ", CASH_SYMBOL] + weights_history = pd.DataFrame(0.0, index=index, columns=strategy_symbols) + portfolio_returns = pd.Series(0.0, index=index, name=f"{scaling.name}__{idle_asset.lower()}") + turnover_history = pd.Series(0.0, index=index, name="turnover") + scale_history = pd.Series(1.0, index=index, name="scale") + + current_equity = float(starting_equity) + current_weights: dict[str, float] = {idle_asset if idle_asset != CASH_SYMBOL else CASH_SYMBOL: 1.0} + + for idx in range(len(index) - 1): + date = index[idx] + next_date = index[idx + 1] + row = indicators.loc[date] + qqq_p = float(row["close"]) + ma200 = float(row["ma200"]) if pd.notna(row["ma200"]) else float("nan") + + history = qqq_ohlc.loc[:date] + true_range = pd.concat( + [ + history["high"] - history["low"], + (history["high"] - history["close"].shift(1)).abs(), + (history["low"] - history["close"].shift(1)).abs(), + ], + axis=1, + ).max(axis=1) + atr_pct = float(true_range.rolling(14).mean().iloc[-1] / qqq_p) if len(history) >= 14 else 0.0 + exit_line = ma200 * max(exit_line_floor, min(exit_line_cap, 1.0 - (atr_pct * atr_exit_scale))) if pd.notna(ma200) else float("nan") + entry_line = ma200 * max(entry_line_floor, min(entry_line_cap, 1.0 + (atr_pct * atr_entry_scale))) if pd.notna(ma200) else float("nan") + + reserved = current_equity * cash_reserve_ratio + agg_ratio, _ = get_hybrid_allocation( + current_equity, + qqq_p, + exit_line if pd.notna(exit_line) else qqq_p, + alloc_tier1_breakpoints=alloc_tier1_breakpoints, + alloc_tier1_values=alloc_tier1_values, + alloc_tier2_breakpoints=alloc_tier2_breakpoints, + alloc_tier2_values=alloc_tier2_values, + risk_leverage_factor=risk_leverage_factor, + risk_agg_cap=risk_agg_cap, + risk_numerator=risk_numerator, + ) + + current_tqqq_weight = current_weights.get("TQQQ", 0.0) + target_tqqq_ratio = 0.0 + if current_tqqq_weight > 1e-12: + if qqq_p < exit_line: + target_tqqq_ratio = 0.0 + elif qqq_p < ma200: + target_tqqq_ratio = agg_ratio * 0.33 + else: + target_tqqq_ratio = agg_ratio + elif qqq_p > entry_line: + target_tqqq_ratio = agg_ratio + + scale = 0.0 if target_tqqq_ratio <= 1e-12 else continuous_scale(scaling.name, row) + scale_history.at[date] = scale + target_tqqq_ratio *= scale + + target_tqqq_value = current_equity * target_tqqq_ratio + idle_value = max(0.0, (current_equity - reserved) - target_tqqq_value) + target_weights = base.build_target_weights( + current_equity=current_equity, + target_tqqq_value=target_tqqq_value, + idle_value=idle_value, + reserved_value=reserved, + idle_asset=idle_asset, + ) + + rebalance_needed = any( + abs(target_weights.get(symbol, 0.0) - current_weights.get(symbol, 0.0)) > rebalance_threshold_ratio + for symbol in set(target_weights) | set(current_weights) + ) + if rebalance_needed: + turnover_history.at[next_date] = suite.compute_turnover(current_weights, target_weights) + current_weights = target_weights + + for symbol, weight in current_weights.items(): + if symbol in weights_history.columns: + weights_history.at[date, symbol] = weight + + next_returns = asset_returns.loc[next_date] + portfolio_returns.at[next_date] = sum( + weight * float(next_returns.get(symbol, 0.0)) + for symbol, weight in current_weights.items() + if symbol != CASH_SYMBOL + ) + current_equity *= 1.0 + float(portfolio_returns.at[next_date]) + + for symbol, weight in current_weights.items(): + if symbol in weights_history.columns: + weights_history.at[index[-1], symbol] = weight + + metadata = { + "family": "hybrid_growth_tqqq_continuous_scaling", + "scaling": scaling.name, + "scaling_description": scaling.description, + "idle_asset": idle_asset, + } + return StrategyRun( + strategy_name=f"hybrid_tqqq_continuous::{scaling.name}::{idle_asset.lower()}", + display_name=f"hybrid_tqqq_continuous::{scaling.name}::{idle_asset.lower()}", + gross_returns=portfolio_returns, + weights_history=weights_history, + turnover_history=turnover_history, + scale_history=scale_history, + metadata=metadata, + ) + + +def summarize_period(run: StrategyRun, benchmark_returns: pd.Series, *, cost_bps: float, start: str | None, end: str | None) -> dict[str, object]: + returns = run.gross_returns.copy() + turnover = run.turnover_history.reindex(returns.index).fillna(0.0) + net_returns = returns - turnover * (float(cost_bps) / 10_000.0) + weights = run.weights_history.copy() + scale = run.scale_history.copy() + + if start: + net_returns = net_returns.loc[start:] + weights = weights.loc[start:] + turnover = turnover.loc[start:] + scale = scale.loc[start:] + if end: + net_returns = net_returns.loc[:end] + weights = weights.loc[:end] + turnover = turnover.loc[:end] + scale = scale.loc[:end] + + net_returns = net_returns.dropna() + benchmark = benchmark_returns.reindex(net_returns.index).fillna(0.0) + weights = weights.reindex(net_returns.index).fillna(0.0) + scale = scale.reindex(net_returns.index).fillna(0.0) + if net_returns.empty: + raise RuntimeError("No returns remain inside selected period") + + equity_curve = (1.0 + net_returns).cumprod() + total_return = float(equity_curve.iloc[-1] - 1.0) + years = max((net_returns.index[-1] - net_returns.index[0]).days / 365.25, 1 / 365.25) + cagr = float(equity_curve.iloc[-1] ** (1.0 / years) - 1.0) + drawdown = equity_curve / equity_curve.cummax() - 1.0 + max_drawdown = float(drawdown.min()) + std = float(net_returns.std(ddof=0)) + volatility = std * math.sqrt(252) if std else float("nan") + sharpe = float(net_returns.mean() / std * math.sqrt(252)) if std else float("nan") + beta = suite.compute_beta(net_returns, benchmark) + information_ratio = suite.compute_information_ratio(net_returns, benchmark) + up_capture, down_capture = suite.compute_capture_ratios(net_returns, benchmark) + + aligned = pd.concat([net_returns.rename("strategy"), benchmark.rename("benchmark")], axis=1).dropna() + if aligned.empty or math.isnan(beta): + alpha_ann = float("nan") + else: + alpha_daily = float((aligned["strategy"] - beta * aligned["benchmark"]).mean()) + alpha_ann = alpha_daily * 252.0 + + active_scale = scale[weights.get("TQQQ", pd.Series(0.0, index=weights.index)) > 1e-12] + return { + "Start": str(net_returns.index[0].date()), + "End": str(net_returns.index[-1].date()), + "Total Return": total_return, + "CAGR": cagr, + "Max Drawdown": max_drawdown, + "Ulcer Index": compute_ulcer_index(net_returns), + "Volatility": volatility, + "Sharpe": sharpe, + "Beta vs QQQ": beta, + "Alpha Ann vs QQQ": alpha_ann, + "Information Ratio vs QQQ": information_ratio, + "Up Capture vs QQQ": up_capture, + "Down Capture vs QQQ": down_capture, + "Turnover/Year": float(turnover.sum() / years), + "Average TQQQ Weight": float(weights.get("TQQQ", pd.Series(0.0, index=weights.index)).mean()), + "Average Idle Asset Weight": float(weights.get(str(run.metadata["idle_asset"]), pd.Series(0.0, index=weights.index)).mean()), + "Average Cash Weight": float(weights.get(CASH_SYMBOL, pd.Series(0.0, index=weights.index)).mean()), + "Average Scale While Invested": float(active_scale.mean()) if not active_scale.empty else 0.0, + "2022 Return": suite.compute_period_total_return(net_returns, "2022-01-01", "2022-12-31"), + "2023+ CAGR": suite.compute_period_cagr(net_returns, "2023-01-01", None), + } + + +def build_summary(runs: list[StrategyRun], benchmark_returns: pd.Series, costs_bps: list[float]) -> pd.DataFrame: + rows: list[dict[str, object]] = [] + for run in runs: + for cost_bps in costs_bps: + for period_name, start, end in PERIODS: + rows.append( + { + "strategy": run.strategy_name, + "display_name": run.display_name, + "cost_bps_one_way": float(cost_bps), + "period": period_name, + **summarize_period(run, benchmark_returns, cost_bps=float(cost_bps), start=start, end=end), + **run.metadata, + } + ) + return pd.DataFrame(rows) + + +def build_recommendation(summary: pd.DataFrame) -> dict[str, object]: + oos = summary[(summary["period"] == "2023+") & (summary["cost_bps_one_way"] == 5.0)].copy() + baseline_qqq = oos[(oos["scaling"] == "baseline") & (oos["idle_asset"] == "QQQ")].iloc[0] + baseline_boxx = oos[(oos["scaling"] == "baseline") & (oos["idle_asset"] == "BOXX")].iloc[0] + candidates = oos[oos["scaling"] != "baseline"].copy() + candidates["score"] = ( + candidates["Information Ratio vs QQQ"].fillna(-999.0) * 4.0 + + candidates["Alpha Ann vs QQQ"].fillna(-999.0) * 2.0 + + candidates["CAGR"].fillna(-999.0) + - candidates["Ulcer Index"].fillna(999.0) * 0.05 + - candidates["Turnover/Year"].fillna(999.0) * 0.02 + ) + candidate = candidates.sort_values("score", ascending=False).iloc[0] + 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." + ) + return { + "baseline_growth_reference": { + "idle_asset": "QQQ", + "oos_cagr": float(baseline_qqq["CAGR"]), + "oos_max_drawdown": float(baseline_qqq["Max Drawdown"]), + "oos_ulcer": float(baseline_qqq["Ulcer Index"]), + "oos_ir_vs_qqq": float(baseline_qqq["Information Ratio vs QQQ"]), + }, + "baseline_defensive_reference": { + "idle_asset": "BOXX", + "oos_cagr": float(baseline_boxx["CAGR"]), + "oos_max_drawdown": float(baseline_boxx["Max Drawdown"]), + "oos_ulcer": float(baseline_boxx["Ulcer Index"]), + }, + "continuous_candidate": { + "scaling": str(candidate["scaling"]), + "idle_asset": str(candidate["idle_asset"]), + "oos_cagr": float(candidate["CAGR"]), + "oos_max_drawdown": float(candidate["Max Drawdown"]), + "oos_ulcer": float(candidate["Ulcer Index"]), + "oos_ir_vs_qqq": float(candidate["Information Ratio vs QQQ"]), + "turnover_per_year": float(candidate["Turnover/Year"]), + "average_scale_while_invested": float(candidate["Average Scale While Invested"]), + }, + "verdict": verdict, + } + + +def build_markdown(summary: pd.DataFrame, recommendation: dict[str, object]) -> str: + focus = summary[(summary["period"] == "2023+") & (summary["cost_bps_one_way"] == 5.0)].copy().sort_values(["scaling", "idle_asset"]) + full = summary[(summary["period"] == "Full Sample") & (summary["cost_bps_one_way"] == 5.0)].copy().sort_values(["scaling", "idle_asset"]) + y2022 = summary[(summary["period"] == "2022") & (summary["cost_bps_one_way"] == 5.0)].copy().sort_values(["scaling", "idle_asset"]) + return "\n".join( + [ + "# TQQQ continuous position-scaling follow-up", + "", + "## Setup", + "- Keep the existing MA200 + ATR TQQQ entry/exit framework.", + "- Change only the TQQQ position size while already invested.", + "- Use one continuous indicator only: QQQ distance vs MA20.", + "- Compare two idle assets: `BOXX` and `QQQ`.", + "", + "## OOS 2023+ (5 bps)", + base.frame_to_markdown_table( + focus[[ + "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" + ]] + ), + "", + "## Full Sample (5 bps)", + base.frame_to_markdown_table( + full[[ + "scaling", "idle_asset", "CAGR", "Max Drawdown", "Ulcer Index", "Information Ratio vs QQQ", + "Turnover/Year", "Average TQQQ Weight", "Average Scale While Invested" + ]] + ), + "", + "## 2022 (5 bps)", + base.frame_to_markdown_table( + y2022[[ + "scaling", "idle_asset", "Total Return", "2022 Return", "Max Drawdown", "Ulcer Index", "Turnover/Year" + ]] + ), + "", + "## Recommendation", + f"- {recommendation['verdict']}", + ] + ) + "\n" + + +def main() -> None: + args = parse_args() + results_dir = Path(args.results_dir).expanduser().resolve() + results_dir.mkdir(parents=True, exist_ok=True) + + etf_frames = suite.download_etf_ohlcv(("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI"), start=args.start, end=args.end) + qqq_ohlc = pd.DataFrame( + { + "open": etf_frames["open"]["QQQ"], + "high": etf_frames["high"]["QQQ"], + "low": etf_frames["low"]["QQQ"], + "close": etf_frames["close"]["QQQ"], + } + ).dropna() + master_index = qqq_ohlc.index + rows = suite.build_extra_etf_price_history(etf_frames, symbols=("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI")) + _, returns_matrix = suite.build_asset_return_matrix(rows, master_index=master_index, required_symbols=("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI")) + returns_matrix[CASH_SYMBOL] = 0.0 + indicators = base.build_indicator_frame(qqq_ohlc, etf_frames["volume"]["QQQ"].reindex(master_index).fillna(0.0)) + + runs: list[StrategyRun] = [] + for scaling in SCALING_CONFIGS: + for idle_asset in (SAFE_HAVEN, "QQQ"): + runs.append(run_backtest(qqq_ohlc, returns_matrix, indicators, scaling=scaling, idle_asset=idle_asset)) + + summary = build_summary(runs, returns_matrix["QQQ"].copy(), list(args.cost_bps)) + recommendation = build_recommendation(summary) + + comparison_path = results_dir / "tqqq_hybrid_continuous_scaling_followup_comparison.csv" + summary_path = results_dir / "tqqq_hybrid_continuous_scaling_followup_summary.md" + recommendation_path = results_dir / "tqqq_hybrid_continuous_scaling_followup_recommendation.json" + summary.to_csv(comparison_path, index=False) + summary_path.write_text(build_markdown(summary, recommendation), encoding="utf-8") + recommendation_path.write_text(json.dumps(recommendation, indent=2, ensure_ascii=False), encoding="utf-8") + + print(f"wrote {comparison_path}") + print(f"wrote {summary_path}") + print(f"wrote {recommendation_path}") + + +if __name__ == "__main__": + main() diff --git a/research/backtest_hybrid_growth_idle_throttle_followup.py b/research/backtest_hybrid_growth_idle_throttle_followup.py new file mode 100644 index 0000000..9de7011 --- /dev/null +++ b/research/backtest_hybrid_growth_idle_throttle_followup.py @@ -0,0 +1,405 @@ +#!/usr/bin/env python3 +"""Focused follow-up for TQQQ attack sleeve idle asset and minimal throttle study.""" + +from __future__ import annotations + +import argparse +import json +import math +import sys +from dataclasses import dataclass +from pathlib import Path + +import pandas as pd + +CURRENT_DIR = Path(__file__).resolve().parent +if str(CURRENT_DIR) not in sys.path: + sys.path.insert(0, str(CURRENT_DIR)) + +import backtest_hybrid_growth_indicator_variants as base # noqa: E402 +import backtest_stock_alpha_suite as suite # noqa: E402 +from us_equity_strategies.strategies.hybrid_growth_income import get_hybrid_allocation # noqa: E402 + +DEFAULT_RESULTS_DIR = Path(__file__).resolve().parent / "results" +DEFAULT_START = "2018-01-01" +DEFAULT_COSTS_BPS = (0.0, 5.0, 10.0) +PERIODS = ( + ("Full Sample", None, None), + ("2018-2021", "2018-01-01", "2021-12-31"), + ("2022", "2022-01-01", "2022-12-31"), + ("2023+", "2023-01-01", None), +) +CASH_SYMBOL = base.CASH_SYMBOL +SAFE_HAVEN = base.SAFE_HAVEN + + +@dataclass(frozen=True) +class ThrottleConfig: + name: str + description: str + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--results-dir", default=str(DEFAULT_RESULTS_DIR)) + parser.add_argument("--start", default=DEFAULT_START) + parser.add_argument("--end", default=None) + parser.add_argument( + "--cost-bps", + nargs="*", + type=float, + default=list(DEFAULT_COSTS_BPS), + ) + return parser.parse_args() + + +THROTTLES = ( + ThrottleConfig( + name="baseline", + description="Current MA200 + ATR staged TQQQ logic, no extra throttle.", + ), + ThrottleConfig( + name="ma60_half", + description="If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.", + ), +) + + +@dataclass +class StrategyRun: + strategy_name: str + display_name: str + gross_returns: pd.Series + weights_history: pd.DataFrame + turnover_history: pd.Series + metadata: dict[str, object] + + +def throttle_multiplier(throttle_name: str, row: pd.Series) -> float: + if throttle_name == "baseline": + return 1.0 + if throttle_name == "ma60_half": + ma60 = float(row["ma60"]) if pd.notna(row["ma60"]) else float("nan") + close = float(row["close"]) + return 0.5 if pd.notna(ma60) and close < ma60 else 1.0 + raise KeyError(f"Unknown throttle: {throttle_name}") + + +def run_followup_backtest( + qqq_ohlc: pd.DataFrame, + asset_returns: pd.DataFrame, + indicators: pd.DataFrame, + *, + throttle: ThrottleConfig, + idle_asset: str, + starting_equity: float = base.ATTACK_ONLY_STARTING_EQUITY, + cash_reserve_ratio: float = 0.05, + rebalance_threshold_ratio: float = 0.01, + alloc_tier1_breakpoints=(0, 15_000, 30_000, 70_000), + alloc_tier1_values=(1.0, 0.95, 0.85, 0.70), + alloc_tier2_breakpoints=(70_000, 140_000), + alloc_tier2_values=(0.70, 0.50), + risk_leverage_factor: float = 3.0, + risk_agg_cap: float = 0.50, + risk_numerator: float = 0.30, + atr_exit_scale: float = 2.0, + atr_entry_scale: float = 2.5, + exit_line_floor: float = 0.92, + exit_line_cap: float = 0.98, + entry_line_floor: float = 1.02, + entry_line_cap: float = 1.08, +) -> StrategyRun: + idle_asset = idle_asset.upper() + index = asset_returns.index.intersection(qqq_ohlc.index) + strategy_symbols = ["TQQQ", SAFE_HAVEN, "QQQ", CASH_SYMBOL] + weights_history = pd.DataFrame(0.0, index=index, columns=strategy_symbols) + portfolio_returns = pd.Series(0.0, index=index, name=f"{throttle.name}__{idle_asset.lower()}") + turnover_history = pd.Series(0.0, index=index, name="turnover") + + current_equity = float(starting_equity) + current_weights: dict[str, float] = {idle_asset if idle_asset != CASH_SYMBOL else CASH_SYMBOL: 1.0} + + for idx in range(len(index) - 1): + date = index[idx] + next_date = index[idx + 1] + row = indicators.loc[date] + qqq_p = float(row["close"]) + ma200 = float(row["ma200"]) if pd.notna(row["ma200"]) else float("nan") + + history = qqq_ohlc.loc[:date] + true_range = pd.concat( + [ + history["high"] - history["low"], + (history["high"] - history["close"].shift(1)).abs(), + (history["low"] - history["close"].shift(1)).abs(), + ], + axis=1, + ).max(axis=1) + atr_pct = float(true_range.rolling(14).mean().iloc[-1] / qqq_p) if len(history) >= 14 else 0.0 + exit_line = ma200 * max(exit_line_floor, min(exit_line_cap, 1.0 - (atr_pct * atr_exit_scale))) if pd.notna(ma200) else float("nan") + entry_line = ma200 * max(entry_line_floor, min(entry_line_cap, 1.0 + (atr_pct * atr_entry_scale))) if pd.notna(ma200) else float("nan") + + reserved = current_equity * cash_reserve_ratio + agg_ratio, _ = get_hybrid_allocation( + current_equity, + qqq_p, + exit_line if pd.notna(exit_line) else qqq_p, + alloc_tier1_breakpoints=alloc_tier1_breakpoints, + alloc_tier1_values=alloc_tier1_values, + alloc_tier2_breakpoints=alloc_tier2_breakpoints, + alloc_tier2_values=alloc_tier2_values, + risk_leverage_factor=risk_leverage_factor, + risk_agg_cap=risk_agg_cap, + risk_numerator=risk_numerator, + ) + + current_tqqq_weight = current_weights.get("TQQQ", 0.0) + target_tqqq_ratio = 0.0 + if current_tqqq_weight > 1e-12: + if qqq_p < exit_line: + target_tqqq_ratio = 0.0 + elif qqq_p < ma200: + target_tqqq_ratio = agg_ratio * 0.33 + else: + target_tqqq_ratio = agg_ratio + elif qqq_p > entry_line: + target_tqqq_ratio = agg_ratio + + target_tqqq_ratio *= throttle_multiplier(throttle.name, row) + + target_tqqq_value = current_equity * target_tqqq_ratio + idle_value = max(0.0, (current_equity - reserved) - target_tqqq_value) + target_weights = base.build_target_weights( + current_equity=current_equity, + target_tqqq_value=target_tqqq_value, + idle_value=idle_value, + reserved_value=reserved, + idle_asset=idle_asset, + ) + + rebalance_needed = any( + abs(target_weights.get(symbol, 0.0) - current_weights.get(symbol, 0.0)) > rebalance_threshold_ratio + for symbol in set(target_weights) | set(current_weights) + ) + if rebalance_needed: + turnover_history.at[next_date] = suite.compute_turnover(current_weights, target_weights) + current_weights = target_weights + + for symbol, weight in current_weights.items(): + if symbol in weights_history.columns: + weights_history.at[date, symbol] = weight + + next_returns = asset_returns.loc[next_date] + portfolio_returns.at[next_date] = sum( + weight * float(next_returns.get(symbol, 0.0)) + for symbol, weight in current_weights.items() + if symbol != CASH_SYMBOL + ) + current_equity *= 1.0 + float(portfolio_returns.at[next_date]) + + for symbol, weight in current_weights.items(): + if symbol in weights_history.columns: + weights_history.at[index[-1], symbol] = weight + + metadata = { + "family": "hybrid_growth_tqqq_attack_followup", + "throttle": throttle.name, + "throttle_description": throttle.description, + "idle_asset": idle_asset, + } + return StrategyRun( + strategy_name=f"hybrid_tqqq_followup::{throttle.name}::{idle_asset.lower()}", + display_name=f"hybrid_tqqq_followup::{throttle.name}::{idle_asset.lower()}", + gross_returns=portfolio_returns, + weights_history=weights_history, + turnover_history=turnover_history, + metadata=metadata, + ) + + +def summarize_period(run: StrategyRun, benchmark_returns: pd.Series, *, cost_bps: float, start: str | None, end: str | None) -> dict[str, object]: + returns = run.gross_returns.copy() + turnover = run.turnover_history.reindex(returns.index).fillna(0.0) + net_returns = returns - turnover * (float(cost_bps) / 10_000.0) + weights = run.weights_history.copy() + + if start: + net_returns = net_returns.loc[start:] + weights = weights.loc[start:] + turnover = turnover.loc[start:] + if end: + net_returns = net_returns.loc[:end] + weights = weights.loc[:end] + turnover = turnover.loc[:end] + + net_returns = net_returns.dropna() + benchmark = benchmark_returns.reindex(net_returns.index).fillna(0.0) + weights = weights.reindex(net_returns.index).fillna(0.0) + if net_returns.empty: + raise RuntimeError("No returns remain inside selected period") + + equity_curve = (1.0 + net_returns).cumprod() + total_return = float(equity_curve.iloc[-1] - 1.0) + years = max((net_returns.index[-1] - net_returns.index[0]).days / 365.25, 1 / 365.25) + cagr = float(equity_curve.iloc[-1] ** (1.0 / years) - 1.0) + drawdown = equity_curve / equity_curve.cummax() - 1.0 + max_drawdown = float(drawdown.min()) + std = float(net_returns.std(ddof=0)) + sharpe = float(net_returns.mean() / std * math.sqrt(252)) if std else float("nan") + beta = suite.compute_beta(net_returns, benchmark) + information_ratio = suite.compute_information_ratio(net_returns, benchmark) + up_capture, down_capture = suite.compute_capture_ratios(net_returns, benchmark) + + aligned = pd.concat([net_returns.rename("strategy"), benchmark.rename("benchmark")], axis=1).dropna() + if aligned.empty or math.isnan(beta): + alpha_ann = float("nan") + else: + alpha_daily = float((aligned["strategy"] - beta * aligned["benchmark"]).mean()) + alpha_ann = alpha_daily * 252.0 + + return { + "Start": str(net_returns.index[0].date()), + "End": str(net_returns.index[-1].date()), + "Total Return": total_return, + "CAGR": cagr, + "Max Drawdown": max_drawdown, + "Sharpe": sharpe, + "Beta vs QQQ": beta, + "Alpha Ann vs QQQ": alpha_ann, + "Information Ratio vs QQQ": information_ratio, + "Up Capture vs QQQ": up_capture, + "Down Capture vs QQQ": down_capture, + "Turnover/Year": float(turnover.sum() / years), + "Average TQQQ Weight": float(weights.get("TQQQ", pd.Series(0.0, index=weights.index)).mean()), + "Average Idle Asset Weight": float(weights.get(str(run.metadata['idle_asset']), pd.Series(0.0, index=weights.index)).mean()), + "Average Cash Weight": float(weights.get(CASH_SYMBOL, pd.Series(0.0, index=weights.index)).mean()), + "2022 Return": suite.compute_period_total_return(net_returns, "2022-01-01", "2022-12-31"), + "2023+ CAGR": suite.compute_period_cagr(net_returns, "2023-01-01", None), + } + + +def build_summary(runs: list[StrategyRun], benchmark_returns: pd.Series, costs_bps: list[float]) -> pd.DataFrame: + rows: list[dict[str, object]] = [] + for run in runs: + for cost_bps in costs_bps: + for period_name, start, end in PERIODS: + rows.append({ + "strategy": run.strategy_name, + "display_name": run.display_name, + "cost_bps_one_way": float(cost_bps), + "period": period_name, + **summarize_period(run, benchmark_returns, cost_bps=float(cost_bps), start=start, end=end), + **run.metadata, + }) + return pd.DataFrame(rows) + + +def build_recommendation(summary: pd.DataFrame) -> dict[str, object]: + oos = summary[(summary['period'] == '2023+') & (summary['cost_bps_one_way'] == 5.0)].copy() + baseline = oos[oos['throttle'] == 'baseline'].copy() + throttle = oos[oos['throttle'] == 'ma60_half'].copy() + best_baseline = baseline.sort_values('CAGR', ascending=False).iloc[0] + safest_baseline = baseline.sort_values('Max Drawdown', ascending=False).iloc[0] + best_throttle = throttle.sort_values('CAGR', ascending=False).iloc[0] + + 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.' + ) + return { + 'best_baseline_by_cagr': { + 'idle_asset': str(best_baseline['idle_asset']), + 'oos_cagr': float(best_baseline['CAGR']), + 'oos_max_drawdown': float(best_baseline['Max Drawdown']), + 'oos_ir_vs_qqq': float(best_baseline['Information Ratio vs QQQ']), + 'return_2022': float(best_baseline['2022 Return']) if pd.notna(best_baseline['2022 Return']) else None, + }, + 'safest_baseline_idle_asset': { + 'idle_asset': str(safest_baseline['idle_asset']), + 'oos_cagr': float(safest_baseline['CAGR']), + 'oos_max_drawdown': float(safest_baseline['Max Drawdown']), + }, + 'best_throttle_candidate': { + 'idle_asset': str(best_throttle['idle_asset']), + 'oos_cagr': float(best_throttle['CAGR']), + 'oos_max_drawdown': float(best_throttle['Max Drawdown']), + 'oos_ir_vs_qqq': float(best_throttle['Information Ratio vs QQQ']), + 'return_2022': float(best_throttle['2022 Return']) if pd.notna(best_throttle['2022 Return']) else None, + }, + 'verdict': verdict, + } + + +def build_markdown(summary: pd.DataFrame, recommendation: dict[str, object]) -> str: + focus = summary[(summary['period'] == '2023+') & (summary['cost_bps_one_way'] == 5.0)].copy() + focus = focus.sort_values(['throttle', 'idle_asset']) + idle_2022 = summary[(summary['period'] == '2022') & (summary['cost_bps_one_way'] == 5.0)].copy() + idle_2022 = idle_2022.sort_values(['throttle', 'idle_asset']) + + lines = [ + '# TQQQ idle-asset and minimal-throttle follow-up', + '', + '## Setup', + '- Attack-only normalization: isolate the TQQQ sleeve and compare idle assets directly.', + '- Baseline: existing MA200 + ATR staged TQQQ logic.', + '- Minimal throttle: if QQQ closes below MA60, cut the computed TQQQ target by 50%.', + '- Idle assets tested: `CASH`, `BOXX`, `QQQ`.', + '', + '## OOS 2023+ (5 bps)', + base.frame_to_markdown_table(focus[[ + 'throttle', 'idle_asset', 'CAGR', 'Max Drawdown', 'Information Ratio vs QQQ', + 'Alpha Ann vs QQQ', 'Turnover/Year', 'Average TQQQ Weight', 'Average Idle Asset Weight' + ]]), + '', + '## 2022 (5 bps)', + base.frame_to_markdown_table(idle_2022[[ + 'throttle', 'idle_asset', 'Total Return', '2022 Return', 'Max Drawdown', 'Turnover/Year', + 'Average TQQQ Weight', 'Average Idle Asset Weight' + ]]), + '', + '## Recommendation', + f"- {recommendation['verdict']}", + ] + return '\n'.join(lines) + '\n' + + +def main() -> None: + args = parse_args() + results_dir = Path(args.results_dir).expanduser().resolve() + results_dir.mkdir(parents=True, exist_ok=True) + + etf_frames = suite.download_etf_ohlcv(("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI"), start=args.start, end=args.end) + qqq_ohlc = pd.DataFrame({ + 'open': etf_frames['open']['QQQ'], + 'high': etf_frames['high']['QQQ'], + 'low': etf_frames['low']['QQQ'], + 'close': etf_frames['close']['QQQ'], + }).dropna() + master_index = qqq_ohlc.index + rows = suite.build_extra_etf_price_history(etf_frames, symbols=("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI")) + _, returns_matrix = suite.build_asset_return_matrix(rows, master_index=master_index, required_symbols=("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI")) + returns_matrix[CASH_SYMBOL] = 0.0 + indicators = base.build_indicator_frame(qqq_ohlc, etf_frames['volume']['QQQ'].reindex(master_index).fillna(0.0)) + + runs: list[StrategyRun] = [] + for throttle in THROTTLES: + for idle_asset in (CASH_SYMBOL, SAFE_HAVEN, 'QQQ'): + runs.append(run_followup_backtest(qqq_ohlc, returns_matrix, indicators, throttle=throttle, idle_asset=idle_asset)) + + summary = build_summary(runs, returns_matrix['QQQ'].copy(), list(args.cost_bps)) + recommendation = build_recommendation(summary) + + comparison_path = results_dir / 'tqqq_hybrid_idle_throttle_followup_comparison.csv' + summary_path = results_dir / 'tqqq_hybrid_idle_throttle_followup_summary.md' + recommendation_path = results_dir / 'tqqq_hybrid_idle_throttle_followup_recommendation.json' + summary.to_csv(comparison_path, index=False) + summary_path.write_text(build_markdown(summary, recommendation), encoding='utf-8') + recommendation_path.write_text(json.dumps(recommendation, indent=2, ensure_ascii=False), encoding='utf-8') + + print(f'wrote {comparison_path}') + print(f'wrote {summary_path}') + print(f'wrote {recommendation_path}') + + +if __name__ == '__main__': + main() diff --git a/research/backtest_hybrid_growth_indicator_variants.py b/research/backtest_hybrid_growth_indicator_variants.py new file mode 100644 index 0000000..12dade4 --- /dev/null +++ b/research/backtest_hybrid_growth_indicator_variants.py @@ -0,0 +1,770 @@ +#!/usr/bin/env python3 +"""Research-only TQQQ / hybrid_growth_income indicator overlay study. + +Goal: +- keep the current hybrid growth attack logic as the baseline; +- test a few simple daily indicator gates on top of the existing QQQ MA200 + ATR logic; +- compare idle capital parked in CASH / BOXX / QQQ; +- answer whether extra indicators add value without obviously overfitting. +""" + +from __future__ import annotations + +import argparse +import json +import math +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable + +import numpy as np +import pandas as pd + +CURRENT_DIR = Path(__file__).resolve().parent +if str(CURRENT_DIR) not in sys.path: + sys.path.insert(0, str(CURRENT_DIR)) + +import backtest_stock_alpha_suite as suite # noqa: E402 +from us_equity_strategies.strategies.hybrid_growth_income import get_hybrid_allocation # noqa: E402 + +DEFAULT_RESULTS_DIR = Path(__file__).resolve().parent / "results" +DEFAULT_START = "2018-01-01" +DEFAULT_COSTS_BPS = (0.0, 5.0, 10.0) +PERIODS = ( + ("Full Sample", None, None), + ("2018-2021", "2018-01-01", "2021-12-31"), + ("2022", "2022-01-01", "2022-12-31"), + ("2023+", "2023-01-01", None), +) +ATTACK_ONLY_STARTING_EQUITY = 50_000.0 +RUNTIME_FULL_STARTING_EQUITY = 200_000.0 +CASH_SYMBOL = "CASH" +SAFE_HAVEN = "BOXX" + + +@dataclass(frozen=True) +class OverlayConfig: + name: str + description: str + entry_confirm_days: int = 2 + exit_confirm_days: int = 2 + + +@dataclass(frozen=True) +class BacktestConfig: + overlay: OverlayConfig + idle_asset: str + income_mode: str # attack_only | runtime_full_reference + + +@dataclass +class StrategyRun: + strategy_name: str + display_name: str + gross_returns: pd.Series + weights_history: pd.DataFrame + turnover_history: pd.Series + metadata: dict[str, object] + raw_gate: pd.Series + active_gate: pd.Series + + +OVERLAY_CONFIGS: tuple[OverlayConfig, ...] = ( + OverlayConfig( + name="baseline", + description="Current MA200 + ATR baseline with no extra daily gate.", + ), + OverlayConfig( + name="ma20_ma60_stack", + description="Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.", + ), + OverlayConfig( + name="ma_stack_rsi_macd", + description="MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.", + ), + OverlayConfig( + name="consensus_5", + description="MA stack + RSI + MACD + MFI > 50 + CCI > 0.", + ), + OverlayConfig( + name="consensus_7_weekly_kdj", + description="Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.", + ), +) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--results-dir", default=str(DEFAULT_RESULTS_DIR)) + parser.add_argument("--start", default=DEFAULT_START) + parser.add_argument("--end", default=None) + parser.add_argument( + "--cost-bps", + nargs="*", + type=float, + default=list(DEFAULT_COSTS_BPS), + help="One-way turnover cost assumptions in bps.", + ) + return parser.parse_args() + + +def compute_rsi(close: pd.Series, window: int = 14) -> pd.Series: + delta = close.diff() + gains = delta.clip(lower=0.0) + losses = (-delta).clip(lower=0.0) + avg_gain = gains.ewm(alpha=1 / window, min_periods=window, adjust=False).mean() + avg_loss = losses.ewm(alpha=1 / window, min_periods=window, adjust=False).mean() + rs = avg_gain / avg_loss.replace(0.0, np.nan) + rsi = 100.0 - (100.0 / (1.0 + rs)) + return rsi.fillna(50.0) + + +def compute_macd(close: pd.Series) -> tuple[pd.Series, pd.Series, pd.Series]: + ema12 = close.ewm(span=12, adjust=False).mean() + ema26 = close.ewm(span=26, adjust=False).mean() + macd_line = ema12 - ema26 + signal_line = macd_line.ewm(span=9, adjust=False).mean() + histogram = macd_line - signal_line + return macd_line, signal_line, histogram + + +def compute_mfi(high: pd.Series, low: pd.Series, close: pd.Series, volume: pd.Series, window: int = 14) -> pd.Series: + typical_price = (high + low + close) / 3.0 + money_flow = typical_price * volume.fillna(0.0) + direction = typical_price.diff() + positive_flow = money_flow.where(direction > 0.0, 0.0) + negative_flow = money_flow.where(direction < 0.0, 0.0) + pos_sum = positive_flow.rolling(window).sum() + neg_sum = negative_flow.abs().rolling(window).sum() + ratio = pos_sum / neg_sum.replace(0.0, np.nan) + mfi = 100.0 - (100.0 / (1.0 + ratio)) + return mfi.fillna(50.0) + + +def compute_cci(high: pd.Series, low: pd.Series, close: pd.Series, window: int = 20) -> pd.Series: + typical_price = (high + low + close) / 3.0 + sma = typical_price.rolling(window).mean() + mad = typical_price.rolling(window).apply(lambda values: np.mean(np.abs(values - values.mean())), raw=False) + cci = (typical_price - sma) / (0.015 * mad.replace(0.0, np.nan)) + return cci.fillna(0.0) + + +def compute_weekly_kdj(ohlc: pd.DataFrame, window: int = 9) -> pd.DataFrame: + weekly = ohlc.resample("W-FRI").agg({"open": "first", "high": "max", "low": "min", "close": "last"}).dropna() + lowest = weekly["low"].rolling(window).min() + highest = weekly["high"].rolling(window).max() + rsv = ((weekly["close"] - lowest) / (highest - lowest).replace(0.0, np.nan) * 100.0).fillna(50.0) + k_values: list[float] = [] + d_values: list[float] = [] + k_prev = 50.0 + d_prev = 50.0 + for value in rsv: + k_prev = (2.0 / 3.0) * k_prev + (1.0 / 3.0) * float(value) + d_prev = (2.0 / 3.0) * d_prev + (1.0 / 3.0) * k_prev + k_values.append(k_prev) + d_values.append(d_prev) + weekly["weekly_k"] = k_values + weekly["weekly_d"] = d_values + weekly["weekly_j"] = 3.0 * weekly["weekly_k"] - 2.0 * weekly["weekly_d"] + daily = weekly[["weekly_k", "weekly_d", "weekly_j"]].reindex(ohlc.index, method="ffill") + return daily.fillna(50.0) + + +def build_indicator_frame(qqq_ohlc: pd.DataFrame, qqq_volume: pd.Series) -> pd.DataFrame: + close = qqq_ohlc["close"].copy() + high = qqq_ohlc["high"].copy() + low = qqq_ohlc["low"].copy() + indicators = pd.DataFrame(index=close.index) + indicators["close"] = close + indicators["ma20"] = close.rolling(20).mean() + indicators["ma60"] = close.rolling(60).mean() + indicators["ma200"] = close.rolling(200).mean() + indicators["rsi14"] = compute_rsi(close, 14) + macd_line, macd_signal, macd_hist = compute_macd(close) + indicators["macd_line"] = macd_line + indicators["macd_signal"] = macd_signal + indicators["macd_hist"] = macd_hist + indicators["mfi14"] = compute_mfi(high, low, close, qqq_volume, 14) + indicators["cci20"] = compute_cci(high, low, close, 20) + indicators["bias20"] = (close / indicators["ma20"] - 1.0).replace([np.inf, -np.inf], np.nan).fillna(0.0) + indicators = indicators.join(compute_weekly_kdj(qqq_ohlc)) + return indicators + + +def build_raw_gate(indicators: pd.DataFrame, overlay_name: str) -> pd.Series: + ma_stack = (indicators["close"] > indicators["ma20"]) & (indicators["ma20"] > indicators["ma60"]) + rsi_macd = ma_stack & (indicators["rsi14"] > 55.0) & (indicators["macd_line"] > indicators["macd_signal"]) + consensus_5 = rsi_macd & (indicators["mfi14"] > 50.0) & (indicators["cci20"] > 0.0) + consensus_7 = ( + consensus_5 + & (indicators["bias20"] > 0.0) + & (indicators["weekly_k"] > indicators["weekly_d"]) + & (indicators["weekly_j"] > 50.0) + ) + mapping = { + "baseline": pd.Series(True, index=indicators.index), + "ma20_ma60_stack": ma_stack, + "ma_stack_rsi_macd": rsi_macd, + "consensus_5": consensus_5, + "consensus_7_weekly_kdj": consensus_7, + } + return mapping[overlay_name].fillna(False) + + +def apply_confirmation_gate(raw_gate: pd.Series, *, entry_confirm_days: int, exit_confirm_days: int) -> pd.Series: + active = False + true_streak = 0 + false_streak = 0 + values: list[bool] = [] + for value in raw_gate.fillna(False).astype(bool): + if value: + true_streak += 1 + false_streak = 0 + if not active and true_streak >= entry_confirm_days: + active = True + else: + false_streak += 1 + true_streak = 0 + if active and false_streak >= exit_confirm_days: + active = False + values.append(active) + return pd.Series(values, index=raw_gate.index, dtype=bool) + + +def select_symbols(idle_asset: str) -> list[str]: + symbols = ["QQQ", "TQQQ", SAFE_HAVEN] + idle = str(idle_asset).strip().upper() + if idle not in symbols and idle != CASH_SYMBOL: + symbols.append(idle) + return symbols + + +def build_target_weights(*, current_equity: float, target_tqqq_value: float, idle_value: float, reserved_value: float, idle_asset: str) -> dict[str, float]: + idle_symbol = str(idle_asset).strip().upper() + target_values: dict[str, float] = {"TQQQ": max(0.0, target_tqqq_value)} + if idle_symbol == CASH_SYMBOL: + target_values[CASH_SYMBOL] = max(0.0, idle_value + reserved_value) + else: + target_values[idle_symbol] = max(0.0, idle_value) + target_values[CASH_SYMBOL] = max(0.0, reserved_value) + target_weights = { + symbol: value / current_equity + for symbol, value in target_values.items() + if current_equity > 0.0 and value > 1e-12 + } + if not target_weights: + target_weights = {CASH_SYMBOL: 1.0} + return target_weights + + +def run_attack_only_variant_backtest( + qqq_ohlc: pd.DataFrame, + asset_returns: pd.DataFrame, + indicators: pd.DataFrame, + *, + config: BacktestConfig, + starting_equity: float = ATTACK_ONLY_STARTING_EQUITY, + cash_reserve_ratio: float = 0.05, + rebalance_threshold_ratio: float = 0.01, + alloc_tier1_breakpoints: Iterable[float] = (0, 15_000, 30_000, 70_000), + alloc_tier1_values: Iterable[float] = (1.0, 0.95, 0.85, 0.70), + alloc_tier2_breakpoints: Iterable[float] = (70_000, 140_000), + alloc_tier2_values: Iterable[float] = (0.70, 0.50), + risk_leverage_factor: float = 3.0, + risk_agg_cap: float = 0.50, + risk_numerator: float = 0.30, + atr_exit_scale: float = 2.0, + atr_entry_scale: float = 2.5, + exit_line_floor: float = 0.92, + exit_line_cap: float = 0.98, + entry_line_floor: float = 1.02, + entry_line_cap: float = 1.08, +) -> StrategyRun: + idle_asset = str(config.idle_asset).strip().upper() + raw_gate = build_raw_gate(indicators, config.overlay.name) + active_gate = apply_confirmation_gate( + raw_gate, + entry_confirm_days=config.overlay.entry_confirm_days, + exit_confirm_days=config.overlay.exit_confirm_days, + ) + + strategy_symbols = ["TQQQ", SAFE_HAVEN, "QQQ", CASH_SYMBOL] + strategy_symbols = [symbol for symbol in strategy_symbols if symbol in set(select_symbols(idle_asset)) | {CASH_SYMBOL, "TQQQ"}] + index = asset_returns.index.intersection(qqq_ohlc.index) + weights_history = pd.DataFrame(0.0, index=index, columns=strategy_symbols) + portfolio_returns = pd.Series(0.0, index=index, name=f"{config.overlay.name}__{idle_asset.lower()}") + turnover_history = pd.Series(0.0, index=index, name="turnover") + + initial_idle_symbol = idle_asset if idle_asset != CASH_SYMBOL else CASH_SYMBOL + current_weights: dict[str, float] = {initial_idle_symbol: 1.0} + current_equity = float(starting_equity) + + for idx in range(len(index) - 1): + date = index[idx] + next_date = index[idx + 1] + row = indicators.loc[date] + qqq_p = float(row["close"]) + ma200 = float(row["ma200"]) if pd.notna(row["ma200"]) else float("nan") + + history = qqq_ohlc.loc[:date] + true_range = pd.concat( + [ + history["high"] - history["low"], + (history["high"] - history["close"].shift(1)).abs(), + (history["low"] - history["close"].shift(1)).abs(), + ], + axis=1, + ).max(axis=1) + atr_pct = float(true_range.rolling(14).mean().iloc[-1] / qqq_p) if len(history) >= 14 else 0.0 + exit_line = ma200 * max(exit_line_floor, min(exit_line_cap, 1.0 - (atr_pct * atr_exit_scale))) if pd.notna(ma200) else float("nan") + entry_line = ma200 * max(entry_line_floor, min(entry_line_cap, 1.0 + (atr_pct * atr_entry_scale))) if pd.notna(ma200) else float("nan") + + strategy_equity = current_equity + reserved = strategy_equity * cash_reserve_ratio + agg_ratio, _ = get_hybrid_allocation( + strategy_equity, + qqq_p, + exit_line if pd.notna(exit_line) else qqq_p, + alloc_tier1_breakpoints=alloc_tier1_breakpoints, + alloc_tier1_values=alloc_tier1_values, + alloc_tier2_breakpoints=alloc_tier2_breakpoints, + alloc_tier2_values=alloc_tier2_values, + risk_leverage_factor=risk_leverage_factor, + risk_agg_cap=risk_agg_cap, + risk_numerator=risk_numerator, + ) + + current_tqqq_weight = current_weights.get("TQQQ", 0.0) + target_tqqq_ratio = 0.0 + if current_tqqq_weight > 1e-12: + if qqq_p < exit_line: + target_tqqq_ratio = 0.0 + elif qqq_p < ma200: + target_tqqq_ratio = agg_ratio * 0.33 + else: + target_tqqq_ratio = agg_ratio + elif qqq_p > entry_line: + target_tqqq_ratio = agg_ratio + + if not bool(active_gate.loc[date]): + target_tqqq_ratio = 0.0 + + target_tqqq_value = strategy_equity * target_tqqq_ratio + idle_value = max(0.0, (strategy_equity - reserved) - target_tqqq_value) + target_weights = build_target_weights( + current_equity=current_equity, + target_tqqq_value=target_tqqq_value, + idle_value=idle_value, + reserved_value=reserved, + idle_asset=idle_asset, + ) + + rebalance_needed = any( + abs(target_weights.get(symbol, 0.0) - current_weights.get(symbol, 0.0)) > rebalance_threshold_ratio + for symbol in set(target_weights) | set(current_weights) + ) + if rebalance_needed: + turnover_history.at[next_date] = suite.compute_turnover(current_weights, target_weights) + current_weights = target_weights + + for symbol, weight in current_weights.items(): + if symbol in weights_history.columns: + weights_history.at[date, symbol] = weight + + next_returns = asset_returns.loc[next_date] + portfolio_returns.at[next_date] = sum( + weight * float(next_returns.get(symbol, 0.0)) + for symbol, weight in current_weights.items() + if symbol != CASH_SYMBOL + ) + current_equity *= 1.0 + float(portfolio_returns.at[next_date]) + + for symbol, weight in current_weights.items(): + if symbol in weights_history.columns: + weights_history.at[index[-1], symbol] = weight + + metadata = { + "family": "hybrid_growth_tqqq_attack_only", + "overlay": config.overlay.name, + "overlay_description": config.overlay.description, + "idle_asset": idle_asset, + "entry_confirm_days": config.overlay.entry_confirm_days, + "exit_confirm_days": config.overlay.exit_confirm_days, + "income_mode": config.income_mode, + "safe_haven_symbols": tuple(symbol for symbol in (SAFE_HAVEN, CASH_SYMBOL, idle_asset) if symbol != "TQQQ"), + } + return StrategyRun( + strategy_name=f"hybrid_tqqq::{config.overlay.name}::{idle_asset.lower()}", + display_name=f"hybrid_tqqq::{config.overlay.name}::{idle_asset.lower()}", + gross_returns=portfolio_returns, + weights_history=weights_history, + turnover_history=turnover_history, + metadata=metadata, + raw_gate=raw_gate.reindex(index).fillna(False), + active_gate=active_gate.reindex(index).fillna(False), + ) + + +def summarize_strategy_period( + strategy_run: StrategyRun, + benchmark_returns: pd.Series, + *, + cost_bps: float, + start: str | None, + end: str | None, +) -> dict[str, object]: + returns = strategy_run.gross_returns.copy() + turnover = strategy_run.turnover_history.reindex(returns.index).fillna(0.0) + net_returns = returns - turnover * (float(cost_bps) / 10_000.0) + weights = strategy_run.weights_history.copy() + raw_gate = strategy_run.raw_gate.copy() + active_gate = strategy_run.active_gate.copy() + + if start: + net_returns = net_returns.loc[start:] + weights = weights.loc[start:] + turnover = turnover.loc[start:] + raw_gate = raw_gate.loc[start:] + active_gate = active_gate.loc[start:] + if end: + net_returns = net_returns.loc[:end] + weights = weights.loc[:end] + turnover = turnover.loc[:end] + raw_gate = raw_gate.loc[:end] + active_gate = active_gate.loc[:end] + + net_returns = net_returns.dropna() + benchmark = benchmark_returns.reindex(net_returns.index).fillna(0.0) + weights = weights.reindex(net_returns.index).fillna(0.0) + raw_gate = raw_gate.reindex(net_returns.index).fillna(False) + active_gate = active_gate.reindex(net_returns.index).fillna(False) + if net_returns.empty: + raise RuntimeError("No returns remain inside selected period") + + equity_curve = (1.0 + net_returns).cumprod() + total_return = float(equity_curve.iloc[-1] - 1.0) + years = max((net_returns.index[-1] - net_returns.index[0]).days / 365.25, 1 / 365.25) + cagr = float(equity_curve.iloc[-1] ** (1.0 / years) - 1.0) + drawdown = equity_curve / equity_curve.cummax() - 1.0 + max_drawdown = float(drawdown.min()) + std = float(net_returns.std(ddof=0)) + volatility = std * math.sqrt(252) if std else float("nan") + sharpe = float(net_returns.mean() / std * math.sqrt(252)) if std else float("nan") + beta = suite.compute_beta(net_returns, benchmark) + information_ratio = suite.compute_information_ratio(net_returns, benchmark) + up_capture, down_capture = suite.compute_capture_ratios(net_returns, benchmark) + + aligned = pd.concat([net_returns.rename("strategy"), benchmark.rename("benchmark")], axis=1).dropna() + if aligned.empty or math.isnan(beta): + alpha_ann = float("nan") + else: + alpha_daily = float((aligned["strategy"] - beta * aligned["benchmark"]).mean()) + alpha_ann = alpha_daily * 252.0 + + avg_tqqq_weight = float(weights.get("TQQQ", pd.Series(0.0, index=weights.index)).mean()) + idle_asset = str(strategy_run.metadata["idle_asset"]) + avg_idle_weight = float(weights.get(idle_asset, pd.Series(0.0, index=weights.index)).mean()) + avg_cash_weight = float(weights.get(CASH_SYMBOL, pd.Series(0.0, index=weights.index)).mean()) + tqqq_days_share = float((weights.get("TQQQ", pd.Series(0.0, index=weights.index)) > 1e-12).mean()) + gate_active_share = float(active_gate.astype(float).mean()) + raw_gate_true_share = float(raw_gate.astype(float).mean()) + gate_flips = active_gate.astype(int).diff().abs().fillna(0.0) + gate_flips_per_year = float(gate_flips.sum() / years) + turnover_per_year = float(turnover.sum() / years) + total_2022 = suite.compute_period_total_return(net_returns, "2022-01-01", "2022-12-31") + cagr_2023_plus = suite.compute_period_cagr(net_returns, "2023-01-01", None) + + return { + "Start": str(net_returns.index[0].date()), + "End": str(net_returns.index[-1].date()), + "Total Return": total_return, + "CAGR": cagr, + "Max Drawdown": max_drawdown, + "Volatility": volatility, + "Sharpe": sharpe, + "Beta vs QQQ": beta, + "Alpha Ann vs QQQ": alpha_ann, + "Information Ratio vs QQQ": information_ratio, + "Up Capture vs QQQ": up_capture, + "Down Capture vs QQQ": down_capture, + "Turnover/Year": turnover_per_year, + "2022 Return": total_2022, + "2023+ CAGR": cagr_2023_plus, + "Average TQQQ Weight": avg_tqqq_weight, + "Average Idle Asset Weight": avg_idle_weight, + "Average Cash Weight": avg_cash_weight, + "TQQQ Days Share": tqqq_days_share, + "Raw Gate True Share": raw_gate_true_share, + "Gate Active Share": gate_active_share, + "Gate Flips/Year": gate_flips_per_year, + } + + +def build_summary_rows(strategy_runs: list[StrategyRun], benchmark_returns: pd.Series, costs_bps: Iterable[float]) -> pd.DataFrame: + rows: list[dict[str, object]] = [] + for run in strategy_runs: + for cost_bps in costs_bps: + for period_name, start, end in PERIODS: + metrics = summarize_strategy_period(run, benchmark_returns, cost_bps=float(cost_bps), start=start, end=end) + rows.append( + { + "strategy": run.strategy_name, + "display_name": run.display_name, + "cost_bps_one_way": float(cost_bps), + "period": period_name, + **metrics, + **run.metadata, + } + ) + return pd.DataFrame(rows) + + +def build_runtime_full_reference(qqq_ohlc: pd.DataFrame, asset_returns: pd.DataFrame) -> StrategyRun: + full_returns, full_weights, full_turnover = suite.run_hybrid_growth_income_backtest( + qqq_ohlc, + asset_returns, + starting_equity=RUNTIME_FULL_STARTING_EQUITY, + income_threshold_usd=100_000.0, + qqqi_income_ratio=0.50, + cash_reserve_ratio=0.05, + rebalance_threshold_ratio=0.01, + alloc_tier1_breakpoints=(0, 15_000, 30_000, 70_000), + alloc_tier1_values=(1.0, 0.95, 0.85, 0.70), + alloc_tier2_breakpoints=(70_000, 140_000), + alloc_tier2_values=(0.70, 0.50), + risk_leverage_factor=3.0, + risk_agg_cap=0.50, + risk_numerator=0.30, + atr_exit_scale=2.0, + atr_entry_scale=2.5, + exit_line_floor=0.92, + exit_line_cap=0.98, + entry_line_floor=1.02, + entry_line_cap=1.08, + ) + index = full_returns.index + return StrategyRun( + strategy_name="hybrid_growth_income_runtime_full_reference", + display_name="hybrid_growth_income_runtime_full_reference", + gross_returns=full_returns, + weights_history=full_weights.reindex(index).fillna(0.0), + turnover_history=full_turnover.reindex(index).fillna(0.0), + metadata={ + "family": "hybrid_growth_runtime_full_reference", + "overlay": "baseline", + "overlay_description": "Current runtime full strategy with income layer and BOXX idle asset.", + "idle_asset": SAFE_HAVEN, + "entry_confirm_days": 0, + "exit_confirm_days": 0, + "income_mode": "runtime_full_reference", + }, + raw_gate=pd.Series(True, index=index), + active_gate=pd.Series(True, index=index), + ) + + +def choose_recommendation(summary: pd.DataFrame) -> dict[str, object]: + oos = summary.loc[(summary["period"] == "2023+") & (summary["cost_bps_one_way"] == 5.0)].copy() + baseline_boxx = oos.loc[ + (oos["overlay"] == "baseline") + & (oos["idle_asset"] == "BOXX") + & (oos["income_mode"] == "attack_only") + ].iloc[0] + + attack_only = oos.loc[oos["income_mode"] == "attack_only"].copy() + attack_only["score"] = ( + attack_only["Information Ratio vs QQQ"].fillna(-999.0) * 4.0 + + attack_only["Alpha Ann vs QQQ"].fillna(-999.0) * 2.0 + + attack_only["CAGR"].fillna(-999.0) + - attack_only["Max Drawdown"].abs().fillna(999.0) + - attack_only["Turnover/Year"].fillna(999.0) * 0.03 + ) + best = attack_only.sort_values("score", ascending=False).iloc[0] + + idle_slice = attack_only.loc[attack_only["overlay"] == "baseline", ["idle_asset", "CAGR", "Max Drawdown", "Information Ratio vs QQQ", "Alpha Ann vs QQQ", "2022 Return", "Turnover/Year"]] + recommendation = { + "baseline_attack_only_boxx": { + "oos_cagr": float(baseline_boxx["CAGR"]), + "oos_max_drawdown": float(baseline_boxx["Max Drawdown"]), + "oos_ir_vs_qqq": float(baseline_boxx["Information Ratio vs QQQ"]), + "oos_alpha_ann_vs_qqq": float(baseline_boxx["Alpha Ann vs QQQ"]), + "return_2022": float(baseline_boxx["2022 Return"]), + }, + "best_attack_only_candidate": { + "strategy": str(best["strategy"]), + "overlay": str(best["overlay"]), + "idle_asset": str(best["idle_asset"]), + "oos_cagr": float(best["CAGR"]), + "oos_max_drawdown": float(best["Max Drawdown"]), + "oos_ir_vs_qqq": float(best["Information Ratio vs QQQ"]), + "oos_alpha_ann_vs_qqq": float(best["Alpha Ann vs QQQ"]), + "return_2022": float(best["2022 Return"]), + "turnover_per_year": float(best["Turnover/Year"]), + }, + "idle_asset_baseline_comparison": idle_slice.to_dict(orient="records"), + } + + if best["overlay"] == "baseline" and best["idle_asset"] == "BOXX": + verdict = "No tested daily overlay clearly beats the current attack-only baseline; keep the logic simple." + else: + cagr_delta = float(best["CAGR"] - baseline_boxx["CAGR"]) + mdd_delta = float(best["Max Drawdown"] - baseline_boxx["Max Drawdown"]) + if cagr_delta > -0.01 and mdd_delta > 0.02: + verdict = "A small daily overlay looks promising enough for another focused round." + else: + verdict = "The tested overlays mainly trade more often; they do not justify upgrading the default logic yet." + recommendation["verdict"] = verdict + return recommendation + + +def frame_to_markdown_table(frame: pd.DataFrame) -> str: + display = frame.copy() + for column in display.columns: + if pd.api.types.is_bool_dtype(display[column]): + display[column] = display[column].map(lambda value: "true" if bool(value) else "false") + elif pd.api.types.is_numeric_dtype(display[column]): + def _fmt(value: object) -> str: + if pd.isna(value): + return "" + if isinstance(value, (float, np.floating)): + return f"{float(value):.6f}" + return str(value) + + display[column] = display[column].map(_fmt) + else: + display[column] = display[column].fillna("").astype(str) + + headers = [str(column) for column in display.columns] + lines = [ + "| " + " | ".join(headers) + " |", + "| " + " | ".join("---" for _ in headers) + " |", + ] + for row in display.itertuples(index=False, name=None): + lines.append("| " + " | ".join(str(value) for value in row) + " |") + return "\n".join(lines) + + +def build_markdown(summary: pd.DataFrame, recommendation: dict[str, object]) -> str: + focus = summary.loc[(summary["period"] == "2023+") & (summary["cost_bps_one_way"] == 5.0)].copy() + attack_only = focus.loc[focus["income_mode"] == "attack_only"].copy() + attack_only = attack_only.sort_values(["overlay", "idle_asset"]) + runtime_reference = focus.loc[focus["income_mode"] == "runtime_full_reference"].copy() + + lines = [ + "# TQQQ / hybrid_growth_income indicator overlay review", + "", + "## Setup", + "- Baseline signal: current QQQ MA200 + ATR staged TQQQ logic.", + "- Main research set: attack-only normalization (`income_threshold_usd = 1e9`) so the idle-asset choice is visible.", + "- Runtime reference: current full `hybrid_growth_income` with income layer on.", + "- Idle asset candidates: `CASH`, `BOXX`, `QQQ`.", + "- Extra indicator gates are nested from simple to complex to avoid blind indicator stuffing.", + "", + "## OOS 2023+ (5 bps)", + frame_to_markdown_table( + attack_only[[ + "overlay", + "idle_asset", + "CAGR", + "Max Drawdown", + "Information Ratio vs QQQ", + "Alpha Ann vs QQQ", + "2022 Return", + "Turnover/Year", + "Average TQQQ Weight", + "Average Idle Asset Weight", + "Gate Active Share", + ]] + ), + "", + "## Runtime full reference (2023+, 5 bps)", + frame_to_markdown_table( + runtime_reference[[ + "strategy", + "idle_asset", + "CAGR", + "Max Drawdown", + "Information Ratio vs QQQ", + "Alpha Ann vs QQQ", + "2022 Return", + "Turnover/Year", + ]] + ), + "", + "## Recommendation", + f"- {recommendation['verdict']}", + ] + best = recommendation["best_attack_only_candidate"] + lines.extend( + [ + f"- Best attack-only candidate in this run: `{best['overlay']}` + `{best['idle_asset']}`", + f"- OOS CAGR: {best['oos_cagr']:.2%}", + f"- OOS MaxDD: {best['oos_max_drawdown']:.2%}", + f"- OOS IR vs QQQ: {best['oos_ir_vs_qqq']:.3f}", + f"- 2022: {best['return_2022']:.2%}", + "", + "## Caveats", + "- BOXX pre-launch history is naturally short; before listed data exists it behaves like 0% carry in this backtest, so early BOXX results are closer to cash than to realized BOXX carry.", + "- These tests add daily gates on top of the existing daily TQQQ logic; they are not monthly overlays and should not be read as direct runtime recommendations.", + "- Weekly KDJ is mapped back to daily with forward-fill from Friday weekly bars; useful for a sanity check, but not a reason to trust the heaviest gate by default.", + ] + ) + return "\n".join(lines) + "\n" + + +def main() -> None: + args = parse_args() + results_dir = Path(args.results_dir).expanduser().resolve() + results_dir.mkdir(parents=True, exist_ok=True) + + end = args.end + etf_frames = suite.download_etf_ohlcv(("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI"), start=args.start, end=end) + qqq_ohlc = pd.DataFrame( + { + "open": etf_frames["open"]["QQQ"], + "high": etf_frames["high"]["QQQ"], + "low": etf_frames["low"]["QQQ"], + "close": etf_frames["close"]["QQQ"], + } + ).dropna() + master_index = qqq_ohlc.index + rows = suite.build_extra_etf_price_history(etf_frames, symbols=("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI")) + close_matrix, returns_matrix = suite.build_asset_return_matrix(rows, master_index=master_index, required_symbols=("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI")) + returns_matrix[CASH_SYMBOL] = 0.0 + indicators = build_indicator_frame(qqq_ohlc, etf_frames["volume"]["QQQ"].reindex(master_index).fillna(0.0)) + + strategy_runs: list[StrategyRun] = [build_runtime_full_reference(qqq_ohlc, returns_matrix)] + for overlay in OVERLAY_CONFIGS: + for idle_asset in (CASH_SYMBOL, SAFE_HAVEN, "QQQ"): + strategy_runs.append( + run_attack_only_variant_backtest( + qqq_ohlc, + returns_matrix, + indicators, + config=BacktestConfig( + overlay=overlay, + idle_asset=idle_asset, + income_mode="attack_only", + ), + ) + ) + + benchmark_returns = returns_matrix["QQQ"].copy() + summary = build_summary_rows(strategy_runs, benchmark_returns, args.cost_bps) + recommendation = choose_recommendation(summary) + + comparison_path = results_dir / "tqqq_hybrid_indicator_variants_comparison.csv" + summary_path = results_dir / "tqqq_hybrid_indicator_variants_summary.md" + recommendation_path = results_dir / "tqqq_hybrid_indicator_variants_recommendation.json" + summary.to_csv(comparison_path, index=False) + summary_path.write_text(build_markdown(summary, recommendation), encoding="utf-8") + recommendation_path.write_text(json.dumps(recommendation, indent=2, ensure_ascii=False), encoding="utf-8") + + print(f"wrote {comparison_path}") + print(f"wrote {summary_path}") + print(f"wrote {recommendation_path}") + + +if __name__ == "__main__": + main() diff --git a/research/backtest_hybrid_growth_position_scaling_followup.py b/research/backtest_hybrid_growth_position_scaling_followup.py new file mode 100644 index 0000000..eb8fd03 --- /dev/null +++ b/research/backtest_hybrid_growth_position_scaling_followup.py @@ -0,0 +1,498 @@ +#!/usr/bin/env python3 +"""Focused TQQQ position-scaling study on top of the existing hybrid attack sleeve.""" + +from __future__ import annotations + +import argparse +import json +import math +import sys +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +import pandas as pd + +CURRENT_DIR = Path(__file__).resolve().parent +if str(CURRENT_DIR) not in sys.path: + sys.path.insert(0, str(CURRENT_DIR)) + +import backtest_hybrid_growth_indicator_variants as base # noqa: E402 +import backtest_stock_alpha_suite as suite # noqa: E402 +from us_equity_strategies.strategies.hybrid_growth_income import get_hybrid_allocation # noqa: E402 + +DEFAULT_RESULTS_DIR = Path(__file__).resolve().parent / "results" +DEFAULT_START = "2018-01-01" +DEFAULT_COSTS_BPS = (0.0, 5.0, 10.0) +PERIODS = ( + ("Full Sample", None, None), + ("2018-2021", "2018-01-01", "2021-12-31"), + ("2022", "2022-01-01", "2022-12-31"), + ("2023+", "2023-01-01", None), +) +CASH_SYMBOL = base.CASH_SYMBOL +SAFE_HAVEN = base.SAFE_HAVEN + + +@dataclass(frozen=True) +class ScalingConfig: + name: str + description: str + + +@dataclass +class StrategyRun: + strategy_name: str + display_name: str + gross_returns: pd.Series + weights_history: pd.DataFrame + turnover_history: pd.Series + scale_history: pd.Series + metadata: dict[str, object] + + +SCALING_CONFIGS = ( + ScalingConfig( + name="baseline", + description="No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.", + ), + ScalingConfig( + name="trend_score_4_boost", + description="Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.", + ), + ScalingConfig( + name="consensus_score_6", + description="Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.", + ), + ScalingConfig( + name="overheat_trim", + description="Keep baseline size unless the setup looks overbought or weakening, then trim in steps.", + ), +) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--results-dir", default=str(DEFAULT_RESULTS_DIR)) + parser.add_argument("--start", default=DEFAULT_START) + parser.add_argument("--end", default=None) + parser.add_argument( + "--cost-bps", + nargs="*", + type=float, + default=list(DEFAULT_COSTS_BPS), + ) + return parser.parse_args() + + +def compute_ulcer_index(net_returns: pd.Series) -> float: + equity_curve = (1.0 + net_returns).cumprod() + drawdown_pct = (equity_curve / equity_curve.cummax() - 1.0) * 100.0 + return float(np.sqrt(np.mean(np.square(drawdown_pct)))) + + +def scaling_multiplier(config_name: str, row: pd.Series) -> float: + close = float(row["close"]) + ma20 = float(row["ma20"]) if pd.notna(row["ma20"]) else float("nan") + ma60 = float(row["ma60"]) if pd.notna(row["ma60"]) else float("nan") + rsi14 = float(row["rsi14"]) + macd_line = float(row["macd_line"]) + macd_signal = float(row["macd_signal"]) + mfi14 = float(row["mfi14"]) + cci20 = float(row["cci20"]) + bias20 = float(row["bias20"]) + weekly_k = float(row["weekly_k"]) + weekly_d = float(row["weekly_d"]) + weekly_j = float(row["weekly_j"]) + + if config_name == "baseline": + return 1.0 + + if config_name == "trend_score_4_boost": + score = sum( + [ + close > ma20 if pd.notna(ma20) else False, + (ma20 > ma60) if pd.notna(ma20) and pd.notna(ma60) else False, + rsi14 > 55.0, + macd_line > macd_signal, + ] + ) + return {4: 1.15, 3: 1.00, 2: 0.75}.get(score, 0.50) + + if config_name == "consensus_score_6": + score = sum( + [ + close > ma20 if pd.notna(ma20) else False, + (ma20 > ma60) if pd.notna(ma20) and pd.notna(ma60) else False, + rsi14 > 55.0, + macd_line > macd_signal, + mfi14 > 50.0, + cci20 > 0.0, + ] + ) + if score >= 6: + return 1.05 + if score >= 4: + return 0.85 + if score >= 2: + return 0.60 + return 0.35 + + if config_name == "overheat_trim": + close_above_ma20 = bool(pd.notna(ma20) and close > ma20) + close_below_ma20 = bool(pd.notna(ma20) and close < ma20) + if (rsi14 > 75.0 or bias20 > 0.08) and close_above_ma20: + return 0.75 + if macd_line < macd_signal and rsi14 < 50.0 and close_below_ma20: + return 0.35 + if (weekly_k < weekly_d and weekly_j < 50.0) or (macd_line < macd_signal and rsi14 < 55.0): + return 0.60 + return 1.0 + + raise KeyError(f"Unknown scaling config: {config_name}") + + +def run_scaling_backtest( + qqq_ohlc: pd.DataFrame, + asset_returns: pd.DataFrame, + indicators: pd.DataFrame, + *, + scaling: ScalingConfig, + idle_asset: str, + starting_equity: float = base.ATTACK_ONLY_STARTING_EQUITY, + cash_reserve_ratio: float = 0.05, + rebalance_threshold_ratio: float = 0.01, + alloc_tier1_breakpoints=(0, 15_000, 30_000, 70_000), + alloc_tier1_values=(1.0, 0.95, 0.85, 0.70), + alloc_tier2_breakpoints=(70_000, 140_000), + alloc_tier2_values=(0.70, 0.50), + risk_leverage_factor: float = 3.0, + risk_agg_cap: float = 0.50, + risk_numerator: float = 0.30, + atr_exit_scale: float = 2.0, + atr_entry_scale: float = 2.5, + exit_line_floor: float = 0.92, + exit_line_cap: float = 0.98, + entry_line_floor: float = 1.02, + entry_line_cap: float = 1.08, +) -> StrategyRun: + idle_asset = idle_asset.upper() + index = asset_returns.index.intersection(qqq_ohlc.index) + strategy_symbols = ["TQQQ", SAFE_HAVEN, "QQQ", CASH_SYMBOL] + weights_history = pd.DataFrame(0.0, index=index, columns=strategy_symbols) + portfolio_returns = pd.Series(0.0, index=index, name=f"{scaling.name}__{idle_asset.lower()}") + turnover_history = pd.Series(0.0, index=index, name="turnover") + scale_history = pd.Series(1.0, index=index, name="scale") + + current_equity = float(starting_equity) + current_weights: dict[str, float] = {idle_asset if idle_asset != CASH_SYMBOL else CASH_SYMBOL: 1.0} + + for idx in range(len(index) - 1): + date = index[idx] + next_date = index[idx + 1] + row = indicators.loc[date] + qqq_p = float(row["close"]) + ma200 = float(row["ma200"]) if pd.notna(row["ma200"]) else float("nan") + + history = qqq_ohlc.loc[:date] + true_range = pd.concat( + [ + history["high"] - history["low"], + (history["high"] - history["close"].shift(1)).abs(), + (history["low"] - history["close"].shift(1)).abs(), + ], + axis=1, + ).max(axis=1) + atr_pct = float(true_range.rolling(14).mean().iloc[-1] / qqq_p) if len(history) >= 14 else 0.0 + exit_line = ma200 * max(exit_line_floor, min(exit_line_cap, 1.0 - (atr_pct * atr_exit_scale))) if pd.notna(ma200) else float("nan") + entry_line = ma200 * max(entry_line_floor, min(entry_line_cap, 1.0 + (atr_pct * atr_entry_scale))) if pd.notna(ma200) else float("nan") + + reserved = current_equity * cash_reserve_ratio + agg_ratio, _ = get_hybrid_allocation( + current_equity, + qqq_p, + exit_line if pd.notna(exit_line) else qqq_p, + alloc_tier1_breakpoints=alloc_tier1_breakpoints, + alloc_tier1_values=alloc_tier1_values, + alloc_tier2_breakpoints=alloc_tier2_breakpoints, + alloc_tier2_values=alloc_tier2_values, + risk_leverage_factor=risk_leverage_factor, + risk_agg_cap=risk_agg_cap, + risk_numerator=risk_numerator, + ) + + current_tqqq_weight = current_weights.get("TQQQ", 0.0) + target_tqqq_ratio = 0.0 + if current_tqqq_weight > 1e-12: + if qqq_p < exit_line: + target_tqqq_ratio = 0.0 + elif qqq_p < ma200: + target_tqqq_ratio = agg_ratio * 0.33 + else: + target_tqqq_ratio = agg_ratio + elif qqq_p > entry_line: + target_tqqq_ratio = agg_ratio + + scale = 0.0 if target_tqqq_ratio <= 1e-12 else scaling_multiplier(scaling.name, row) + scale_history.at[date] = scale + target_tqqq_ratio *= scale + + target_tqqq_value = current_equity * target_tqqq_ratio + idle_value = max(0.0, (current_equity - reserved) - target_tqqq_value) + target_weights = base.build_target_weights( + current_equity=current_equity, + target_tqqq_value=target_tqqq_value, + idle_value=idle_value, + reserved_value=reserved, + idle_asset=idle_asset, + ) + + rebalance_needed = any( + abs(target_weights.get(symbol, 0.0) - current_weights.get(symbol, 0.0)) > rebalance_threshold_ratio + for symbol in set(target_weights) | set(current_weights) + ) + if rebalance_needed: + turnover_history.at[next_date] = suite.compute_turnover(current_weights, target_weights) + current_weights = target_weights + + for symbol, weight in current_weights.items(): + if symbol in weights_history.columns: + weights_history.at[date, symbol] = weight + + next_returns = asset_returns.loc[next_date] + portfolio_returns.at[next_date] = sum( + weight * float(next_returns.get(symbol, 0.0)) + for symbol, weight in current_weights.items() + if symbol != CASH_SYMBOL + ) + current_equity *= 1.0 + float(portfolio_returns.at[next_date]) + + for symbol, weight in current_weights.items(): + if symbol in weights_history.columns: + weights_history.at[index[-1], symbol] = weight + + metadata = { + "family": "hybrid_growth_tqqq_position_scaling", + "scaling": scaling.name, + "scaling_description": scaling.description, + "idle_asset": idle_asset, + } + return StrategyRun( + strategy_name=f"hybrid_tqqq_scaling::{scaling.name}::{idle_asset.lower()}", + display_name=f"hybrid_tqqq_scaling::{scaling.name}::{idle_asset.lower()}", + gross_returns=portfolio_returns, + weights_history=weights_history, + turnover_history=turnover_history, + scale_history=scale_history, + metadata=metadata, + ) + + +def summarize_period(run: StrategyRun, benchmark_returns: pd.Series, *, cost_bps: float, start: str | None, end: str | None) -> dict[str, object]: + returns = run.gross_returns.copy() + turnover = run.turnover_history.reindex(returns.index).fillna(0.0) + net_returns = returns - turnover * (float(cost_bps) / 10_000.0) + weights = run.weights_history.copy() + scale = run.scale_history.copy() + + if start: + net_returns = net_returns.loc[start:] + weights = weights.loc[start:] + turnover = turnover.loc[start:] + scale = scale.loc[start:] + if end: + net_returns = net_returns.loc[:end] + weights = weights.loc[:end] + turnover = turnover.loc[:end] + scale = scale.loc[:end] + + net_returns = net_returns.dropna() + benchmark = benchmark_returns.reindex(net_returns.index).fillna(0.0) + weights = weights.reindex(net_returns.index).fillna(0.0) + scale = scale.reindex(net_returns.index).fillna(0.0) + if net_returns.empty: + raise RuntimeError("No returns remain inside selected period") + + equity_curve = (1.0 + net_returns).cumprod() + total_return = float(equity_curve.iloc[-1] - 1.0) + years = max((net_returns.index[-1] - net_returns.index[0]).days / 365.25, 1 / 365.25) + cagr = float(equity_curve.iloc[-1] ** (1.0 / years) - 1.0) + drawdown = equity_curve / equity_curve.cummax() - 1.0 + max_drawdown = float(drawdown.min()) + std = float(net_returns.std(ddof=0)) + volatility = std * math.sqrt(252) if std else float("nan") + sharpe = float(net_returns.mean() / std * math.sqrt(252)) if std else float("nan") + beta = suite.compute_beta(net_returns, benchmark) + information_ratio = suite.compute_information_ratio(net_returns, benchmark) + up_capture, down_capture = suite.compute_capture_ratios(net_returns, benchmark) + + aligned = pd.concat([net_returns.rename("strategy"), benchmark.rename("benchmark")], axis=1).dropna() + if aligned.empty or math.isnan(beta): + alpha_ann = float("nan") + else: + alpha_daily = float((aligned["strategy"] - beta * aligned["benchmark"]).mean()) + alpha_ann = alpha_daily * 252.0 + + active_scale = scale[weights.get("TQQQ", pd.Series(0.0, index=weights.index)) > 1e-12] + return { + "Start": str(net_returns.index[0].date()), + "End": str(net_returns.index[-1].date()), + "Total Return": total_return, + "CAGR": cagr, + "Max Drawdown": max_drawdown, + "Ulcer Index": compute_ulcer_index(net_returns), + "Volatility": volatility, + "Sharpe": sharpe, + "Beta vs QQQ": beta, + "Alpha Ann vs QQQ": alpha_ann, + "Information Ratio vs QQQ": information_ratio, + "Up Capture vs QQQ": up_capture, + "Down Capture vs QQQ": down_capture, + "Turnover/Year": float(turnover.sum() / years), + "Average TQQQ Weight": float(weights.get("TQQQ", pd.Series(0.0, index=weights.index)).mean()), + "Average Idle Asset Weight": float(weights.get(str(run.metadata['idle_asset']), pd.Series(0.0, index=weights.index)).mean()), + "Average Cash Weight": float(weights.get(CASH_SYMBOL, pd.Series(0.0, index=weights.index)).mean()), + "Average Scale While Invested": float(active_scale.mean()) if not active_scale.empty else 0.0, + "2022 Return": suite.compute_period_total_return(net_returns, "2022-01-01", "2022-12-31"), + "2023+ CAGR": suite.compute_period_cagr(net_returns, "2023-01-01", None), + } + + +def build_summary(runs: list[StrategyRun], benchmark_returns: pd.Series, costs_bps: list[float]) -> pd.DataFrame: + rows: list[dict[str, object]] = [] + for run in runs: + for cost_bps in costs_bps: + for period_name, start, end in PERIODS: + rows.append( + { + "strategy": run.strategy_name, + "display_name": run.display_name, + "cost_bps_one_way": float(cost_bps), + "period": period_name, + **summarize_period(run, benchmark_returns, cost_bps=float(cost_bps), start=start, end=end), + **run.metadata, + } + ) + return pd.DataFrame(rows) + + +def build_recommendation(summary: pd.DataFrame) -> dict[str, object]: + oos = summary[(summary['period'] == '2023+') & (summary['cost_bps_one_way'] == 5.0)].copy() + baseline_qqq = oos[(oos['scaling'] == 'baseline') & (oos['idle_asset'] == 'QQQ')].iloc[0] + baseline_boxx = oos[(oos['scaling'] == 'baseline') & (oos['idle_asset'] == 'BOXX')].iloc[0] + scaled = oos[oos['scaling'] != 'baseline'].copy() + scaled['score'] = ( + scaled['Information Ratio vs QQQ'].fillna(-999.0) * 4.0 + + scaled['Alpha Ann vs QQQ'].fillna(-999.0) * 2.0 + + scaled['CAGR'].fillna(-999.0) + - scaled['Ulcer Index'].fillna(999.0) * 0.05 + - scaled['Turnover/Year'].fillna(999.0) * 0.03 + ) + best_scaled = scaled.sort_values('score', ascending=False).iloc[0] + verdict = ( + 'No tested scaling rule clearly upgrades the current baseline. The score-based variants smooth drawdown a bit, ' + 'but the gain mostly comes from carrying less TQQQ and paying materially more turnover.' + ) + return { + 'baseline_growth_reference': { + 'idle_asset': 'QQQ', + 'oos_cagr': float(baseline_qqq['CAGR']), + 'oos_max_drawdown': float(baseline_qqq['Max Drawdown']), + 'oos_ulcer': float(baseline_qqq['Ulcer Index']), + 'oos_ir_vs_qqq': float(baseline_qqq['Information Ratio vs QQQ']), + }, + 'baseline_defensive_reference': { + 'idle_asset': 'BOXX', + 'oos_cagr': float(baseline_boxx['CAGR']), + 'oos_max_drawdown': float(baseline_boxx['Max Drawdown']), + 'oos_ulcer': float(baseline_boxx['Ulcer Index']), + }, + 'best_scaled_candidate': { + 'scaling': str(best_scaled['scaling']), + 'idle_asset': str(best_scaled['idle_asset']), + 'oos_cagr': float(best_scaled['CAGR']), + 'oos_max_drawdown': float(best_scaled['Max Drawdown']), + 'oos_ulcer': float(best_scaled['Ulcer Index']), + 'oos_ir_vs_qqq': float(best_scaled['Information Ratio vs QQQ']), + 'turnover_per_year': float(best_scaled['Turnover/Year']), + 'average_scale_while_invested': float(best_scaled['Average Scale While Invested']), + }, + 'verdict': verdict, + } + + +def build_markdown(summary: pd.DataFrame, recommendation: dict[str, object]) -> str: + focus = summary[(summary['period'] == '2023+') & (summary['cost_bps_one_way'] == 5.0)].copy().sort_values(['scaling', 'idle_asset']) + full = summary[(summary['period'] == 'Full Sample') & (summary['cost_bps_one_way'] == 5.0)].copy().sort_values(['scaling', 'idle_asset']) + y2022 = summary[(summary['period'] == '2022') & (summary['cost_bps_one_way'] == 5.0)].copy().sort_values(['scaling', 'idle_asset']) + return '\n'.join([ + '# TQQQ position-scaling follow-up', + '', + '## Setup', + '- Keep the existing MA200 + ATR TQQQ entry/exit framework.', + '- Change only the TQQQ position size while already invested.', + '- Compare two idle assets: `BOXX` and `QQQ`.', + '- Goal: see whether smoother in-position scaling creates a smoother equity curve without obviously killing CAGR.', + '', + '## OOS 2023+ (5 bps)', + base.frame_to_markdown_table(focus[[ + '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' + ]]), + '', + '## Full Sample (5 bps)', + base.frame_to_markdown_table(full[[ + 'scaling', 'idle_asset', 'CAGR', 'Max Drawdown', 'Ulcer Index', 'Information Ratio vs QQQ', + 'Turnover/Year', 'Average TQQQ Weight', 'Average Scale While Invested' + ]]), + '', + '## 2022 (5 bps)', + base.frame_to_markdown_table(y2022[[ + 'scaling', 'idle_asset', 'Total Return', '2022 Return', 'Max Drawdown', 'Ulcer Index', 'Turnover/Year' + ]]), + '', + '## Recommendation', + f"- {recommendation['verdict']}", + ]) + '\n' + + +def main() -> None: + args = parse_args() + results_dir = Path(args.results_dir).expanduser().resolve() + results_dir.mkdir(parents=True, exist_ok=True) + + etf_frames = suite.download_etf_ohlcv(("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI"), start=args.start, end=args.end) + qqq_ohlc = pd.DataFrame({ + 'open': etf_frames['open']['QQQ'], + 'high': etf_frames['high']['QQQ'], + 'low': etf_frames['low']['QQQ'], + 'close': etf_frames['close']['QQQ'], + }).dropna() + master_index = qqq_ohlc.index + rows = suite.build_extra_etf_price_history(etf_frames, symbols=("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI")) + _, returns_matrix = suite.build_asset_return_matrix(rows, master_index=master_index, required_symbols=("QQQ", "TQQQ", "BOXX", "SPYI", "QQQI")) + returns_matrix[CASH_SYMBOL] = 0.0 + indicators = base.build_indicator_frame(qqq_ohlc, etf_frames['volume']['QQQ'].reindex(master_index).fillna(0.0)) + + runs: list[StrategyRun] = [] + for scaling in SCALING_CONFIGS: + for idle_asset in (SAFE_HAVEN, 'QQQ'): + runs.append(run_scaling_backtest(qqq_ohlc, returns_matrix, indicators, scaling=scaling, idle_asset=idle_asset)) + + summary = build_summary(runs, returns_matrix['QQQ'].copy(), list(args.cost_bps)) + recommendation = build_recommendation(summary) + + comparison_path = results_dir / 'tqqq_hybrid_position_scaling_followup_comparison.csv' + summary_path = results_dir / 'tqqq_hybrid_position_scaling_followup_summary.md' + recommendation_path = results_dir / 'tqqq_hybrid_position_scaling_followup_recommendation.json' + summary.to_csv(comparison_path, index=False) + summary_path.write_text(build_markdown(summary, recommendation), encoding='utf-8') + recommendation_path.write_text(json.dumps(recommendation, indent=2, ensure_ascii=False), encoding='utf-8') + + print(f'wrote {comparison_path}') + print(f'wrote {summary_path}') + print(f'wrote {recommendation_path}') + + +if __name__ == '__main__': + main() diff --git a/research/results/tqqq_hybrid_continuous_scaling_followup_comparison.csv b/research/results/tqqq_hybrid_continuous_scaling_followup_comparison.csv new file mode 100644 index 0000000..bfa6b12 --- /dev/null +++ b/research/results/tqqq_hybrid_continuous_scaling_followup_comparison.csv @@ -0,0 +1,73 @@ +strategy,display_name,cost_bps_one_way,period,Start,End,Total Return,CAGR,Max Drawdown,Ulcer Index,Volatility,Sharpe,Beta vs QQQ,Alpha Ann vs QQQ,Information Ratio vs QQQ,Up Capture vs QQQ,Down Capture vs QQQ,Turnover/Year,Average TQQQ Weight,Average Idle Asset Weight,Average Cash Weight,Average Scale While Invested,2022 Return,2023+ CAGR,family,scaling,scaling_description,idle_asset +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,0.0,Full Sample,2018-01-02,2026-04-06,4.242285942679537,0.22218490562773874,-0.45376709531769843,12.289476396672763,0.28072684673974696,0.8588316522923697,0.7815258833708268,0.08905867324521553,0.215438783952883,1.1609399653426304,1.0477230035537635,1.2709411631042637,0.39472582248261745,0.5552741775173825,0.05000000000000001,1.0,-0.16094744943638484,0.23936904849801577,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,0.0,2018-2021,2018-01-02,2021-12-31,2.1069556472710964,0.3281663927150231,-0.45376709531769843,12.322846398078944,0.334353372426739,1.0176317003157958,0.9671311951016509,0.08208563798729981,0.3093997883709956,1.3397056295040042,1.395244301088106,1.4919740928668712,0.43513857652365107,0.5148614234763489,0.05000000000000001,1.0,,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,0.0,2022,2022-01-03,2022-12-30,-0.16094744943638484,-0.16267907817181815,-0.173582350804786,17.001059080421417,0.08557716831817376,-2.014394170934097,0.050816564904472866,-0.15490826220785045,0.5430141358690368,0.0,0.2594420412521325,0.5123798992435283,0.02760634600380159,0.9223936539961983,0.05,1.0,-0.16094744943638484,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,0.0,2023+,2023-01-03,2026-04-06,1.010927857718519,0.23936904849801577,-0.20112252200733705,7.4978709760907565,0.24452661592043692,1.0052177200139962,1.0226352735213382,-0.031071375084307257,-0.18263188449796178,1.173966229471908,1.8103207473867882,1.237509842559109,0.4577294162605843,0.4922705837394158,0.049999999999999996,1.0,,0.23936904849801577,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,5.0,Full Sample,2018-01-02,2026-04-06,4.214607628252569,0.2214016120642941,-0.45450815236059816,12.312902785022494,0.28074631233462827,0.8565022143669392,0.7815519553408492,0.08841633775302711,0.21247177597787437,1.1600252335628722,1.0491327629611817,1.2709411631042637,0.39472582248261745,0.5552741775173825,0.05000000000000001,1.0,-0.16116194497811231,0.23860213021458554,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,5.0,2018-2021,2018-01-02,2021-12-31,2.0975770842524106,0.3271615903791061,-0.45450815236059816,12.347924507066454,0.33438441204581365,1.015309364949122,0.9671756343689019,0.08132880966354648,0.3062136200379145,1.338531750704874,1.3968233371352026,1.4919740928668712,0.43513857652365107,0.5148614234763489,0.05000000000000001,1.0,,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,5.0,2022,2022-01-03,2022-12-30,-0.16116194497811231,-0.16289565072673018,-0.17379361635810353,17.021359227031468,0.08560362025215838,-2.0167414213908534,0.05083255209900963,-0.15515698131873423,0.5422061138689629,0.0,0.25978780202173,0.5123798992435283,0.02760634600380159,0.9223936539961983,0.05,1.0,-0.16116194497811231,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,5.0,2023+,2023-01-03,2026-04-06,1.00687992306363,0.23860213021458554,-0.20112252200733738,7.51404066842126,0.24452916895342147,1.0026633836755685,1.0226426410876925,-0.031695413207551454,-0.18718311649947095,1.173201762973768,1.8132859150732097,1.237509842559109,0.4577294162605843,0.4922705837394158,0.049999999999999996,1.0,,0.23860213021458554,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,10.0,Full Sample,2018-01-02,2026-04-06,4.187070091054176,0.22061866778261519,-0.4552484074898324,12.336370087224848,0.28076620442951444,0.8541718019050476,0.7815780273108718,0.08777400226083862,0.20950473616006277,1.1591106029525906,1.050542028521661,1.2709411631042637,0.39472582248261745,0.5552741775173825,0.05000000000000001,1.0,-0.16137641614661047,0.23783555983197258,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,10.0,2018-2021,2018-01-02,2021-12-31,2.0882247812541586,0.3261573278469072,-0.4552484074898324,12.373041738693804,0.33441591689916594,1.0129860514367852,0.9672200736361527,0.08057198133979317,0.3030274902377578,1.3373579902663526,1.3984015827870235,1.4919740928668712,0.43513857652365107,0.5148614234763489,0.05000000000000001,1.0,,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,10.0,2022,2022-01-03,2022-12-30,-0.16137641614661047,-0.16311219802054655,-0.17400485790521691,17.041657465233808,0.08563047704659772,-2.0190776754381714,0.050848539293546366,-0.15540570042961807,0.5413979100596967,0.0,0.26013352350236896,0.5123798992435283,0.02760634600380159,0.9223936539961983,0.05,1.0,-0.16137641614661047,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::boxx,hybrid_tqqq_continuous::baseline::boxx,10.0,2023+,2023-01-03,2026-04-06,1.0028394696056027,0.23783555983197258,-0.20112252200733738,7.53027414050592,0.24453213487603223,1.0001074120018052,1.0226500086540473,-0.0323194513307958,-0.1917331476152775,1.1724373965917763,1.8162503178896905,1.237509842559109,0.4577294162605843,0.4922705837394158,0.049999999999999996,1.0,,0.23783555983197258,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,0.0,Full Sample,2018-01-02,2026-04-06,6.958150954644414,0.2855591320183184,-0.4993621792721581,17.083835419485382,0.36781078469108913,0.8708283420799375,1.4396064242915783,0.04023831648724273,0.7499049235572735,1.6595272813803752,1.6624485891264833,1.2409537146697012,0.37846786823985695,0.5715321317601431,0.05000000000000001,1.0,-0.3875968227489953,0.38849366224072734,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.4642748062781834,0.4543214179881776,-0.4993621792721581,12.219055082435029,0.4020259198318612,1.1350426250672403,1.5372286271881215,0.04597359086891557,0.9706874850596888,1.769667934769849,1.8524866601659482,1.512547456631092,0.40351835820165466,0.5464816417983452,0.05,1.0,,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,0.0,2022,2022-01-03,2022-12-30,-0.3875968227489953,-0.3911220338994389,-0.41282891870828176,31.462078790364696,0.3201905348292475,-1.3755282652260696,0.9831470507386888,-0.10228680908067349,-1.7499561244064752,0.9513806517078808,1.1149551185302908,0.5058864265927979,0.027191235059760958,0.922808764940239,0.05,1.0,-0.3875968227489953,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,0.0,2023+,2023-01-03,2026-04-06,1.9108767487288993,0.38849366224072734,-0.32071855630208324,9.616040373060208,0.33467963812716994,1.1541756695992997,1.6246643532835077,-0.05359140999285476,0.753982456512972,1.6659833548473082,2.282175964213131,1.13817044930114,0.455575148934357,0.4944248510656431,0.049999999999999996,1.0,,0.38849366224072734,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,5.0,Full Sample,2018-01-02,2026-04-06,6.9171261783604585,0.2847547341609915,-0.49982694555325335,17.100661291453243,0.36782350828728827,0.8691065720837868,1.4396319710673835,0.03961111919269239,0.7461090736351264,1.6586024184782249,1.6638225320767097,1.2409537146697012,0.37846786823985695,0.5715321317601431,0.05000000000000001,1.0,-0.3877522460588442,0.38770315883497886,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,5.0,2018-2021,2018-01-02,2021-12-31,3.4506318001912897,0.45320750166342383,-0.49982694555325335,12.236927623029734,0.4020468554758449,1.133105036739663,1.53727034003447,0.04520721772718243,0.9666657765198269,1.7684159409404847,1.8540836586323626,1.512547456631092,0.40351835820165466,0.5464816417983452,0.05,1.0,,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,5.0,2022,2022-01-03,2022-12-30,-0.3877522460588442,-0.39127838154664596,-0.41297793830238594,31.47822797052874,0.3202002384868171,-1.3762704519333506,0.9831637792254517,-0.102532051488533,-1.753709577242813,0.9513806517078808,1.1152885683246367,0.5058864265927979,0.027191235059760958,0.922808764940239,0.05,1.0,-0.3877522460588442,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,5.0,2023+,2023-01-03,2026-04-06,1.9054854120872937,0.38770315883497886,-0.3211199087725741,9.627918627041247,0.33468252955718575,1.1524562881507212,1.6246740490794005,-0.05416614479992941,0.7502300923853346,1.6652987834990949,2.2849700221196296,1.13817044930114,0.455575148934357,0.4944248510656431,0.049999999999999996,1.0,,0.38770315883497886,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,10.0,Full Sample,2018-01-02,2026-04-06,6.876305376257348,0.2839506913470562,-0.500291376430337,17.117512296856628,0.3678365318701964,0.8673842138108312,1.4396575178431894,0.03898392189814197,0.7423111877949264,1.657677648323423,1.6651960136630022,1.2409537146697012,0.37846786823985695,0.5715321317601431,0.05000000000000001,1.0,-0.38790765232544,0.3869129730779377,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,10.0,2018-2021,2018-01-02,2021-12-31,3.4370277976643475,0.45209421813580386,-0.500291376430337,12.254830889219544,0.40206814411181147,1.1311666570941803,1.537312052880818,0.044440844585449446,0.9626417462274303,1.7671640775175899,1.8556799057874254,1.512547456631092,0.40351835820165466,0.5464816417983452,0.05,1.0,,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,10.0,2022,2022-01-03,2022-12-30,-0.38790765232544,-0.3914347115820538,-0.4131269415554485,31.49437613820274,0.32021005037722716,-1.3770121282199241,0.9831805077122151,-0.10277729389639237,-1.7574399269448109,0.9513806517078808,1.115621981553879,0.5058864265927979,0.027191235059760958,0.922808764940239,0.05,1.0,-0.38790765232544,,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::baseline::qqq,hybrid_tqqq_continuous::baseline::qqq,10.0,2023+,2023-01-03,2026-04-06,1.9001031596530082,0.3869129730779377,-0.32152108723710227,9.639837278774808,0.3346857023983403,1.1507359688454049,1.6246837448752929,-0.054740879607003926,0.7464749217538761,1.664614274214593,2.287763387867563,1.13817044930114,0.455575148934357,0.4944248510656431,0.049999999999999996,1.0,,0.3869129730779377,hybrid_growth_tqqq_continuous_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,0.0,Full Sample,2018-01-02,2026-04-06,4.215627194161673,0.22143053042923744,-0.39410559283407964,11.657980984314865,0.26650280485908806,0.8873764851759668,0.7283266328691859,0.09479930214825757,0.19778067792121212,1.1406047898405904,1.0238038137732328,3.7498172010952016,0.40011870944709665,0.5498812905529034,0.05000000000000001,1.0223517682312324,-0.136323351129351,0.21330344104901378,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,0.0,2018-2021,2018-01-02,2021-12-31,2.218172319337454,0.339912015737466,-0.39410559283407964,10.862635413102502,0.3111673085513103,1.0969972235771095,0.8751459528542251,0.10774097128263893,0.3258981997146824,1.3167140900689935,1.308803614813422,3.979176968126632,0.43969927274413456,0.5103007272558655,0.05,1.0308130676771892,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,0.0,2022,2022-01-03,2022-12-30,-0.136323351129351,-0.13781224710504603,-0.14968746234499108,14.691479438731319,0.07696725645490575,-1.871915928822396,0.043788101770776355,-0.12901572133301614,0.6324711707353213,0.0,0.21974868859445285,0.7424896526978046,0.02246892663720063,0.9275310733627993,0.05,0.7767078612061269,-0.136323351129351,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,0.0,2023+,2023-01-03,2026-04-06,0.8764891960174857,0.21330344104901378,-0.19854470672730962,8.281685219028608,0.24278541044704346,0.9226856858824415,1.0048807513452134,-0.04805228310361285,-0.3372345388308377,1.152758399957236,1.9235757486238583,4.40352457307188,0.46738940513566246,0.48261059486433744,0.049999999999999996,1.020292646061138,,0.21330344104901378,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,5.0,Full Sample,2018-01-02,2026-04-06,4.135388729578769,0.2191393550174392,-0.39499172968207374,11.705114314728874,0.26651546978713564,0.8802795731212085,0.7283458669009407,0.0929153620593172,0.18890612488002362,1.137760684664117,1.0278797906782642,3.7498172010952016,0.40011870944709665,0.5498812905529034,0.05000000000000001,1.0223517682312324,-0.13664230622616091,0.2106363853906288,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,5.0,2018-2021,2018-01-02,2021-12-31,2.192622785792183,0.33724096980382257,-0.39499172968207374,10.894779176871827,0.3111893639567537,1.0905347289120266,0.8751863497246274,0.1057433229835167,0.31716941852909813,1.313672899691554,1.3135102082334338,3.979176968126632,0.43969927274413456,0.5103007272558655,0.05,1.0308130676771892,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,5.0,2022,2022-01-03,2022-12-30,-0.13664230622616091,-0.1381344001916076,-0.14999183489633994,14.72105969212101,0.0769954438525194,-1.8760151646972771,0.043810559706736564,-0.1293763840581839,0.631306309268617,0.0,0.2202628352235711,0.7424896526978046,0.02246892663720063,0.9275310733627993,0.05,0.7767078612061269,-0.13664230622616091,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,5.0,2023+,2023-01-03,2026-04-06,0.8630947892423728,0.2106363853906288,-0.19975142869197882,8.33053904460515,0.24278613765362664,0.913565993587241,1.0048867952542728,-0.05026738335041646,-0.353209196217671,1.149555525385201,1.932746379457903,4.40352457307188,0.46738940513566246,0.48261059486433744,0.049999999999999996,1.020292646061138,,0.2106363853906288,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,10.0,Full Sample,2018-01-02,2026-04-06,4.056378675125574,0.21685230262157718,-0.3958767579885636,11.752348694244558,0.2665286105729577,0.8731817765572932,0.7283651009326952,0.09103142197037693,0.18003196308451536,1.1349170997264315,1.0319543607890547,3.7498172010952016,0.40011870944709665,0.5498812905529034,0.05000000000000001,1.0223517682312324,-0.13696116170723438,0.2079750274577956,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,10.0,2018-2021,2018-01-02,2021-12-31,2.1672738112130587,0.3345750076971905,-0.3958767579885636,10.926990199974966,0.3112119290851326,1.0840713746699915,0.87522674659503,0.10374567468439434,0.3084411906614737,1.310632287665482,1.3182148407472634,3.979176968126632,0.43969927274413456,0.5103007272558655,0.05,1.0308130676771892,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,10.0,2022,2022-01-03,2022-12-30,-0.13696116170723438,-0.13845645126315498,-0.15029611628025652,14.750631408433861,0.07702388472513157,-1.880105213089854,0.043833017642696794,-0.1297370467833516,0.6301413162724869,0.0,0.22077682127492915,0.7424896526978046,0.02246892663720063,0.9275310733627993,0.05,0.7767078612061269,-0.13696116170723438,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::boxx,hybrid_tqqq_continuous::ma20_gap_linear::boxx,10.0,2023+,2023-01-03,2026-04-06,0.8497951697499275,0.2079750274577956,-0.20095648354266216,8.379575506389049,0.2427873460531625,0.9044445633539125,1.0048928391633316,-0.052482483597219895,-0.3691817094472162,1.146353206738257,1.9419144061413673,4.40352457307188,0.46738940513566246,0.48261059486433744,0.049999999999999996,1.020292646061138,,0.2079750274577956,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",BOXX +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,0.0,Full Sample,2018-01-02,2026-04-06,7.088213840942688,0.28808548227596,-0.460930364022181,16.84099935090797,0.35914582635847586,0.8881907521267259,1.4076615498954015,0.045142833813563224,0.7798263046244368,1.6495579628142225,1.6420846875215453,3.672616439470836,0.3856943937109769,0.564305606289023,0.05000000000000001,1.0223517682312324,-0.3765955363382506,0.3690135703375961,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.6669584363271577,0.47057697376959773,-0.460930364022181,11.365337549753509,0.38701737039278655,1.191744941964733,1.4815366900802713,0.0657492592511007,1.0718770486517823,1.7602028185025953,1.7787659301594378,3.7930693597638845,0.41111250320373355,0.5388874967962664,0.05,1.0308130676771892,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,0.0,2022,2022-01-03,2022-12-30,-0.3765955363382506,-0.3800541404493556,-0.4025204391623215,30.341805927590315,0.3180852829789323,-1.330697972664366,0.9789784136182841,-0.08656488348575252,-1.569557758964868,0.9513806517078791,1.0913526312665236,0.7424896526978046,0.022468926637200633,0.9275310733627993,0.05,0.7767078612061269,-0.3765955363382506,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,0.0,2023+,2023-01-03,2026-04-06,1.780025529898694,0.3690135703375961,-0.3253758349724827,10.096080472711272,0.3332664273115802,1.1150421457511508,1.6147923768430126,-0.06559160036360018,0.6605765804551962,1.653134743622589,2.361079577940031,4.436067469238543,0.46602299403796116,0.48397700596203874,0.05,1.020292646061138,,0.3690135703375961,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,5.0,Full Sample,2018-01-02,2026-04-06,6.966339128535713,0.285719246106106,-0.4614451650211807,16.88032753079932,0.35915403838378757,0.8830431478844214,1.4076790046843335,0.04329794914368242,0.7682282151816558,1.6467328377483237,1.646055228438558,3.672616439470836,0.3856943937109769,0.564305606289023,0.05000000000000001,1.0223517682312324,-0.3768270727354146,0.3659824041583266,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,5.0,2018-2021,2018-01-02,2021-12-31,3.6316436803413152,0.4677832692263777,-0.4614451650211807,11.390944456567983,0.3870321557861139,1.1868059237086679,1.481570888641412,0.06384619192958199,1.0613093091972903,1.757263195734564,1.7832583240257467,3.7930693597638845,0.41111250320373355,0.5388874967962664,0.05,1.0308130676771892,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,5.0,2022,2022-01-03,2022-12-30,-0.3768270727354146,-0.3802871025107174,-0.4027355956695847,30.365284119638726,0.31809681574816134,-1.3318078243639657,0.9790008715542443,-0.08692554621092026,-1.5760094466084682,0.9513806517078791,1.091849376343519,0.7424896526978046,0.022468926637200633,0.9275310733627993,0.05,0.7767078612061269,-0.3768270727354146,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,5.0,2023+,2023-01-03,2026-04-06,1.760038064328091,0.3659824041583266,-0.32619709676281283,10.13686393794525,0.33326868800241644,1.108343818974827,1.614802740644554,-0.06782422812686134,0.6459630152549027,1.6498429536054835,2.370182357698812,4.436067469238543,0.46602299403796116,0.48397700596203874,0.05,1.020292646061138,,0.3659824041583266,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,10.0,Full Sample,2018-01-02,2026-04-06,6.846292108481234,0.283357183661739,-0.46195952557247244,16.919720159362672,0.3591625811971994,0.8778949704953104,1.4076964594732646,0.041453064473801836,0.7566283789909627,1.643908220710892,1.6500244260603427,3.672616439470836,0.3856943937109769,0.564305606289023,0.05000000000000001,1.0223517682312324,-0.3770585366216771,0.36295776581325123,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,10.0,2018-2021,2018-01-02,2021-12-31,3.596593145481216,0.464994632237304,-0.46195952557247244,11.41660787620144,0.3870473136613158,1.1818661454076815,1.481605087202553,0.06194312460806324,1.0507393375168597,1.7543241087097767,1.7877489151118857,3.7930693597638845,0.41111250320373355,0.5388874967962664,0.05,1.0308130676771892,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,10.0,2022,2022-01-03,2022-12-30,-0.3770585366216771,-0.38051999059617125,-0.40295068754399466,30.388756941550778,0.31810841197098927,-1.3329173297107295,0.9790233294902047,-0.08728620893608795,-1.5824421798961492,0.9513806517078791,1.092345965853471,0.7424896526978046,0.022468926637200633,0.9275310733627993,0.05,0.7767078612061269,-0.3770585366216771,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_linear::qqq,hybrid_tqqq_continuous::ma20_gap_linear::qqq,10.0,2023+,2023-01-03,2026-04-06,1.7401931007897011,0.36295776581325123,-0.32701743082956103,10.17776754056329,0.33327129198247996,1.101644448312197,1.6148131044460956,-0.07005685589012259,0.6313467850531539,1.6465517458657186,2.37928253258694,4.436067469238543,0.46602299403796116,0.48397700596203874,0.05,1.020292646061138,,0.36295776581325123,hybrid_growth_tqqq_continuous_scaling,ma20_gap_linear,"Scale TQQQ continuously by QQQ distance vs MA20: mild boost above MA20, progressively trim below MA20.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,0.0,Full Sample,2018-01-02,2026-04-06,4.044727078455645,0.2165123778596345,-0.38654649875802993,11.194426326720938,0.25566869288868505,0.8978988120590762,0.7027016442265408,0.09286069335786458,0.170396799206417,1.1113037256552507,0.9981001399182551,2.5964225739553544,0.3794841715511619,0.5705158284488381,0.05000000000000001,0.9626103265118057,-0.13595523742370053,0.22016765916532854,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,0.0,2018-2021,2018-01-02,2021-12-31,2.054777670123676,0.3225469691177427,-0.38654649875802993,10.650738258557476,0.29878541347046256,1.085916515680065,0.8464440193833827,0.09850891652031109,0.2625322310330326,1.273510210599088,1.294937107397664,2.8292872537072626,0.4170859873044689,0.532914012695531,0.05,0.9641797207575357,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,0.0,2022,2022-01-03,2022-12-30,-0.13595523742370053,-0.13744044078189888,-0.14881110766369343,14.601709566801617,0.07621283863073776,-1.8856177592722883,0.043561534249645956,-0.1287256957843336,0.6338542942873571,0.0,0.21915529967298572,0.6701045163904825,0.022419627423224352,0.9275803725767756,0.05,0.7717197668209669,-0.13595523742370053,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,0.0,2023+,2023-01-03,2026-04-06,0.9112690464532327,0.22016765916532854,-0.18141793335687595,7.493265532136763,0.23225191931309708,0.9780924096374106,0.9644445769112875,-0.03395515581958558,-0.33057121193967864,1.1358724486327547,1.8333828717088967,2.9108264503561716,0.44286722338544965,0.5071327766145504,0.049999999999999996,0.9654877542375832,,0.22016765916532854,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,5.0,Full Sample,2018-01-02,2026-04-06,3.9907939262257965,0.21492988103306732,-0.38738499351710687,11.23249251739521,0.2556839791124855,0.8927534000363393,0.7027282820643863,0.09155363728187939,0.16405374028696837,1.1096692126004604,1.0014661696401037,2.5964225739553544,0.3794841715511619,0.5705158284488381,0.05000000000000001,0.9626103265118057,-0.13624288167180076,0.21839318825261111,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,5.0,2018-2021,2018-01-02,2021-12-31,2.03748176203694,0.3206683724293502,-0.38738499351710687,10.679772869181612,0.2988100939983611,1.0810990476391806,0.8464916718738332,0.09708348922943699,0.2560600772719231,1.271667027722768,1.2989463538931838,2.8292872537072626,0.4170859873044689,0.532914012695531,0.05,0.9641797207575357,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,5.0,2022,2022-01-03,2022-12-30,-0.13624288167180076,-0.13773097060261363,-0.14909447213684557,14.629201740557459,0.07623368348556521,-1.8894634024368693,0.043580151031299044,-0.12905176568697868,0.632803898930899,0.0,0.21961897409620446,0.6701045163904825,0.022419627423224352,0.9275803725767756,0.05,0.7717197668209669,-0.13624288167180076,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,5.0,2023+,2023-01-03,2026-04-06,0.9022356625070991,0.21839318825261111,-0.18240250883049258,7.528751411431692,0.23225549776267496,0.9717776041417485,0.9644570829686541,-0.0354216900171989,-0.34166268374448033,1.134161217989621,1.8406732811812523,2.9108264503561716,0.44286722338544965,0.5071327766145504,0.049999999999999996,0.9654877542375832,,0.21839318825261111,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,10.0,Full Sample,2018-01-02,2026-04-06,3.9374324726688306,0.21334929695406912,-0.3882225011867013,11.270631777158176,0.25569970107864487,0.8876070906306252,0.7027549199022313,0.09024658120589431,0.15771098252090718,1.1080349440834771,1.0048310687002722,2.5964225739553544,0.3794841715511619,0.5705158284488381,0.05000000000000001,0.9626103265118057,-0.13653044820668003,0.2166211614722766,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,10.0,2018-2021,2018-01-02,2021-12-31,2.020281950226466,0.3187922439385651,-0.3882225011867013,10.708885180625458,0.2988352405097851,1.076280697057885,0.8465393243642837,0.095658061938563,0.24958842173643728,1.269824123895874,1.30295394990896,2.8292872537072626,0.4170859873044689,0.532914012695531,0.05,0.9641797207575357,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,10.0,2022,2022-01-03,2022-12-30,-0.13653044820668003,-0.1380214207919388,-0.14937776005304915,14.656686837997523,0.07625478835015478,-1.8933004874165074,0.04359876781295215,-0.12937783558962368,0.6317533684084178,0.0,0.22008252324790065,0.6701045163904825,0.022419627423224352,0.9275803725767756,0.05,0.7717197668209669,-0.13653044820668003,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,hybrid_tqqq_continuous::ma20_gap_trim_only::boxx,10.0,2023+,2023-01-03,2026-04-06,0.8932442825305431,0.2166211614722766,-0.18338602572009366,7.564333504497355,0.23225952224557017,0.9654611391483615,0.9644695890260206,-0.03688822421481218,-0.352751620621243,1.1324502388935458,1.8479617217427433,2.9108264503561716,0.44286722338544965,0.5071327766145504,0.049999999999999996,0.9654877542375832,,0.2166211614722766,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",BOXX +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,0.0,Full Sample,2018-01-02,2026-04-06,6.926416222871419,0.2849372100565808,-0.4584788860765039,16.549279553140696,0.35288080772652297,0.890578068027093,1.3892719804734948,0.04399825601419512,0.7876768585198554,1.6275561362460524,1.620999710794943,2.56817870533473,0.36374223422378255,0.5862577657762175,0.05000000000000001,0.9626103265118057,-0.37596153984673086,0.37412411278079305,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.5138692477800504,0.45834930145944974,-0.4584788860765039,11.22842578069864,0.3799520116473398,1.184658160806682,1.461175265216302,0.060071731521576806,1.0600085256567169,1.729116866875181,1.7639622272130153,2.8096665946195545,0.3868073971561043,0.5631926028438956,0.05,0.9641797207575357,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,0.0,2022,2022-01-03,2022-12-30,-0.37596153984673086,-0.3794162349701322,-0.40167303007699606,30.247742359064922,0.3179051395094396,-1.3284341984535701,0.9787004135007966,-0.08570111704528018,-1.5682721498512227,0.9513806517078808,1.0899924363258893,0.6701045163904823,0.02230000710622907,0.9276999928937708,0.05,0.7717197668209669,-0.37596153984673086,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,0.0,2023+,2023-01-03,2026-04-06,1.813951075981961,0.37412411278079305,-0.31698129269389275,9.607839550639593,0.32629506507204553,1.1432313216571441,1.58543372259708,-0.05621825159848721,0.7053998939524426,1.6386160327324677,2.294631026446845,2.8632596159147603,0.440276933697711,0.5097230663022891,0.049999999999999996,0.9654877542375832,,0.37412411278079305,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,5.0,Full Sample,2018-01-02,2026-04-06,6.842558328812011,0.2832832092561761,-0.4589864404727406,16.58045735673041,0.35289241069058946,0.8868997641946816,1.3893004399107587,0.042705007339971165,0.7791217613568977,1.6259108347769626,1.6243193040852026,2.56817870533473,0.36374223422378255,0.5862577657762175,0.05000000000000001,0.9626103265118057,-0.3761704668837448,0.3721585108293748,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,5.0,2018-2021,2018-01-02,2021-12-31,3.4884772836118367,0.4562912246379556,-0.4589864404727406,11.251724493826742,0.3799717229206911,1.1809045622620122,1.4612252648142285,0.058655474601165575,1.0517312621014012,1.7272477922268277,1.7679821479258773,2.8096665946195545,0.3868073971561043,0.5631926028438956,0.05,0.9641797207575357,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,5.0,2022,2022-01-03,2022-12-30,-0.3761704668837448,-0.3796264510171832,-0.4018733489499079,30.269567367627715,0.3179143850706307,-1.32944135908431,0.9787194455281485,-0.08602704412801333,-1.5743073270891865,0.9513806517078808,1.0904406746087643,0.6701045163904823,0.02230000710622907,0.9276999928937708,0.05,0.7717197668209669,-0.3761704668837448,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,5.0,2023+,2023-01-03,2026-04-06,1.800868986753838,0.3721585108293748,-0.31763500064867334,9.637568131252396,0.32629882338574245,1.138807355219079,1.5854479459968953,-0.05766134094098459,0.695452288733183,1.6369121341347894,2.3017208110012457,2.8632596159147603,0.440276933697711,0.5097230663022891,0.049999999999999996,0.9654877542375832,,0.3721585108293748,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,10.0,Full Sample,2018-01-02,2026-04-06,6.759580429422769,0.28163119382856117,-0.4594935703509856,16.611697298913082,0.35290430697806735,0.8832209681294638,1.3893288993480228,0.041411758665747166,0.7705650475257498,1.6242657678461192,1.627637810603404,2.56817870533473,0.36374223422378255,0.5862577657762175,0.05000000000000001,0.9626103265118057,-0.3763793370520977,0.37019557394971203,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,10.0,2018-2021,2018-01-02,2021-12-31,3.463225673467597,0.45423584964146624,-0.4594935703509856,11.275063926911956,0.37999176903908644,1.1771503158434342,1.4612752644121554,0.05723921768075427,1.0434520654823365,1.7253789956548167,1.7720004756830554,2.8096665946195545,0.3868073971561043,0.5631926028438956,0.05,0.9641797207575357,,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,10.0,2022,2022-01-03,2022-12-30,-0.3763793370520977,-0.37983660901620186,-0.40207361329724833,30.291387906372453,0.3179236925419625,-1.330448202054593,0.9787384775555005,-0.08635297121074643,-1.580325527527778,0.9513806517078808,1.090888790883922,0.6701045163904823,0.02230000710622907,0.9276999928937708,0.05,0.7717197668209669,-0.3763793370520977,,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ +hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,hybrid_tqqq_continuous::ma20_gap_trim_only::qqq,10.0,2023+,2023-01-03,2026-04-06,1.78784674529288,0.37019557394971203,-0.31828814634876823,9.667471787011483,0.32630288371510047,1.1343824407408427,1.5854621693967108,-0.05910443028348199,0.6855021018284927,1.6352084626335783,2.3088087173397134,2.8632596159147603,0.440276933697711,0.5097230663022891,0.049999999999999996,0.9654877542375832,,0.37019557394971203,hybrid_growth_tqqq_continuous_scaling,ma20_gap_trim_only,"Trim TQQQ continuously when QQQ sits below MA20, but never boost above the baseline size.",QQQ diff --git a/research/results/tqqq_hybrid_continuous_scaling_followup_recommendation.json b/research/results/tqqq_hybrid_continuous_scaling_followup_recommendation.json new file mode 100644 index 0000000..ef1e3d6 --- /dev/null +++ b/research/results/tqqq_hybrid_continuous_scaling_followup_recommendation.json @@ -0,0 +1,26 @@ +{ + "baseline_growth_reference": { + "idle_asset": "QQQ", + "oos_cagr": 0.38770315883497886, + "oos_max_drawdown": -0.3211199087725741, + "oos_ulcer": 9.627918627041247, + "oos_ir_vs_qqq": 0.7502300923853346 + }, + "baseline_defensive_reference": { + "idle_asset": "BOXX", + "oos_cagr": 0.23860213021458554, + "oos_max_drawdown": -0.20112252200733738, + "oos_ulcer": 7.51404066842126 + }, + "continuous_candidate": { + "scaling": "ma20_gap_trim_only", + "idle_asset": "QQQ", + "oos_cagr": 0.3721585108293748, + "oos_max_drawdown": -0.31763500064867334, + "oos_ulcer": 9.637568131252396, + "oos_ir_vs_qqq": 0.695452288733183, + "turnover_per_year": 2.8632596159147603, + "average_scale_while_invested": 0.9654877542375832 + }, + "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." +} \ No newline at end of file diff --git a/research/results/tqqq_hybrid_continuous_scaling_followup_summary.md b/research/results/tqqq_hybrid_continuous_scaling_followup_summary.md new file mode 100644 index 0000000..84297d0 --- /dev/null +++ b/research/results/tqqq_hybrid_continuous_scaling_followup_summary.md @@ -0,0 +1,40 @@ +# TQQQ continuous position-scaling follow-up + +## Setup +- Keep the existing MA200 + ATR TQQQ entry/exit framework. +- Change only the TQQQ position size while already invested. +- Use one continuous indicator only: QQQ distance vs MA20. +- Compare two idle assets: `BOXX` and `QQQ`. + +## OOS 2023+ (5 bps) +| 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 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| baseline | BOXX | 0.238602 | -0.201123 | 7.514041 | -0.187183 | -0.031695 | 1.237510 | 0.457729 | 1.000000 | +| baseline | QQQ | 0.387703 | -0.321120 | 9.627919 | 0.750230 | -0.054166 | 1.138170 | 0.455575 | 1.000000 | +| ma20_gap_linear | BOXX | 0.210636 | -0.199751 | 8.330539 | -0.353209 | -0.050267 | 4.403525 | 0.467389 | 1.020293 | +| ma20_gap_linear | QQQ | 0.365982 | -0.326197 | 10.136864 | 0.645963 | -0.067824 | 4.436067 | 0.466023 | 1.020293 | +| ma20_gap_trim_only | BOXX | 0.218393 | -0.182403 | 7.528751 | -0.341663 | -0.035422 | 2.910826 | 0.442867 | 0.965488 | +| ma20_gap_trim_only | QQQ | 0.372159 | -0.317635 | 9.637568 | 0.695452 | -0.057661 | 2.863260 | 0.440277 | 0.965488 | + +## Full Sample (5 bps) +| scaling | idle_asset | CAGR | Max Drawdown | Ulcer Index | Information Ratio vs QQQ | Turnover/Year | Average TQQQ Weight | Average Scale While Invested | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| baseline | BOXX | 0.221402 | -0.454508 | 12.312903 | 0.212472 | 1.270941 | 0.394726 | 1.000000 | +| baseline | QQQ | 0.284755 | -0.499827 | 17.100661 | 0.746109 | 1.240954 | 0.378468 | 1.000000 | +| ma20_gap_linear | BOXX | 0.219139 | -0.394992 | 11.705114 | 0.188906 | 3.749817 | 0.400119 | 1.022352 | +| ma20_gap_linear | QQQ | 0.285719 | -0.461445 | 16.880328 | 0.768228 | 3.672616 | 0.385694 | 1.022352 | +| ma20_gap_trim_only | BOXX | 0.214930 | -0.387385 | 11.232493 | 0.164054 | 2.596423 | 0.379484 | 0.962610 | +| ma20_gap_trim_only | QQQ | 0.283283 | -0.458986 | 16.580457 | 0.779122 | 2.568179 | 0.363742 | 0.962610 | + +## 2022 (5 bps) +| scaling | idle_asset | Total Return | 2022 Return | Max Drawdown | Ulcer Index | Turnover/Year | +| --- | --- | --- | --- | --- | --- | --- | +| baseline | BOXX | -0.161162 | -0.161162 | -0.173794 | 17.021359 | 0.512380 | +| baseline | QQQ | -0.387752 | -0.387752 | -0.412978 | 31.478228 | 0.505886 | +| ma20_gap_linear | BOXX | -0.136642 | -0.136642 | -0.149992 | 14.721060 | 0.742490 | +| ma20_gap_linear | QQQ | -0.376827 | -0.376827 | -0.402736 | 30.365284 | 0.742490 | +| ma20_gap_trim_only | BOXX | -0.136243 | -0.136243 | -0.149094 | 14.629202 | 0.670105 | +| ma20_gap_trim_only | QQQ | -0.376170 | -0.376170 | -0.401873 | 30.269567 | 0.670105 | + +## Recommendation +- 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. diff --git a/research/results/tqqq_hybrid_idle_throttle_followup_comparison.csv b/research/results/tqqq_hybrid_idle_throttle_followup_comparison.csv new file mode 100644 index 0000000..42c09b3 --- /dev/null +++ b/research/results/tqqq_hybrid_idle_throttle_followup_comparison.csv @@ -0,0 +1,73 @@ +strategy,display_name,cost_bps_one_way,period,Start,End,Total Return,CAGR,Max Drawdown,Sharpe,Beta vs QQQ,Alpha Ann vs QQQ,Information Ratio vs QQQ,Up Capture vs QQQ,Down Capture vs QQQ,Turnover/Year,Average TQQQ Weight,Average Idle Asset Weight,Average Cash Weight,2022 Return,2023+ CAGR,family,throttle,throttle_description,idle_asset +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,0.0,Full Sample,2018-01-02,2026-04-02,3.864953627885349,0.21148644166473662,-0.45376701841858935,0.8265844200795156,0.7815577475523527,0.08066882580829976,0.17727963090778706,1.1473810803073954,1.0635557606813186,1.2675437344466098,0.3950418800210779,0.6049581199789221,0.6049581199789221,-0.1615049100007211,0.2122848850176633,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,0.0,2018-2021,2018-01-02,2021-12-31,2.106955535298883,0.3281663807321038,-0.45376701841858935,1.0176317710319978,0.9671328504862722,0.082085275683285,0.30940054890555874,1.3397051955338386,1.3952426845101944,1.4794569807760352,0.43513858646664244,0.5648614135333575,0.5648614135333575,,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,0.0,2022,2022-01-03,2022-12-30,-0.1615049100007211,-0.16324193540946053,-0.1735824461427301,-2.0223632137263814,0.050776770298325884,-0.15558938548802412,0.540881559035779,0.0,0.26051446687760116,0.5123799214934135,0.027606347320967776,0.9723936526790322,0.9723936526790322,-0.1615049100007211,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,0.0,2023+,2023-01-03,2026-04-02,0.8674248907468398,0.2122848850176633,-0.20252494627034068,0.9117739945550845,1.0229826963537256,-0.05193791163757917,-0.3342766713897081,1.138975270271274,1.879636562043412,1.2441728620606167,0.4586110071506467,0.5413889928493533,0.5413889928493533,,0.2122848850176633,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,5.0,Full Sample,2018-01-02,2026-04-02,3.83936770857858,0.21071201227121783,-0.45450807554451045,0.8242661257910064,0.7815841755177776,0.08002868065446385,0.1743279308906257,1.1464717151357824,1.064964512617286,1.2675437344466098,0.3950418800210779,0.6049581199789221,0.6049581199789221,-0.16171926304894513,0.21153058719506745,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,5.0,2018-2021,2018-01-02,2021-12-31,2.09765441401849,0.327169884669696,-0.45450807554451045,1.0153282036614026,0.9671781984130543,0.08133445479825877,0.30624109115450027,1.3385464731647467,1.39682171816517,1.4794569807760352,0.43513858646664244,0.5648614135333575,0.5648614135333575,,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,5.0,2022,2022-01-03,2022-12-30,-0.16171926304894513,-0.16345836239765144,-0.173793711687261,-2.0247083302514675,0.05079275718315594,-0.1558381047214478,0.5400735821937762,0.0,0.26086022769738937,0.5123799214934135,0.027606347320967776,0.9723936526790322,0.9723936526790322,-0.16171926304894513,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,5.0,2023+,2023-01-03,2026-04-02,0.863657799264506,0.21153058719506745,-0.202524946270341,0.909215207694445,1.022989632598576,-0.05256383086354807,-0.33882892353275357,1.1382048491373713,1.8825972041900252,1.2441728620606167,0.4586110071506467,0.5413889928493533,0.5413889928493533,,0.21153058719506745,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,10.0,Full Sample,2018-01-02,2026-04-02,3.8139113750476614,0.2099379262444454,-0.455248330756692,0.8219469044623676,0.7816106034832023,0.07938853550062795,0.17137629229662782,1.1455624515588405,1.066372771032739,1.2675437344466098,0.3950418800210779,0.6049581199789221,0.6049581199789221,-0.16193359174012978,0.2107766339377546,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,10.0,2018-2021,2018-01-02,2021-12-31,2.0883790889911333,0.3261739160997692,-0.455248330756692,1.0130236553250918,0.9672235463398369,0.08058363391323244,0.3030816579360313,1.337387869156218,1.3983999614261473,1.4794569807760352,0.43513858646664244,0.5648614135333575,0.5648614135333575,,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,10.0,2022,2022-01-03,2022-12-30,-0.16193359174012978,-0.163674764141724,-0.17400495322558696,-2.027042412515558,0.05080874406798597,-0.15608682395487153,0.5392654242999626,0.0,0.2612059492282103,0.5123799214934135,0.027606347320967776,0.9723936526790322,0.9723936526790322,-0.16193359174012978,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::cash,hybrid_tqqq_followup::baseline::cash,10.0,2023+,2023-01-03,2026-04-02,0.8598976851988573,0.2107766339377546,-0.20252494627034068,0.9066549427056952,1.0229965688434266,-0.053189750089517124,-0.3433791323839692,1.1374345292133397,1.885557082932777,1.2441728620606167,0.4586110071506467,0.5413889928493533,0.5413889928493533,,0.2107766339377546,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",CASH +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,0.0,Full Sample,2018-01-02,2026-04-02,4.241857546508401,0.22249849042580805,-0.45376701841858935,0.85900388849641,0.7815971757411474,0.08971907649179979,0.21925408134080984,1.1634554218904438,1.0477226729074718,1.2726292618630546,0.39491614657904006,0.5550838534209599,0.05000000000000001,-0.1609475066439653,0.24023596705726447,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,0.0,2018-2021,2018-01-02,2021-12-31,2.106955535298883,0.3281663807321038,-0.45376701841858935,1.0176317710319978,0.9671328504862722,0.082085275683285,0.30940054890555874,1.3397051955338386,1.3952426845101944,1.4919741158000244,0.43513858646664244,0.5148614135333576,0.05,,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,0.0,2022,2022-01-03,2022-12-30,-0.1609475066439653,-0.16267913593344063,-0.1735824461427301,-2.014398157427906,0.050816425131225175,-0.15490840642091103,0.5430127078288111,0.0,0.2594421696790773,0.5123799214934135,0.027606347320967776,0.9223936526790323,0.05,-0.1609475066439653,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,0.0,2023+,2023-01-03,2026-04-02,1.0107637355746082,0.24023596705726447,-0.20112252329052693,1.0057331810227248,1.0229342202720788,-0.029080005221517068,-0.16771058719442872,1.1805460110589923,1.810321039511985,1.2416877216203905,0.4582910425386388,0.4917089574613613,0.05,,0.24023596705726447,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,5.0,Full Sample,2018-01-02,2026-04-02,4.214181488805429,0.22171395557787577,-0.4545080755445108,0.8566738865103458,0.7816232176421879,0.08907645837898656,0.21628584259521003,1.162538687229806,1.0491324316288908,1.2726292618630546,0.39491614657904006,0.5550838534209599,0.05000000000000001,-0.16116200218689214,0.2394659221932549,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,5.0,2018-2021,2018-01-02,2021-12-31,2.097576972658132,0.3271615784095361,-0.4545080755445108,1.0153094354252301,0.9671772900106957,0.08132844728422323,0.3062143762940255,1.3385313171536564,1.39682171816517,1.4919741158000244,0.43513858646664244,0.5148614135333576,0.05,,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,5.0,2022,2022-01-03,2022-12-30,-0.16116200218689214,-0.16289570848938983,-0.173793711687261,-2.016745407301989,0.05083241201605523,-0.15515712565433468,0.542204685874988,0.0,0.2597879304988655,0.5123799214934135,0.027606347320967776,0.9223936526790323,0.05,-0.16116200218689214,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,5.0,2023+,2023-01-03,2026-04-02,1.0067161293302096,0.2394659221932549,-0.20112252329052704,1.0031772612725123,1.0229414800212788,-0.02970476496766528,-0.1722664675702314,1.1797772150820038,1.8132862079662166,1.2416877216203905,0.4582910425386388,0.4917089574613613,0.05,,0.2394659221932549,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,10.0,Full Sample,2018-01-02,2026-04-02,4.186646196881026,0.22092977123305646,-0.4552483307566918,0.8543429098286415,0.7816492595432278,0.08843384026617347,0.21331756270500876,1.1616220539601687,1.0505416965036591,1.2726292618630546,0.39491614657904006,0.5550838534209599,0.05000000000000001,-0.16137647335658778,0.2386962282570264,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,10.0,2018-2021,2018-01-02,2021-12-31,2.088224670036674,0.3261573158906803,-0.4552483307566918,1.0129861216717528,0.9672217295351191,0.08057161888516148,0.3030282422114662,1.3373575571340368,1.3983999614261473,1.4919741158000244,0.43513858646664244,0.5148614135333576,0.05,,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,10.0,2022,2022-01-03,2022-12-30,-0.16137647335658778,-0.16311225578424127,-0.17400495322558696,-2.0190816607112607,0.05084839890088527,-0.15540584488775847,0.5413964821132139,0.0,0.2601336520296864,0.5123799214934135,0.027606347320967776,0.9223936526790323,0.05,-0.16137647335658778,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::boxx,hybrid_tqqq_followup::baseline::boxx,10.0,2023+,2023-01-03,2026-04-02,1.0026760036799964,0.2386962282570264,-0.20112252329052693,1.0006197054369317,1.0229487397704793,-0.03032952471381362,-0.17682122438568088,1.1790085197881612,1.816250611550341,1.2416877216203905,0.4582910425386388,0.4917089574613613,0.05,,0.2386962282570264,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",BOXX +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,0.0,Full Sample,2018-01-02,2026-04-02,6.90742291303007,0.28499120911976106,-0.49936213570489874,0.8689299350010367,1.4396508564664416,0.040650760563404234,0.7503313176435361,1.6610819079205674,1.6624483273691884,1.2426021610492208,0.3786503610917339,0.5713496389082661,0.05000000000000001,-0.3875967515463894,0.38729580848839285,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.464273495293325,0.4543213110723172,-0.49936213570489874,1.135042683344891,1.5372294790830927,0.04597340374397964,0.9706877610531691,1.7696676699527718,1.852485467089789,1.5125477559954965,0.40351837510055805,0.546481624899442,0.05,,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,0.0,2022,2022-01-03,2022-12-30,-0.3875967515463894,-0.391121962273268,-0.4128289360544629,-1.3755276251987911,0.9831469444678318,-0.10228701861822723,-1.7499627884351496,0.9513806559118678,1.114955328967509,0.5058864265927977,0.027191235059760958,0.922808764940239,0.05,-0.3875967515463894,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,0.0,2023+,2023-01-03,2026-04-02,1.8923223138462015,0.38729580848839285,-0.3207186081635566,1.1489982252712874,1.6248580708194817,-0.05230070983447603,0.7551286586194976,1.6700408189917648,2.2821760836422347,1.1420131080867713,0.45613414331643376,0.49386585668356636,0.05,,0.38729580848839285,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,5.0,Full Sample,2018-01-02,2026-04-02,6.866659629662785,0.2841860989064324,-0.4998269020621747,0.8672078111727172,1.439676373836195,0.04002328730190734,0.7465345099551489,1.6601550196418426,1.663822269550343,1.2426021610492208,0.3786503610917339,0.5713496389082661,0.05000000000000001,-0.38775217486285474,0.3865033212434974,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,5.0,2018-2021,2018-01-02,2021-12-31,3.450630490813416,0.45320739463332105,-0.4998269020621747,1.13310509412633,1.5372711921313038,0.04520703040338194,0.9666660508336328,1.7684156761609076,1.8540824630214523,1.5125477559954965,0.40351837510055805,0.546481624899442,0.05,,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,5.0,2022,2022-01-03,2022-12-30,-0.38775217486285474,-0.3912783099273449,-0.4129779556331823,-1.376269812068425,0.9831636726507397,-0.10253226113580564,-1.7537162377036373,0.9513806559118678,1.1152887787301657,0.5058864265927977,0.027191235059760958,0.922808764940239,0.05,-0.38775217486285474,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,5.0,2023+,2023-01-03,2026-04-02,1.8869653391157302,0.3865033212434974,-0.32111996059789283,1.1472778173071922,1.624867668110731,-0.05287610346492358,0.7513739398647076,1.6693523702976065,2.284970142175071,1.1420131080867713,0.45613414331643376,0.49386585668356636,0.05,,0.3865033212434974,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,10.0,Full Sample,2018-01-02,2026-04-02,6.826099020410522,0.2833813447201059,-0.5002913330153733,0.8654851005910786,1.439701891205949,0.03939581404041042,0.7427356649824411,1.6592282243136047,1.6651957503678487,1.2426021610492208,0.3786503610917339,0.5713496389082661,0.05000000000000001,-0.3879075811360677,0.3857111539677638,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,10.0,2018-2021,2018-01-02,2021-12-31,3.4370264898963683,0.4520941109916876,-0.5002913330153733,1.1311667135887884,1.5373129051795151,0.0444406570627842,0.9626420188527944,1.7671638127755038,1.8556787076429673,1.5125477559954965,0.40351837510055805,0.546481624899442,0.05,,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,10.0,2022,2022-01-03,2022-12-30,-0.3879075811360677,-0.39143463996962335,-0.4131269588708635,-1.3770114885179843,0.9831804008336477,-0.10277750365338398,-1.7574465836564412,0.9513806559118678,1.1156221919277272,0.5058864265927977,0.027191235059760958,0.922808764940239,0.05,-0.3879075811360677,,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::baseline::qqq,hybrid_tqqq_followup::baseline::qqq,10.0,2023+,2023-01-03,2026-04-02,1.8816173907008018,0.3857111539677638,-0.3215211390262849,1.1455564757078178,1.6248772654019796,-0.053451497095371,0.7476164103458666,1.6686639840187714,2.2877635085492454,1.1420131080867713,0.45613414331643376,0.49386585668356636,0.05,,0.3857111539677638,hybrid_growth_tqqq_attack_followup,baseline,"Current MA200 + ATR staged TQQQ logic, no extra throttle.",QQQ +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,0.0,Full Sample,2018-01-02,2026-04-02,2.9674572108131354,0.18189406668134556,-0.352043836749138,0.7927976737154556,0.6703174971213475,0.06952157906310866,0.026859407906467656,1.0450401674540344,1.0141318913584065,3.964539007896527,0.37197164385726905,0.6280283561427309,0.6280283561427309,-0.11756452831484454,0.19827037756744703,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,0.0,2018-2021,2018-01-02,2021-12-31,1.5001709423142588,0.25784987300241147,-0.352043836749138,0.9184942172568866,0.8282344945092385,0.05328689968153209,0.03321246752775352,1.2171288677319339,1.4529723611307221,4.934052430090124,0.4191893819862136,0.5808106180137864,0.5808106180137864,,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,0.0,2022,2022-01-03,2022-12-30,-0.11756452831484454,-0.11886289330548838,-0.1312023896781671,-1.8184051759715867,0.037129131367456845,-0.11042089582075318,0.6984323532177448,0.0,0.18963671393966675,0.5503525005233149,0.017447319584787117,0.9825526804152128,0.9825526804152128,-0.11756452831484454,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,0.0,2023+,2023-01-03,2026-04-02,0.7982894269915983,0.19827037756744703,-0.18341364679799643,0.9301147242073575,0.8853440170442837,-0.03202818474288276,-0.45917012421045994,1.0415888660794628,1.6795341663283023,3.8343727794041618,0.4227570737448972,0.5772429262551028,0.5772429262551028,,0.19827037756744703,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,5.0,Full Sample,2018-01-02,2026-04-02,2.90310578885242,0.17955266840126627,-0.35272014897806425,0.7848856758060024,0.6703142661293966,0.06753602240699268,0.01737401804152531,1.0423914605948816,1.018843559860872,3.964539007896527,0.37197164385726905,0.6280283561427309,0.6280283561427309,-0.11780526234174549,0.19597051230591078,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,5.0,2018-2021,2018-01-02,2021-12-31,1.4756725387183893,0.2547529305433116,-0.35272014897806425,0.9102549964038518,0.8281861891311088,0.05083614512149469,0.02220835397250668,1.214023606148514,1.4598335183326823,4.934052430090124,0.4191893819862136,0.5808106180137864,0.5808106180137864,,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,5.0,2022,2022-01-03,2022-12-30,-0.11780526234174549,-0.11910610269592559,-0.13143940320947411,-1.8221448186817888,0.03713689629065071,-0.11069128304918369,0.6975688857966911,0.0,0.19002502842915886,0.5503525005233149,0.017447319584787117,0.9825526804152128,0.9825526804152128,-0.11780526234174549,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,5.0,2023+,2023-01-03,2026-04-02,0.7871156594153967,0.19597051230591078,-0.18413954712157354,0.9213420020425895,0.8854486384247848,-0.03397957529231673,-0.4731940972883959,1.0389767297348245,1.6880010428223666,3.8343727794041618,0.4227570737448972,0.5772429262551028,0.5772429262551028,,0.19597051230591078,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,10.0,Full Sample,2018-01-02,2026-04-02,2.8397880211116378,0.17721553254836686,-0.3533959167878009,0.7769702930012565,0.6703110351374454,0.06555046575087671,0.007889233111722658,1.0397438255852198,1.0235529949188933,3.964539007896527,0.37197164385726905,0.6280283561427309,0.6280283561427309,-0.1180459556751765,0.1936747528612992,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,10.0,2018-2021,2018-01-02,2021-12-31,1.4514098544465628,0.2516630591923037,-0.3533959167878009,0.9020114213624296,0.8281378837529788,0.04838539056145731,0.011205061170945094,1.2109198590863866,1.466690120954303,4.934052430090124,0.4191893819862136,0.5808106180137864,0.5808106180137864,,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,10.0,2022,2022-01-03,2022-12-30,-0.1180459556751765,-0.11934927019332786,-0.13167637667622056,-1.825872195481466,0.03714466121384458,-0.11096167027761421,0.6967052221784571,0.0,0.19041327727830837,0.5503525005233149,0.017447319584787117,0.9825526804152128,0.9825526804152128,-0.1180459556751765,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::cash,hybrid_tqqq_followup::ma60_half::cash,10.0,2023+,2023-01-03,2026-04-02,0.7760098321416897,0.1936747528612992,-0.18486489430163922,0.9125665658220913,0.8855532598052859,-0.03593096584175068,-0.4872104182591144,1.0363652984530205,1.6964659847367338,3.8343727794041618,0.4227570737448972,0.5772429262551028,0.5772429262551028,,0.1936747528612992,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",CASH +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,0.0,Full Sample,2018-01-02,2026-04-02,3.2733398211198805,0.19258673568580864,-0.352043836749138,0.8291964487997141,0.6698511584031975,0.07858735396487428,0.06976545439101359,1.0590919661044484,0.9951483489320743,3.9649496121224264,0.37146202243396564,0.5785379775660342,0.05000000000000001,-0.1169779148690363,0.2257666758213892,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,0.0,2018-2021,2018-01-02,2021-12-31,1.5001709423142588,0.25784987300241147,-0.352043836749138,0.9184942172568866,0.8282344945092385,0.05328689968153209,0.03321246752775352,1.2171288677319339,1.4529723611307221,4.946569565114114,0.4191893819862136,0.5308106180137865,0.05,,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,0.0,2022,2022-01-03,2022-12-30,-0.1169779148690363,-0.11827024469780267,-0.1312023896781671,-1.8083685325474794,0.03716878620035614,-0.10973991675364009,0.7005690795049123,0.0,0.1885644167411429,0.5503525005233149,0.017447319584787117,0.9325526804152128,0.05,-0.1169779148690363,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,0.0,2023+,2023-01-03,2026-04-02,0.9356470082511681,0.2257666758213892,-0.17947042248958178,1.0352291712130635,0.8834334307903964,-0.00887933551660602,-0.29488928198174785,1.0779289971062664,1.5960548248158948,3.8200050493859403,0.4214601966505031,0.5285398033494969,0.05,,0.2257666758213892,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,5.0,Full Sample,2018-01-02,2026-04-02,3.204024813933212,0.19022407821140574,-0.35272014897806414,0.8212768680822382,0.6698467569188401,0.07660181845894315,0.06027145517751494,1.0564362625779724,0.9998547501695847,3.9649496121224264,0.37146202243396564,0.5785379775660342,0.05000000000000001,-0.1172188089278281,0.2234232640968059,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,5.0,2018-2021,2018-01-02,2021-12-31,1.475610646904919,0.2547450775137956,-0.35272014897806414,0.9102340040665352,0.82818528072875,0.05083013760745919,0.022180414319813345,1.2140084501374235,1.4598335183326823,4.946569565114114,0.4191893819862136,0.5308106180137865,0.05,,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,5.0,2022,2022-01-03,2022-12-30,-0.1172188089278281,-0.1185136176697138,-0.13143940320947411,-1.8121091368760913,0.03717655112355002,-0.1100103039820706,0.6997055772534826,0.0,0.188952731230635,0.5503525005233149,0.017447319584787117,0.9325526804152128,0.05,-0.1172188089278281,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,5.0,2023+,2023-01-03,2026-04-02,0.9236668351796784,0.2234232640968059,-0.18019979222539684,1.0264567174913755,0.8835354400071317,-0.010822816840539737,-0.30891906216676623,1.075319450093294,1.60449802073189,3.8200050493859403,0.4214601966505031,0.5285398033494969,0.05,,0.2234232640968059,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,10.0,Full Sample,2018-01-02,2026-04-02,3.1358232381412705,0.1878657224609257,-0.353395916787801,0.8133537093418998,0.6698423554344831,0.074616282953012,0.050777764917010644,1.053781630791908,1.0045589234305796,3.9649496121224264,0.37146202243396564,0.5785379775660342,0.05000000000000001,-0.11745966226609827,0.2210840184091869,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,10.0,2018-2021,2018-01-02,2021-12-31,1.4512872839538358,0.25164739166315164,-0.353395916787801,0.9019694374298076,0.8281360669482613,0.048373375533386304,0.011149211453299992,1.2108895470642054,1.466690120954303,4.946569565114114,0.4191893819862136,0.5308106180137865,0.05,,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,10.0,2022,2022-01-03,2022-12-30,-0.11745966226609827,-0.11875694872041287,-0.13167637667622056,-1.8158375372595947,0.03718431604674389,-0.11028069121050112,0.6988418782049339,0.0,0.1893409800797845,0.5503525005233149,0.017447319584787117,0.9325526804152128,0.05,-0.11745966226609827,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::boxx,hybrid_tqqq_followup::ma60_half::boxx,10.0,2023+,2023-01-03,2026-04-02,0.9117592148550822,0.2210840184091869,-0.18092860620123086,1.0176809622857663,0.8836374492238668,-0.012766298164473406,-0.3229434279203597,1.0727106078610606,1.6129393066509141,3.8200050493859403,0.4214601966505031,0.5285398033494969,0.05,,0.2210840184091869,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",BOXX +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,0.0,Full Sample,2018-01-02,2026-04-02,6.027169526015657,0.26673210663069447,-0.4361744470553305,0.8598085269284516,1.360224821499782,0.0336146208189781,0.7075660965456323,1.578750623778917,1.6052549872508617,3.73449936933351,0.34735913204300173,0.6026408679569982,0.05000000000000001,-0.3616180446096079,0.3758701584439377,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,0.0,2018-2021,2018-01-02,2021-12-31,2.909359712379485,0.40679016398609513,-0.4361744470553305,1.0987774105390467,1.4408373494917333,0.027793178310877045,0.8572559341194503,1.675398130754633,1.8565940801245513,4.57032089317141,0.3764844004391707,0.5735155995608293,0.05000000000000001,,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,0.0,2022,2022-01-03,2022-12-30,-0.3616180446096079,-0.3649822786893806,-0.3879206015044464,-1.2737390264535369,0.9722061280871663,-0.0662546201841072,-1.3737151186505023,0.9513806559118678,1.0592198456485236,0.5058864265927977,0.015587649402390439,0.9344123505976095,0.05,-0.3616180446096079,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,0.0,2023+,2023-01-03,2026-04-02,1.8157506627463813,0.3758701584439377,-0.2931657282460369,1.176557507356088,1.522407105350021,-0.03976864984474203,0.7468580289866961,1.5857714150777078,2.114873467186429,3.7110454998273794,0.4135141892202473,0.5364858107797528,0.05,,0.3758701584439377,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,5.0,Full Sample,2018-01-02,2026-04-02,5.919771207477247,0.26436851930191496,-0.4365198004875672,0.8543892319317944,1.3602246183360966,0.03174372421737735,0.6947329276112807,1.5761757971768309,1.609692576330637,3.73449936933351,0.34735913204300173,0.6026408679569982,0.05000000000000001,-0.36177867033319777,0.37331214938527135,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,5.0,2018-2021,2018-01-02,2021-12-31,2.8738988487677375,0.4035847077402166,-0.4365198004875672,1.0927181425940793,1.4407942371639195,0.025522654342706882,0.8438110441716412,1.6723891423088795,1.8629240338097697,4.57032089317141,0.3764844004391707,0.5735155995608293,0.05000000000000001,,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,5.0,2022,2022-01-03,2022-12-30,-0.36177867033319777,-0.3651439387432053,-0.38807460914117153,-1.2745224158450312,0.9722136849764935,-0.06650301708030798,-1.379508910678903,0.9513806559118678,1.0595644568087141,0.5058864265927977,0.015587649402390439,0.9344123505976095,0.05,-0.36177867033319777,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,5.0,2023+,2023-01-03,2026-04-02,1.7988017980112083,0.37331214938527135,-0.293642217228371,1.170548796467444,1.5225115861350325,-0.04165814395732323,0.7329349938113593,1.5832189581076095,2.1231163680784078,3.7110454998273794,0.4135141892202473,0.5364858107797528,0.05,,0.37331214938527135,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,10.0,Full Sample,2018-01-02,2026-04-02,5.8139985605724975,0.26200898891947144,-0.43686498483797376,0.8489681451801678,1.3602244151724108,0.02987282761577672,0.6818925519996993,1.5736019729514303,1.6141281497393214,3.73449936933351,0.34735913204300173,0.6026408679569982,0.05000000000000001,-0.36193927142788507,0.37075856179211986,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,10.0,2018-2021,2018-01-02,2021-12-31,2.838753914088707,0.40038603220259206,-0.43686498483797376,1.0866559321372917,1.4407511248361056,0.023252130374536835,0.8303559111674814,1.669381539391438,1.8692499450882736,4.57032089317141,0.3764844004391707,0.5735155995608293,0.05000000000000001,,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,10.0,2022,2022-01-03,2022-12-30,-0.36193927142788507,-0.3653055735306514,-0.38822859316375224,-1.2753054756745519,0.9722212418658208,-0.06675141397650868,-1.3852806918018288,0.9513806559118678,1.0599090151293333,0.5058864265927977,0.015587649402390439,0.9344123505976095,0.05,-0.36193927142788507,,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ +hybrid_tqqq_followup::ma60_half::qqq,hybrid_tqqq_followup::ma60_half::qqq,10.0,2023+,2023-01-03,2026-04-02,1.7819527520572027,0.37075856179211986,-0.2941184352407391,1.1645382663376105,1.5226160669200444,-0.043547638069904575,0.7190076730053774,1.5806672025729378,2.131357392420734,3.7110454998273794,0.4135141892202473,0.5364858107797528,0.05,,0.37075856179211986,hybrid_growth_tqqq_attack_followup,ma60_half,"If QQQ closes below MA60, cut the computed TQQQ target ratio by 50% and send the rest to the idle asset.",QQQ diff --git a/research/results/tqqq_hybrid_idle_throttle_followup_recommendation.json b/research/results/tqqq_hybrid_idle_throttle_followup_recommendation.json new file mode 100644 index 0000000..becb8cd --- /dev/null +++ b/research/results/tqqq_hybrid_idle_throttle_followup_recommendation.json @@ -0,0 +1,22 @@ +{ + "best_baseline_by_cagr": { + "idle_asset": "QQQ", + "oos_cagr": 0.3865033212434974, + "oos_max_drawdown": -0.32111996059789283, + "oos_ir_vs_qqq": 0.7513739398647076, + "return_2022": null + }, + "safest_baseline_idle_asset": { + "idle_asset": "BOXX", + "oos_cagr": 0.2394659221932549, + "oos_max_drawdown": -0.20112252329052704 + }, + "best_throttle_candidate": { + "idle_asset": "QQQ", + "oos_cagr": 0.37331214938527135, + "oos_max_drawdown": -0.293642217228371, + "oos_ir_vs_qqq": 0.7329349938113593, + "return_2022": null + }, + "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." +} \ No newline at end of file diff --git a/research/results/tqqq_hybrid_idle_throttle_followup_summary.md b/research/results/tqqq_hybrid_idle_throttle_followup_summary.md new file mode 100644 index 0000000..04ddcfc --- /dev/null +++ b/research/results/tqqq_hybrid_idle_throttle_followup_summary.md @@ -0,0 +1,30 @@ +# TQQQ idle-asset and minimal-throttle follow-up + +## Setup +- Attack-only normalization: isolate the TQQQ sleeve and compare idle assets directly. +- Baseline: existing MA200 + ATR staged TQQQ logic. +- Minimal throttle: if QQQ closes below MA60, cut the computed TQQQ target by 50%. +- Idle assets tested: `CASH`, `BOXX`, `QQQ`. + +## OOS 2023+ (5 bps) +| throttle | idle_asset | CAGR | Max Drawdown | Information Ratio vs QQQ | Alpha Ann vs QQQ | Turnover/Year | Average TQQQ Weight | Average Idle Asset Weight | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| baseline | BOXX | 0.239466 | -0.201123 | -0.172266 | -0.029705 | 1.241688 | 0.458291 | 0.491709 | +| baseline | CASH | 0.211531 | -0.202525 | -0.338829 | -0.052564 | 1.244173 | 0.458611 | 0.541389 | +| baseline | QQQ | 0.386503 | -0.321120 | 0.751374 | -0.052876 | 1.142013 | 0.456134 | 0.493866 | +| ma60_half | BOXX | 0.223423 | -0.180200 | -0.308919 | -0.010823 | 3.820005 | 0.421460 | 0.528540 | +| ma60_half | CASH | 0.195971 | -0.184140 | -0.473194 | -0.033980 | 3.834373 | 0.422757 | 0.577243 | +| ma60_half | QQQ | 0.373312 | -0.293642 | 0.732935 | -0.041658 | 3.711045 | 0.413514 | 0.536486 | + +## 2022 (5 bps) +| throttle | idle_asset | Total Return | 2022 Return | Max Drawdown | Turnover/Year | Average TQQQ Weight | Average Idle Asset Weight | +| --- | --- | --- | --- | --- | --- | --- | --- | +| baseline | BOXX | -0.161162 | -0.161162 | -0.173794 | 0.512380 | 0.027606 | 0.922394 | +| baseline | CASH | -0.161719 | -0.161719 | -0.173794 | 0.512380 | 0.027606 | 0.972394 | +| baseline | QQQ | -0.387752 | -0.387752 | -0.412978 | 0.505886 | 0.027191 | 0.922809 | +| ma60_half | BOXX | -0.117219 | -0.117219 | -0.131439 | 0.550353 | 0.017447 | 0.932553 | +| ma60_half | CASH | -0.117805 | -0.117805 | -0.131439 | 0.550353 | 0.017447 | 0.982553 | +| ma60_half | QQQ | -0.361779 | -0.361779 | -0.388075 | 0.505886 | 0.015588 | 0.934412 | + +## Recommendation +- 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. diff --git a/research/results/tqqq_hybrid_indicator_variants_comparison.csv b/research/results/tqqq_hybrid_indicator_variants_comparison.csv new file mode 100644 index 0000000..c54ee64 --- /dev/null +++ b/research/results/tqqq_hybrid_indicator_variants_comparison.csv @@ -0,0 +1,193 @@ +strategy,display_name,cost_bps_one_way,period,Start,End,Total Return,CAGR,Max Drawdown,Volatility,Sharpe,Beta vs QQQ,Alpha Ann vs QQQ,Information Ratio vs QQQ,Up Capture vs QQQ,Down Capture vs QQQ,Turnover/Year,2022 Return,2023+ CAGR,Average TQQQ Weight,Average Idle Asset Weight,Average Cash Weight,TQQQ Days Share,Raw Gate True Share,Gate Active Share,Gate Flips/Year,family,overlay,overlay_description,idle_asset,entry_confirm_days,exit_confirm_days,income_mode,safe_haven_symbols +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,0.0,Full Sample,2018-01-02,2026-04-02,1.5447729001621067,0.11993032779089252,-0.18934585901835888,0.1347364537604419,0.9100367412495289,0.4099690262673323,0.04315745761838241,-0.4222930753358659,0.5753902355888708,0.5012169524428787,0.5580739307559698,-0.07690045827933722,0.18030751328133388,0.1554925840614345,0.2527745810523886,0.021487745532306486,0.7005785920925748,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,0.0,2018-2021,2018-01-02,2021-12-31,0.6099883431008604,0.1266176769285834,-0.18934585901835888,0.12569393545385185,1.0105561002059245,0.36473476966414065,0.029659642899056676,-0.7832240950224705,0.5045219036512586,0.5241258962606313,0.7091383239316892,,,0.16705736041094224,0.2711034535236502,0.02306109547024171,0.6726190476190477,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,0.0,2022,2022-01-03,2022-12-30,-0.07690045827933722,-0.07776964787574947,-0.10041390236820846,0.04895639365702776,-1.616158086168676,0.07237120954378123,-0.054229874219487405,0.8805475135683589,0.11843101123725515,0.17490081855996265,0.21792756412725708,-0.07690045827933722,,0.011753992958704945,0.368246007041295,0.019999999999999997,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,0.0,2023+,2023-01-03,2026-04-02,0.7122917502662982,0.18030751328133388,-0.17756297485548866,0.16080042644407583,1.1150221128673377,0.7665994068994182,-0.026911381049140145,-1.2878844720583564,0.7732901269957135,1.0291421077753011,0.4789991680765458,,0.18030751328133388,0.18545711388533806,0.1945428861146619,0.020000000000000004,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,5.0,Full Sample,2018-01-02,2026-04-02,1.5389159803853785,0.11961744182187539,-0.189709110693409,0.13474001050913065,0.9079377017261492,0.4099692819128998,0.04287782023528366,-0.4239444344134351,0.5749562756235569,0.5017907955809267,0.5580739307559698,-0.0770002766318435,0.1800248701605136,0.1554925840614345,0.2527745810523886,0.021487745532306486,0.7005785920925748,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,5.0,2018-2021,2018-01-02,2021-12-31,0.6077052969077286,0.1262175162327479,-0.189709110693409,0.125700299368391,1.007688049153489,0.3647327688887755,0.029306093196383345,-0.7851835774546568,0.5039009974839752,0.5247405641030995,0.7091383239316892,,,0.16705736041094224,0.2711034535236502,0.02306109547024171,0.6726190476190477,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,5.0,2022,2022-01-03,2022-12-30,-0.0770002766318435,-0.07787054621546174,-0.10051117812032906,0.04896474514649518,-1.6180906528327792,0.07237783060801257,-0.05433572192810148,0.8801906429281416,0.11843101123725515,0.1750627861942472,0.21792756412725708,-0.0770002766318435,,0.011753992958704945,0.368246007041295,0.019999999999999997,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,5.0,2023+,2023-01-03,2026-04-02,0.7109618090998209,0.1800248701605136,-0.17775667928803107,0.16080129245731234,1.1135219850155464,0.7666020026312627,-0.02715233614801035,-1.2913243966090404,0.773015205881233,1.030361399133246,0.4789991680765458,,0.1800248701605136,0.18545711388533806,0.1945428861146619,0.020000000000000004,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,10.0,Full Sample,2018-01-02,2026-04-02,1.5330719315817252,0.11930461063335107,-0.19007223484330593,0.13474378106228957,0.9058373356788906,0.40996953755846727,0.04259818285218488,-0.42559530813428087,0.5745223585190785,0.5023645699371859,0.5580739307559698,-0.07710009015346475,0.17974227487983452,0.1554925840614345,0.2527745810523886,0.021487745532306486,0.7005785920925748,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,10.0,2018-2021,2018-01-02,2021-12-31,0.6054252001864755,0.12581744710839504,-0.19007223484330593,0.12570701474610518,1.004817479123382,0.3647307681134102,0.028952543493710008,-0.7871418570521677,0.5032801640942126,0.5253551306946351,0.7091383239316892,,,0.16705736041094224,0.2711034535236502,0.02306109547024171,0.6726190476190477,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,10.0,2022,2022-01-03,2022-12-30,-0.07710009015346475,-0.07797143954356844,-0.10060844916461875,0.048973225413364393,-1.6200183004416373,0.0723844516722439,-0.05444156963671551,0.8798337081157014,0.11843101123725515,0.17522474598982368,0.21792756412725708,-0.07710009015346475,,0.011753992958704945,0.368246007041295,0.019999999999999997,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_growth_income_runtime_full_reference,hybrid_growth_income_runtime_full_reference,10.0,2023+,2023-01-03,2026-04-02,0.7096328076075773,0.17974227487983452,-0.17795035024072858,0.16080226180613408,1.1120211587086033,0.7666045983631072,-0.0273932912468806,-1.2947598330256733,0.7727402962901656,1.0315805725818468,0.4789991680765458,,0.17974227487983452,0.18545711388533806,0.1945428861146619,0.020000000000000004,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_runtime_full_reference,baseline,Current runtime full strategy with income layer and BOXX idle asset.,BOXX,0,0,runtime_full_reference, +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,0.0,Full Sample,2018-01-02,2026-04-02,3.864953434077184,0.2114864358121591,-0.45376705207629975,0.28084910345106295,0.8265844551645473,0.7815571495096657,0.08066892145720952,0.1772794736900385,1.1473814427372684,1.0635563188861932,1.2675436627911207,-0.16150478560416082,0.21228485316838608,0.3950418773495771,0.6049581226504229,0.6049581226504229,0.7005785920925748,1.0,0.9995178399228544,0.12126494023904381,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,0.0,2018-2021,2018-01-02,2021-12-31,2.106955215411264,0.3281663464987201,-0.45376705207629975,0.33435325784946307,1.0176318261630373,0.9671306803569517,0.08208575249061398,0.30939982794833476,1.3397056840548802,1.3952440858081852,1.4794569640345903,,,0.43513858815928874,0.5648614118407113,0.5648614118407113,0.6726190476190477,1.0,0.9990079365079365,0.2503427004797807,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,0.0,2022,2022-01-03,2022-12-30,-0.16150478560416082,-0.16324180980913128,-0.17358244552229807,0.08557024170455464,-2.022354893791229,0.050777136199609704,-0.1555890783652545,0.5408831914457454,0.0,0.2605143548331817,0.5123799085670094,-0.16150478560416082,,0.027606346529602182,0.9723936534703979,0.9723936534703979,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,0.0,2023+,2023-01-03,2026-04-02,0.8674247315750327,0.21228485316838608,-0.2025249507591308,0.24483477548708577,0.911773879282046,1.0229824002506824,-0.051937866409184234,-0.3342768497731311,1.1389753375747278,1.8796371374407894,1.2441727044790705,,0.21228485316838608,0.4586109985024903,0.5413890014975096,0.5413890014975096,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,5.0,Full Sample,2018-01-02,2026-04-02,3.839367516591775,0.21071200644671473,-0.45450810920564777,0.2808685970779786,0.8242661605996755,0.7815835768817998,0.08002877645402859,0.17432777458651197,1.1464720773134107,1.0649650717350454,1.2675436627911207,-0.16171913867550713,0.21153055543754018,0.3950418773495771,0.6049581226504229,0.6049581226504229,0.7005785920925748,1.0,0.9995178399228544,0.12126494023904381,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,5.0,2018-2021,2018-01-02,2021-12-31,2.0976540949731453,0.3271698504496243,-0.45450810920564777,0.3343842720692534,1.0153282581714285,0.9671760273322203,0.08133493186547214,0.3062403728615548,1.3385469611523229,1.396823120985335,1.4794569640345903,,,0.43513858815928874,0.5648614118407113,0.5648614118407113,0.6726190476190477,1.0,0.9990079365079365,0.2503427004797807,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,5.0,2022,2022-01-03,2022-12-30,-0.16171913867550713,-0.16345823682104632,-0.1737937110584341,0.08559668795965707,-2.024700008472035,0.05079312320547602,-0.15583779754785024,0.540075213882325,0.0,0.26086011580787605,0.5123799085670094,-0.16171913867550713,,0.027606346529602182,0.9723936534703979,0.9723936534703979,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,5.0,2023+,2023-01-03,2026-04-02,0.8636576407727858,0.21153055543754018,-0.2025249507591308,0.24483744440765667,0.9092150924856395,1.0229893359151343,-0.0525637854000517,-0.33882909960401536,1.138204916640748,1.8825977808310639,1.2441727044790705,,0.21153055543754018,0.4586109985024903,0.5413890014975096,0.5413890014975096,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,10.0,Full Sample,2018-01-02,2026-04-02,3.8139111848682363,0.20993792044797277,-0.45524836442119154,0.28088851746999693,0.8219469389953893,0.7816100042539338,0.07938863145084761,0.17137613691248435,1.1455628134842468,1.0663733310630665,1.2675436627911207,-0.1619334673898125,0.21077660227187023,0.3950418773495771,0.6049581226504229,0.6049581226504229,0.7005785920925748,1.0,0.9995178399228544,0.12126494023904381,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,10.0,2018-2021,2018-01-02,2021-12-31,2.0883787707859076,0.326173881892994,-0.45524836442119154,0.3344157511711012,1.0130237092144398,0.9672213743074883,0.08058411124033049,0.30308094231637006,1.3373883566103788,1.3984013657675955,1.4794569640345903,,,0.43513858815928874,0.5648614118407113,0.5648614118407113,0.6726190476190477,1.0,0.9990079365079365,0.2503427004797807,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,10.0,2022,2022-01-03,2022-12-30,-0.1619334673898125,-0.16367463858884113,-0.17400495258836723,0.08562353911154182,-2.0270340890019507,0.050809110211342344,-0.15608651673044613,0.53926705526596,0.0,0.2612058374935872,0.5123799085670094,-0.1619334673898125,,0.027606346529602182,0.9723936534703979,0.9723936534703979,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::cash,hybrid_tqqq::baseline::cash,10.0,2023+,2023-01-03,2026-04-02,0.8598975273851384,0.21077660227187023,-0.20252495075913102,0.24484052755751926,0.9066548275630197,1.0229962715795857,-0.05318970439091907,-0.3433793061228412,1.1374345969166109,1.8855576608173077,1.2441727044790705,,0.21077660227187023,0.4586109985024903,0.5413890014975096,0.5413890014975096,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,0.0,Full Sample,2018-01-02,2026-04-02,4.241857375167687,0.2224984855800809,-0.45376705207629975,0.2807942874087562,0.8590039300658477,0.781596579424186,0.08971917265921374,0.2192539155808939,1.16345579215013,1.0477232216577588,1.2726291901704272,-0.16094738216471038,0.24023593720715142,0.3949161441874282,0.5550838558125718,0.05000000000000001,0.7005785920925748,1.0,0.9995178399228544,0.12126494023904381,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,0.0,2018-2021,2018-01-02,2021-12-31,2.106955215411264,0.3281663464987201,-0.45376705207629975,0.33435325784946307,1.0176318261630373,0.9671306803569517,0.08208575249061398,0.30939982794833476,1.3397056840548802,1.3952440858081852,1.491974099058579,,,0.43513858815928874,0.5148614118407112,0.05,0.6726190476190477,1.0,0.9990079365079365,0.2503427004797807,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,0.0,2022,2022-01-03,2022-12-30,-0.16094738216471038,-0.1626790102486333,-0.17358244552229807,0.08557730557405246,-2.014389863653123,0.050816791279172525,-0.1549080992063953,0.5430143425236644,0.0,0.2594420572699212,0.5123799085670094,-0.16094738216471038,,0.027606346529602182,0.9223936534703978,0.05,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,0.0,2023+,2023-01-03,2026-04-02,1.0107635785633415,0.24023593720715142,-0.20112252780688977,0.24467607597197666,1.0057330741001365,1.022933930501584,-0.029079959524582137,-0.16771078831477496,1.1805460886195902,1.8103215960378125,1.2416875639444467,,0.24023593720715142,0.4582910346027396,0.4917089653972604,0.05,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,5.0,Full Sample,2018-01-02,2026-04-02,4.214181319239915,0.22171395075999367,-0.4545081092056482,0.2808137586799805,0.8566739277959543,0.7816226207451886,0.08907655469450891,0.21628567770977922,1.1625390572355072,1.0491329812927834,1.2726291901704272,-0.16116187773077484,0.23946589243573047,0.3949161441874282,0.5550838558125718,0.05000000000000001,0.7005785920925748,1.0,0.9995178399228544,0.12126494023904381,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,5.0,2018-2021,2018-01-02,2021-12-31,2.0975766536207603,0.32716154418967824,-0.4545081092056482,0.3343842974844114,1.0153094899314863,0.9671751189531278,0.08132892434527544,0.3062136580334422,1.338531805135497,1.396823120985335,1.491974099058579,,,0.43513858815928874,0.5148614118407112,0.05,0.6726190476190477,1.0,0.9990079365079365,0.2503427004797807,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,5.0,2022,2022-01-03,2022-12-30,-0.16116187773077484,-0.1628955828283224,-0.1737937110584341,0.08560375751115214,-2.016737111657951,0.05083277828503884,-0.1551568183889911,0.5422063198484174,0.0,0.25978781824461555,0.5123799085670094,-0.16116187773077484,,0.027606346529602182,0.9223936534703978,0.05,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,5.0,2023+,2023-01-03,2026-04-02,1.0067159730239879,0.23946589243573047,-0.20112252780688988,0.24467863338368523,1.0031771543877657,1.0229411896779845,-0.02970471903762832,-0.17226666681804959,1.1797772928446626,1.8132867657374736,1.2416875639444467,,0.23946589243573047,0.4582910346027396,0.4917089653972604,0.05,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,10.0,Full Sample,2018-01-02,2026-04-02,4.18664602907651,0.22092976644297413,-0.45524836442119165,0.2808336565514852,0.854342950831114,0.781648662066191,0.0884339367298041,0.21331739870042288,1.1616224237119077,1.050542247080839,1.2726291901704272,-0.16137634892360664,0.23869619859198132,0.3949161441874282,0.5550838558125718,0.05000000000000001,0.7005785920925748,1.0,0.9995178399228544,0.12126494023904381,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,10.0,2018-2021,2018-01-02,2021-12-31,2.0882243518473724,0.32615728168433455,-0.45524836442119165,0.33441580235382784,1.012986175553569,0.9672195575493036,0.08057209619993705,0.3030275266564096,1.3373580445767275,1.3984013657675955,1.491974099058579,,,0.43513858815928874,0.5148614118407112,0.05,0.6726190476190477,1.0,0.9990079365079365,0.2503427004797807,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,10.0,2022,2022-01-03,2022-12-30,-0.16137634892360664,-0.16311213014691228,-0.17400495258836723,0.08563061430806945,-2.019073363307719,0.050848765290905165,-0.15540553757158682,0.541398115364083,0.0,0.2601335399303267,0.5123799085670094,-0.16137634892360664,,0.027606346529602182,0.9223936534703978,0.05,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::boxx,hybrid_tqqq::baseline::boxx,10.0,2023+,2023-01-03,2026-04-02,1.0026758480766245,0.23869619859198132,-0.2011225278068901,0.2446816039313546,1.0006195985918858,1.0229484488543856,-0.030329478550674725,-0.17682142174032556,1.179008597752854,1.8162511705668523,1.2416875639444467,,0.23869619859198132,0.4582910346027396,0.4917089653972604,0.05,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,0.0,Full Sample,2018-01-02,2026-04-02,6.907422027341647,0.28499119166630504,-0.49936236681404933,0.3678950554312059,0.8689298370264749,1.4396504972040411,0.04065081900660212,0.7503313539410685,1.6610821726722276,1.6624487664412229,1.2426022970909696,-0.38759675024378726,0.38729586479461364,0.37865038128958867,0.5713496187104112,0.05000000000000001,0.7005785920925748,1.0,0.9995178399228544,0.12126494023904381,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.464272397917343,0.45432122157706445,-0.49936236681404933,0.40202588724026034,1.1350423455048604,1.5372281964044072,0.045973638523835264,0.9706875632880185,1.7696678893424065,1.8524864036173287,1.5125481696890588,,,0.4035184186292945,0.5464815813707055,0.05,0.6726190476190477,1.0,0.9990079365079365,0.2503427004797807,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,0.0,2022,2022-01-03,2022-12-30,-0.38759675024378726,-0.39112196096291707,-0.4128291204224348,0.32019040916797764,-1.3755285605876963,0.9831471883741523,-0.10228681842913712,-1.7499558819794436,0.9513806613291464,1.114955299098979,0.5058864265927978,-0.38759675024378726,,0.027191235059760958,0.922808764940239,0.05,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,0.0,2023+,2023-01-03,2026-04-02,1.892322694703374,0.38729586479461364,-0.3207185964476318,0.33487391604018313,1.1489982845243807,1.6248578448435134,-0.052300612894272056,0.7551289368219459,1.6700410733768911,2.282176643182094,1.1420129445246108,,0.38729586479461364,0.45613414087886867,0.4938658591211313,0.05,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,5.0,Full Sample,2018-01-02,2026-04-02,6.866658743644977,0.28418608136700807,-0.4998271329927888,0.36790777803872116,0.8672077131631083,1.4396760140182447,0.04002334578439986,0.7465345443735502,1.660155283970928,1.66382270960427,1.2426022970909696,-0.3877521735635173,0.38650337762547693,0.37865038128958867,0.5713496187104112,0.05000000000000001,0.7005785920925748,1.0,0.9995178399228544,0.12126494023904381,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,5.0,2018-2021,2018-01-02,2021-12-31,3.450629392918989,0.4532073048901082,-0.4998271329927888,0.4020468228740817,1.1331047561778422,1.537269908564457,0.045207265211485895,0.9666658495790624,1.768415894586087,1.854083401244525,1.5125481696890588,,,0.4035184186292945,0.5464815813707055,0.05,0.6726190476190477,1.0,0.9990079365079365,0.2503427004797807,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,5.0,2022,2022-01-03,2022-12-30,-0.3877521735635173,-0.391278308620282,-0.4129781399571767,0.32020011279207283,-1.376270747721173,0.98316391667131,-0.10253206090450605,-1.7537093272100104,0.9513806613291464,1.1152887490382266,0.5058864265927978,-0.3877521735635173,,0.027191235059760958,0.922808764940239,0.05,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,5.0,2023+,2023-01-03,2026-04-02,1.886965719996566,0.38650337762547693,-0.32111994889021644,0.33487679909094875,1.1472778769085188,1.6248674415935573,-0.052876006297183864,0.7513742177806451,1.6693526250057296,2.284970702999876,1.1420129445246108,,0.38650337762547693,0.45613414087886867,0.4938658591211313,0.05,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,10.0,Full Sample,2018-01-02,2026-04-02,6.826098134090159,0.2833813270948111,-0.5002915637675596,0.3679208007071896,0.8654850025467822,1.439701530832448,0.039395872562197724,0.7427356975321601,1.6592284882201187,1.6651961914033226,1.2426022970909696,-0.3879075798399928,0.38571121042538903,0.37865038128958867,0.5713496187104112,0.05000000000000001,0.7005785920925748,1.0,0.9995178399228544,0.12126494023904381,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,10.0,2018-2021,2018-01-02,2021-12-31,3.437025391496995,0.4520940210009128,-0.5002915637675596,0.4020681115000436,1.1311663755326633,1.5373116207245068,0.0444408918991366,0.9626418141225459,1.767164030236279,1.855679647560636,1.5125481696890588,,,0.4035184186292945,0.5464815813707055,0.05,0.6726190476190477,1.0,0.9990079365079365,0.2503427004797807,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,10.0,2022,2022-01-03,2022-12-30,-0.3879075798399928,-0.39143463866584616,-0.41312714315088295,0.3202099246490529,-1.3770124244335797,0.9831806449684679,-0.10277730337987485,-1.7574396693318393,0.9513806613291464,1.1156221624123535,0.5058864265927978,-0.3879075798399928,,0.027191235059760958,0.922808764940239,0.05,0.06772908366533864,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::baseline::qqq,hybrid_tqqq::baseline::qqq,10.0,2023+,2023-01-03,2026-04-02,1.8816177716037692,0.38571121042538903,-0.3215211273268529,0.3348799637301372,1.1455565356575936,1.6248770383436009,-0.05345139970009555,0.7476166879820508,1.6686642390498228,2.2877640706588114,1.1420129445246108,,0.38571121042538903,0.45613414087886867,0.4938658591211313,0.05,0.9300613496932515,1.0,1.0,0.0,hybrid_growth_tqqq_attack_only,baseline,Current MA200 + ATR baseline with no extra daily gate.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,0.0,Full Sample,2018-01-02,2026-04-02,1.8073838810973761,0.1333480226121797,-0.2765599620014316,0.1888026285099233,0.7596123429041913,0.35290286547310484,0.07501935228149982,-0.22009837193950924,0.6166411688347504,0.47227263123843005,5.176508312781137,-0.05964217504646363,0.08062538814114761,0.25601239083998373,0.7439876091600163,0.7439876091600163,0.4406943105110897,0.4932497589199614,0.5009643201542913,10.913844621513944,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,0.0,2018-2021,2018-01-02,2021-12-31,1.3214242951120774,0.23470718550110425,-0.2547670762318698,0.2145328664920947,1.0901892193264193,0.4080099427095002,0.12496855192498828,-0.13847461921784382,0.7840629670066329,0.5739446197195901,5.150885075680381,,,0.28345430971884544,0.7165456902811546,0.7165456902811546,0.4444444444444444,0.5376984126984127,0.5436507936507936,10.764736120630568,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,0.0,2022,2022-01-03,2022-12-30,-0.05964217504646363,-0.06032271894667307,-0.07484558030494382,0.059210282257384936,-1.0121124313570056,0.019251316865413114,-0.053306153256523485,0.8871356593999218,0.0,0.09620546347870493,0.6129732348210187,-0.05964217504646363,,0.006878625757211588,0.9931213742427885,0.9931213742427885,0.01195219123505976,0.099601593625498,0.099601593625498,7.0824099722991685,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,0.0,2023+,2023-01-03,2026-04-02,0.2860389849152396,0.08062538814114761,-0.1786317334425569,0.18057989913636752,0.5213998528000926,0.5181382708006776,-0.04521957102555341,-0.9901296584631669,0.5246987060727895,0.9486043901230152,6.628876265745759,,0.08062538814114761,0.29879904213554603,0.701200957864454,0.701200957864454,0.5680981595092025,0.5595092024539877,0.5717791411042945,12.329113924050633,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,5.0,Full Sample,2018-01-02,2026-04-02,1.7479981745508688,0.13041341384525706,-0.27959546707629224,0.18883072222128613,0.7457655273898286,0.35296681448102674,0.07241359423544669,-0.23141703144287268,0.6125006285718045,0.4774139118305062,5.176508312781137,-0.059927039903365786,0.0770466653371169,0.25601239083998373,0.7439876091600163,0.7439876091600163,0.4406943105110897,0.4932497589199614,0.5009643201542913,10.913844621513944,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,5.0,2018-2021,2018-01-02,2021-12-31,1.2976015203318014,0.2315228846982127,-0.2561654255234641,0.214571101193542,1.0780086414483427,0.40813525734147243,0.12236318388964912,-0.14924688268750802,0.7805390005590258,0.5810266120419212,5.150885075680381,,,0.28345430971884544,0.7165456902811546,0.7165456902811546,0.4444444444444444,0.5376984126984127,0.5436507936507936,10.764736120630568,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,5.0,2022,2022-01-03,2022-12-30,-0.059927039903365786,-0.06061072837620851,-0.075125839557736,0.05921003919979746,-1.0172529994105115,0.019278387102859625,-0.05360096993715588,0.8862099177913995,0.0,0.09666496307887404,0.6129732348210187,-0.059927039903365786,,0.006878625757211588,0.9931213742427885,0.9931213742427885,0.01195219123505976,0.099601593625498,0.099601593625498,7.0824099722991685,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,5.0,2023+,2023-01-03,2026-04-02,0.27227258469962345,0.0770466653371169,-0.1808857779539409,0.1806007726102079,0.5029292690336357,0.5181613368940301,-0.04855069384172067,-1.0088668032058021,0.5187998756772115,0.9584912682038239,6.628876265745759,,0.0770466653371169,0.29879904213554603,0.701200957864454,0.701200957864454,0.5680981595092025,0.5595092024539877,0.5717791411042945,12.329113924050633,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,10.0,Full Sample,2018-01-02,2026-04-02,1.6898523368036016,0.12748557315207187,-0.28261910147694436,0.18886255989176132,0.731908322008595,0.3530307634889485,0.06980783618939361,-0.24273169926052116,0.6083613826767035,0.4825532502532686,5.176508312781137,-0.060211899724235685,0.07347886972408446,0.25601239083998373,0.7439876091600163,0.7439876091600163,0.4406943105110897,0.4932497589199614,0.5009643201542913,10.913844621513944,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,10.0,2018-2021,2018-01-02,2021-12-31,1.2740159542577985,0.2283458139154848,-0.2575615606828622,0.21461290234760053,1.0658146916633042,0.4082605719734447,0.11975781585430995,-0.16001671337359993,0.7770159885986794,0.5881051227855553,5.150885075680381,,,0.28345430971884544,0.7165456902811546,0.7165456902811546,0.4444444444444444,0.5376984126984127,0.5436507936507936,10.764736120630568,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,10.0,2022,2022-01-03,2022-12-30,-0.060211899724235685,-0.06089873168668691,-0.07540609385591701,0.059211255192526666,-1.0223684164222875,0.019305457340306142,-0.053895786617788224,0.8852833799559121,0.0,0.09712445455570064,0.6129732348210187,-0.060211899724235685,,0.006878625757211588,0.9931213742427885,0.9931213742427885,0.01195219123505976,0.099601593625498,0.099601593625498,7.0824099722991685,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::cash,hybrid_tqqq::ma20_ma60_stack::cash,10.0,2023+,2023-01-03,2026-04-02,0.2586500300111614,0.07347886972408446,-0.18313419772673079,0.1806261712701619,0.48445081722008987,0.5181844029873822,-0.051881816657887866,-1.027573577902087,0.5129030901038734,0.9683755382037103,6.628876265745759,,0.07347886972408446,0.29879904213554603,0.701200957864454,0.701200957864454,0.5680981595092025,0.5595092024539877,0.5717791411042945,12.329113924050633,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,0.0,Full Sample,2018-01-02,2026-04-02,2.076634735665105,0.1460049660076459,-0.2681861454873419,0.18823615573690528,0.8204789208418735,0.3519943386198602,0.0862224282808672,-0.17212083905880973,0.63311685688944,0.4474378816611097,5.153386747604797,-0.05901705676678337,0.11133682709620851,0.25500223447973747,0.6949977655202624,0.05000000000000001,0.4406943105110897,0.4932497589199614,0.5009643201542913,10.913844621513944,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,0.0,2018-2021,2018-01-02,2021-12-31,1.3214242951120774,0.23470718550110425,-0.2547670762318698,0.2145328664920947,1.0901892193264193,0.4080099427095002,0.12496855192498828,-0.13847461921784382,0.7840629670066329,0.5739446197195901,5.16340221070437,,,0.28345430971884544,0.6665456902811544,0.05,0.4444444444444444,0.5376984126984127,0.5436507936507936,10.764736120630568,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,0.0,2022,2022-01-03,2022-12-30,-0.05901705676678337,-0.059690696497432194,-0.07484558030494382,0.059215431555765696,-1.0007547190475414,0.01929097194497592,-0.05262517409766427,0.8892529210583484,0.0,0.09513316591544439,0.6129732348210187,-0.05901705676678337,,0.006878625757211588,0.9431213742427884,0.05,0.01195219123505976,0.099601593625498,0.099601593625498,7.0824099722991685,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,0.0,2023+,2023-01-03,2026-04-02,0.40844425433432097,0.11133682709620851,-0.17285787000967734,0.17909428256446172,0.6812620193865881,0.5145587319509487,-0.016400911855493073,-0.8357646049211663,0.5673073808516447,0.8388192190934103,6.554695122867162,,0.11133682709620851,0.2962284111034591,0.6537715888965411,0.05,0.5680981595092025,0.5595092024539877,0.5717791411042945,12.329113924050633,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,5.0,Full Sample,2018-01-02,2026-04-02,2.011843334820279,0.1430509256024899,-0.2712502838308606,0.18826432853714797,0.8066425480811741,0.3520586578390504,0.08362818208844189,-0.18340233053556268,0.6289998253892576,0.45257849951203427,5.153386747604797,-0.05930211099226901,0.10769779368541399,0.25500223447973747,0.6949977655202624,0.05000000000000001,0.4406943105110897,0.4932497589199614,0.5009643201542913,10.913844621513944,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,5.0,2018-2021,2018-01-02,2021-12-31,1.297544080293791,0.2315151770568693,-0.25616542552346433,0.21457112829360298,1.0779793774268978,0.4081343489623801,0.12235717636945237,-0.14927290770015053,0.7805238445422001,0.5810266120419212,5.16340221070437,,,0.28345430971884544,0.6665456902811544,0.05,0.4444444444444444,0.5376984126984127,0.5436507936507936,10.764736120630568,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,5.0,2022,2022-01-03,2022-12-30,-0.05930211099226901,-0.05997889964073366,-0.075125839557736,0.05921520212025264,-1.005894562062952,0.019318042182422446,-0.05291999077829664,0.8883271971130217,0.0,0.09559266551561352,0.6129732348210187,-0.05930211099226901,,0.006878625757211588,0.9431213742427884,0.05,0.01195219123505976,0.099601593625498,0.099601593625498,7.0824099722991685,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,5.0,2023+,2023-01-03,2026-04-02,0.39353652380970083,0.10769779368541399,-0.17512752621565175,0.17911575505200636,0.6628251219103798,0.5145846360055957,-0.019695590203714277,-0.8543813371569995,0.5614900315493888,0.8487031176224767,6.554695122867162,,0.10769779368541399,0.2962284111034591,0.6537715888965411,0.05,0.5680981595092025,0.5595092024539877,0.5717791411042945,12.329113924050633,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,10.0,Full Sample,2018-01-02,2026-04-02,1.9483985760648772,0.14010366457535528,-0.2743024645348432,0.1882962364561972,0.7927945892868681,0.3521229770582405,0.08103393589601664,-0.19468049788857916,0.6248840775084511,0.45771717429672726,5.153386747604797,-0.05958716017837462,0.10406973701734756,0.25500223447973747,0.6949977655202624,0.05000000000000001,0.4406943105110897,0.4932497589199614,0.5009643201542913,10.913844621513944,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,10.0,2018-2021,2018-01-02,2021-12-31,1.2739022534600837,0.22833043825691068,-0.25756156068286196,0.21461295667005137,1.0657561774996624,0.4082587552152599,0.11974580081391656,-0.16006873924851067,0.7769856765650278,0.5881051227855553,5.16340221070437,,,0.28345430971884544,0.6665456902811544,0.05,0.4444444444444444,0.5376984126984127,0.5436507936507936,10.764736120630568,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,10.0,2022,2022-01-03,2022-12-30,-0.05958716017837462,-0.06026709666086261,-0.07540609385591701,0.05921643160761862,-1.011009535921947,0.01934511241986896,-0.05321480745892902,0.887400675113835,0.0,0.0960521569924401,0.6129732348210187,-0.05958716017837462,,0.006878625757211588,0.9431213742427884,0.05,0.01195219123505976,0.099601593625498,0.099601593625498,7.0824099722991685,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::boxx,hybrid_tqqq::ma20_ma60_stack::boxx,10.0,2023+,2023-01-03,2026-04-02,0.3787827796636074,0.10406973701734756,-0.17739151930785146,0.17914173737092698,0.6443764219912511,0.5146105400602425,-0.02299026855193541,-0.8729718680308985,0.555674699272171,0.8585844040382571,6.554695122867162,,0.10406973701734756,0.2962284111034591,0.6537715888965411,0.05,0.5680981595092025,0.5595092024539877,0.5717791411042945,12.329113924050633,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,0.0,Full Sample,2018-01-02,2026-04-02,5.22947815322271,0.2483579574080148,-0.40389315584519836,0.2958021419530792,0.9004573912980806,1.1625151199468857,0.04104572143037305,0.6647535701560076,1.3100182885983078,1.2388323309475742,4.851935241626965,-0.335560258555221,0.3001161165860129,0.23714578872049197,0.712854211279508,0.05000000000000001,0.4406943105110897,0.4932497589199614,0.5009643201542913,10.913844621513944,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.001268927319005,0.41499794401540546,-0.35788758416784305,0.31139791590905125,1.2710828966450227,1.1894237663973766,0.0783115972112132,1.057924178119953,1.4182931488995623,1.2751582042996341,4.795600047615879,,,0.2575855118467924,0.6924144881532074,0.05,0.4444444444444444,0.5376984126984127,0.5436507936507936,10.764736120630568,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,0.0,2022,2022-01-03,2022-12-30,-0.335560258555221,-0.3387504394639116,-0.3629366474365886,0.3103473981053887,-1.1660014515398465,0.9612587693991195,-0.03124959842793672,-0.4895264042355263,0.9513806613291448,1.0033146198092633,0.5058864265927978,-0.335560258555221,,0.00597609561752988,0.9440239043824701,0.05,0.01195219123505976,0.099601593625498,0.099601593625498,7.0824099722991685,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,0.0,2023+,2023-01-03,2026-04-02,1.3431404696081466,0.3001161165860129,-0.28371467794561944,0.26926256243005,1.1131245845697137,1.274121930687394,-0.043003010658312746,0.28651058581904426,1.2416656547320954,1.5851313236726596,6.273943863551772,,0.3001161165860129,0.2830603311223724,0.6669396688776276,0.05,0.5680981595092025,0.5595092024539877,0.5717791411042945,12.329113924050633,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,5.0,Full Sample,2018-01-02,2026-04-02,5.10587641924971,0.24532780669005327,-0.4046350946481583,0.29582232597310876,0.8921790040358014,1.1625734108258756,0.03860366692685953,0.6423365922685136,1.3060044671427706,1.2435988290352697,4.851935241626965,-0.3357280957291864,0.2960445919053407,0.23714578872049197,0.712854211279508,0.05000000000000001,0.4406943105110897,0.4932497589199614,0.5009643201542913,10.913844621513944,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,5.0,2018-2021,2018-01-02,2021-12-31,2.9629925105655452,0.41159709441655257,-0.3581154934703219,0.31143275328539155,1.2632519964523834,1.1895348941461061,0.07588741551169753,1.0379720938518784,1.4148723677521398,1.281598669600427,4.795600047615879,,,0.2575855118467924,0.6924144881532074,0.05,0.4444444444444444,0.5376984126984127,0.5436507936507936,10.764736120630568,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,5.0,2022,2022-01-03,2022-12-30,-0.3357280957291864,-0.3389194369837303,-0.36309756934727844,0.3103546604139453,-1.1667829063866795,0.9612818522549766,-0.03149265531257153,-0.49642643983077017,0.9513806613291448,1.0036747028107031,0.5058864265927978,-0.3357280957291864,,0.00597609561752988,0.9440239043824701,0.05,0.01195219123505976,0.099601593625498,0.099601593625498,7.0824099722991685,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,5.0,2023+,2023-01-03,2026-04-02,1.3194172051653328,0.2960445919053407,-0.28460759490502985,0.2692730477631859,1.1013946233359955,1.2741518064569655,-0.04615793786470611,0.2571366708548339,1.2359537191528551,1.5946320759495265,6.273943863551772,,0.2960445919053407,0.2830603311223724,0.6669396688776276,0.05,0.5680981595092025,0.5595092024539877,0.5717791411042945,12.329113924050633,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,10.0,Full Sample,2018-01-02,2026-04-02,4.9846957602763435,0.2423042216929132,-0.4053762945949051,0.29584457050258756,0.8838955901363869,1.1626317017048653,0.036161612423346076,0.6198978751843697,1.301991776579644,1.2483636354049192,4.851935241626965,-0.33589593290315234,0.2919848213110441,0.23714578872049197,0.712854211279508,0.05000000000000001,0.4406943105110897,0.4932497589199614,0.5009643201542913,10.913844621513944,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,10.0,2018-2021,2018-01-02,2021-12-31,2.9250717543862006,0.4082034759721809,-0.35834339062924225,0.31146963971432845,1.255414589019344,1.1896460218948361,0.07346323381218177,1.0179876453122467,1.4114524098590255,1.2880361518708472,4.795600047615879,,,0.2575855118467924,0.6924144881532074,0.05,0.4444444444444444,0.5376984126984127,0.5436507936507936,10.764736120630568,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,10.0,2022,2022-01-03,2022-12-30,-0.33589593290315234,-0.33908843400085564,-0.3632584912579683,0.3103621239271021,-1.1675635677421874,0.9613049351108339,-0.031735712197206306,-0.503304272524172,0.9513806613291448,1.004034785812144,0.5058864265927978,-0.33589593290315234,,0.00597609561752988,0.9440239043824701,0.05,0.01195219123505976,0.099601593625498,0.099601593625498,7.0824099722991685,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma20_ma60_stack::qqq,hybrid_tqqq::ma20_ma60_stack::qqq,10.0,2023+,2023-01-03,2026-04-02,1.2959283827852426,0.2919848213110441,-0.2854996211968803,0.2692862597609363,1.0896545421467478,1.274181682226537,-0.04931286507109952,0.2277566360097073,1.2302435847200637,1.6041304571420898,6.273943863551772,,0.2919848213110441,0.2830603311223724,0.6669396688776276,0.05,0.5680981595092025,0.5595092024539877,0.5717791411042945,12.329113924050633,hybrid_growth_tqqq_attack_only,ma20_ma60_stack,Require close > MA20 and MA20 > MA60 before allowing the existing TQQQ signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,0.0,Full Sample,2018-01-02,2026-04-02,0.12480828581330483,0.014364477595090852,-0.33424666552286675,0.17837419013058908,0.17053653846041525,0.26024178871382986,-0.02001913992611966,-0.6717024090711486,0.26453221801528953,0.3733424808938961,9.040293170053603,-0.07307149753308351,-0.01818151953487812,0.1879360535115721,0.8120639464884281,0.8120639464884281,0.25940212150433944,0.29893924783027964,0.30327868852459017,14.30926294820717,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,0.0,2018-2021,2018-01-02,2021-12-31,0.2879110340607576,0.06539124585427136,-0.33424666552286675,0.18865899062293343,0.4314441207006368,0.2763522411696632,0.0076272308533664734,-0.7437447199878966,0.37655008529270606,0.49069160474056184,9.165388152347257,,,0.20517628002922314,0.7948237199707769,0.7948237199707769,0.2777777777777778,0.3472222222222222,0.3482142857142857,15.27090472926662,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,0.0,2022,2022-01-03,2022-12-30,-0.07307149753308351,-0.07389916275486341,-0.09183231639233824,0.07441173615299448,-0.9850187795574247,0.024213323546445686,-0.06496901249299422,0.8412421341674897,0.0,0.11786755398804265,0.7242601252313328,-0.07307149753308351,,0.005703846466749264,0.9942961535332508,0.9942961535332508,0.00796812749003984,0.07569721115537849,0.0796812749003984,5.058864265927978,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,0.0,2023+,2023-01-03,2026-04-02,-0.05779282687579035,-0.01818151953487812,-0.29309247103923486,0.18764992578737677,-0.0036602497282840008,0.4207687145431775,-0.11386933310397475,-1.3245016326340562,0.17023372926148292,0.6122100905946654,11.47308338288464,,-0.01818151953487812,0.2227362199391283,0.7772637800608716,0.7772637800608716,0.3141104294478528,0.3079754601226994,0.3165644171779141,16.027848101265825,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,5.0,Full Sample,2018-01-02,2026-04-02,0.08363595316300954,0.009787834311336452,-0.33523550538128966,0.17838314816470127,0.14513841144566922,0.26028184093064244,-0.024555972781764628,-0.6903290867614637,0.255499644287955,0.3790518096261815,9.040293170053603,-0.07340326041403222,-0.023811491066090595,0.1879360535115721,0.8120639464884281,0.8120639464884281,0.25940212150433944,0.29893924783027964,0.30327868852459017,14.30926294820717,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,5.0,2018-2021,2018-01-02,2021-12-31,0.2645879539950584,0.060528143841799276,-0.33523550538128966,0.18862089712048374,0.4072687214642507,0.2762435689285765,0.0030798187631941067,-0.7620981256077705,0.36742825111949434,0.4964199839534901,9.165388152347257,,,0.20517628002922314,0.7948237199707769,0.7948237199707769,0.2777777777777778,0.3472222222222222,0.3482142857142857,15.27090472926662,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,5.0,2022,2022-01-03,2022-12-30,-0.07340326041403222,-0.07423453100238853,-0.09215736446918166,0.07441119231740803,-0.9898551221083646,0.02421101310667985,-0.06532914947443953,0.8401235875086756,0.0,0.11840270217306167,0.7242601252313328,-0.07340326041403222,,0.005703846466749264,0.9942961535332508,0.9942961535332508,0.00796812749003984,0.07569721115537849,0.0796812749003984,5.058864265927978,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,5.0,2023+,2023-01-03,2026-04-02,-0.07520899386731494,-0.023811491066090595,-0.3045487120799527,0.18772101266694488,-0.03431435798222071,0.4212006376057355,-0.11974019643676455,-1.3528853441577413,0.15932289664616395,0.626894377412034,11.47308338288464,,-0.023811491066090595,0.2227362199391283,0.7772637800608716,0.7772637800608716,0.3141104294478528,0.3079754601226994,0.3165644171779141,16.027848101265825,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,10.0,Full Sample,2018-01-02,2026-04-02,0.043956679293974954,0.005230204446396547,-0.34201229314102777,0.1784007753003804,0.11973701647365086,0.2603218931474551,-0.029092805637409607,-0.7089376666758255,0.24647102993628278,0.384758384493884,9.040293170053603,-0.07373502329498105,-0.029411155501021358,0.1879360535115721,0.8120639464884281,0.8120639464884281,0.25940212150433944,0.29893924783027964,0.30327868852459017,14.30926294820717,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,10.0,2018-2021,2018-01-02,2021-12-31,0.2416789387003837,0.05568547378841493,-0.3362232364829161,0.1885912392942069,0.3830664201167732,0.27613489668748975,-0.0014675933269782566,-0.7804319834401546,0.3583110205621777,0.50214610436523,9.165388152347257,,,0.20517628002922314,0.7948237199707769,0.7948237199707769,0.2777777777777778,0.3472222222222222,0.3482142857142857,15.27090472926662,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,10.0,2022,2022-01-03,2022-12-30,-0.07373502329498105,-0.07456989783627055,-0.09248241254602518,0.07441237001384088,-0.9946685231395676,0.02420870266691401,-0.06568928645588487,0.8390040067232701,0.0,0.11893785035808087,0.7242601252313328,-0.07373502329498105,,0.005703846466749264,0.9942961535332508,0.9942961535332508,0.00796812749003984,0.07569721115537849,0.0796812749003984,5.058864265927978,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::cash,hybrid_tqqq::ma_stack_rsi_macd::cash,10.0,2023+,2023-01-03,2026-04-02,-0.09230922962039345,-0.029411155501021358,-0.3158363999928636,0.18780218861122228,-0.06494176963107325,0.4216325606682935,-0.12561105976955433,-1.381210782577157,0.14841602091659636,0.6415702470885886,11.47308338288464,,-0.029411155501021358,0.2227362199391283,0.7772637800608716,0.7772637800608716,0.3141104294478528,0.3079754601226994,0.3165644171779141,16.027848101265825,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,0.0,Full Sample,2018-01-02,2026-04-02,0.2687282776891191,0.029283449369827075,-0.33424666552286675,0.17712699891487457,0.2530626187498137,0.2585927368060083,-0.0052946256047778,-0.6138101388415994,0.2874389815170255,0.34377637959211543,8.951527974716594,-0.07245530661567678,0.01873098181268018,0.18636558748759038,0.7636344125124095,0.05000000000000001,0.25940212150433944,0.29893924783027964,0.30327868852459017,14.30926294820717,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,0.0,2018-2021,2018-01-02,2021-12-31,0.2879110340607576,0.06539124585427136,-0.33424666552286675,0.18865899062293343,0.4314441207006368,0.2763522411696632,0.0076272308533664734,-0.7437447199878966,0.37655008529270606,0.49069160474056184,9.177905287371248,,,0.20517628002922314,0.7448237199707768,0.05,0.2777777777777778,0.3472222222222222,0.3482142857142857,15.27090472926662,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,0.0,2022,2022-01-03,2022-12-30,-0.07245530661567678,-0.07327627175685647,-0.09183231639233824,0.07441630934257697,-0.975990585999537,0.0242529786260085,-0.06428803333413499,0.8433469213318361,0.0,0.11679525642478213,0.7242601252313328,-0.07245530661567678,,0.005703846466749264,0.9442961535332508,0.05,0.00796812749003984,0.07569721115537849,0.0796812749003984,5.058864265927978,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,0.0,2023+,2023-01-03,2026-04-02,0.062057207413663384,0.01873098181268018,-0.25939431002226654,0.18463470323915476,0.19370692616005145,0.414395324811957,-0.07570308993161694,-1.1541380967187,0.22947415873804194,0.48115370795845824,11.232051088914108,,0.01873098181268018,0.21873972112472573,0.7312602788752742,0.05,0.3141104294478528,0.3079754601226994,0.3165644171779141,16.027848101265825,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,5.0,Full Sample,2018-01-02,2026-04-02,0.22274061917465104,0.02468550657734725,-0.33523550538128977,0.1771345734207042,0.22773432341568522,0.25863033613974,-0.009786512840722178,-0.632294497808956,0.2784706909081133,0.34941908094898727,8.951527974716594,-0.07278729004143925,0.013012767476063836,0.18636558748759038,0.7636344125124095,0.05000000000000001,0.25940212150433944,0.29893924783027964,0.30327868852459017,14.30926294820717,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,5.0,2018-2021,2018-01-02,2021-12-31,0.26455633929620803,0.060521506392614555,-0.33523550538128977,0.18862090763517395,0.4072355635159466,0.276242660549484,0.0030738112429974512,-0.7621224922610881,0.3674130951026685,0.4964199839534901,9.177905287371248,,,0.20517628002922314,0.7448237199707768,0.05,0.2777777777777778,0.3472222222222222,0.3482142857142857,15.27090472926662,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,5.0,2022,2022-01-03,2022-12-30,-0.07278729004143925,-0.07361186557146238,-0.09215736446918166,0.07441577832804308,-0.9808263963703556,0.024250668186242667,-0.06464817031558036,0.8422283224125969,0.0,0.11733040460980114,0.7242601252313328,-0.07278729004143925,,0.005703846466749264,0.9442961535332508,0.05,0.00796812749003984,0.07569721115537849,0.0796812749003984,5.058864265927978,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,5.0,2023+,2023-01-03,2026-04-02,0.04283783747610692,0.013012767476063836,-0.26512495949106163,0.1847043793846525,0.16313223163771032,0.41481904931315516,-0.08145085072021144,-1.1821282607584995,0.2187502559993561,0.49553845141406666,11.232051088914108,,0.013012767476063836,0.21873972112472573,0.7312602788752742,0.05,0.3141104294478528,0.3079754601226994,0.3165644171779141,16.027848101265825,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,10.0,Full Sample,2018-01-02,2026-04-02,0.17840438710848772,0.0201064772788897,-0.33622323648291597,0.17715070287622106,0.2023984194482099,0.25866793547347167,-0.014278400076666567,-0.650762620646529,0.26950629784434715,0.35505911665241874,8.951527974716594,-0.07311927346720193,0.007324683496427342,0.18636558748759038,0.7636344125124095,0.05000000000000001,0.25940212150433944,0.29893924783027964,0.30327868852459017,14.30926294820717,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,10.0,2018-2021,2018-01-02,2021-12-31,0.24161685475344874,0.055672259383137135,-0.33622323648291597,0.18859125995089535,0.38300009725066075,0.27613307992930486,-0.0014796083673716404,-0.7804806838769367,0.3582807085285261,0.50214610436523,9.177905287371248,,,0.20517628002922314,0.7448237199707768,0.05,0.2777777777777778,0.3472222222222222,0.3482142857142857,15.27090472926662,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,10.0,2022,2022-01-03,2022-12-30,-0.07311927346720193,-0.0739474579714745,-0.09248241254602518,0.07441696873932618,-0.9856394752509381,0.024248357746476833,-0.06500830729702566,0.8411086867077746,0.0,0.11786555279482033,0.7242601252313328,-0.07311927346720193,,0.005703846466749264,0.9442961535332508,0.05,0.00796812749003984,0.07569721115537849,0.0796812749003984,5.058864265927978,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::boxx,hybrid_tqqq::ma_stack_rsi_macd::boxx,10.0,2023+,2023-01-03,2026-04-02,0.023959783070373497,0.007324683496427342,-0.27081324235485016,0.18478388903135548,0.13257354039921992,0.4152427738143534,-0.08719861150880587,-1.210069675360051,0.20803015024315383,0.5099151743085257,11.232051088914108,,0.007324683496427342,0.21873972112472573,0.7312602788752742,0.05,0.3141104294478528,0.3079754601226994,0.3165644171779141,16.027848101265825,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,0.0,Full Sample,2018-01-02,2026-04-02,2.8580424104659854,0.17789277771370804,-0.37368345395931135,0.2747650042119271,0.7355630421703199,1.0879109534820846,-0.008745202304555662,0.0903896573491033,1.0944576801934285,1.1489607957520753,7.1463543675043635,-0.33488061218089127,0.24860807694178622,0.1489897648503267,0.8010102351496732,0.05000000000000001,0.25940212150433944,0.29893924783027964,0.30327868852459017,14.30926294820717,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,0.0,2018-2021,2018-01-02,2021-12-31,1.8224544117921977,0.29661536598292537,-0.3367820029255195,0.28828746955849893,1.0461304590301326,1.1070308165023524,0.006079045061699329,0.33347408675061385,1.1680837404252962,1.2273799870841013,7.941336277019075,,,0.1753480127237506,0.7746519872762493,0.05,0.2777777777777778,0.3472222222222222,0.3482142857142857,15.27090472926662,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,0.0,2022,2022-01-03,2022-12-30,-0.33488061218089127,-0.3380660892031879,-0.36228500399809405,0.31034824248648224,-1.1626948056475899,0.9612653612350704,-0.03022210403631617,-0.461671089535995,0.9513806613291448,1.001856485710582,0.5058864265927977,-0.33488061218089127,,0.00398406374501992,0.94601593625498,0.05,0.00796812749003984,0.07569721115537849,0.0796812749003984,5.058864265927978,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,0.0,2023+,2023-01-03,2026-04-02,1.055135466004038,0.24860807694178622,-0.281592140761897,0.24335338041984814,1.0373553347182223,1.1545075917497094,-0.05810682547597974,-0.18917840791001264,1.0256597464138908,1.2674654535340895,8.232729727217142,,0.24860807694178622,0.16104782266752998,0.78895217733247,0.05,0.3141104294478528,0.3079754601226994,0.3165644171779141,16.027848101265825,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,5.0,Full Sample,2018-01-02,2026-04-02,2.746060203229831,0.17369298292790636,-0.3741561951756691,0.27476740384837545,0.7225265745120185,1.0879252639536103,-0.012328207161738448,0.05136857381010303,1.0869654351287914,1.1533040081258297,7.1463543675043635,-0.3350470031365739,0.24346242656537576,0.1489897648503267,0.8010102351496732,0.05000000000000001,0.25940212150433944,0.29893924783027964,0.30327868852459017,14.30926294820717,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,5.0,2018-2021,2018-01-02,2021-12-31,1.778190431513094,0.291494557224947,-0.33701142600789546,0.2882528899562155,1.032499866062089,1.1069254917854456,0.0021419275139686264,0.2954129787224154,1.1598486336665907,1.2320937838471333,7.941336277019075,,,0.1753480127237506,0.7746519872762493,0.05,0.2777777777777778,0.3472222222222222,0.3482142857142857,15.27090472926662,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,5.0,2022,2022-01-03,2022-12-30,-0.3350470031365739,-0.33823363252522465,-0.362444539277896,0.31034772516774767,-1.1635055011331326,0.9612637474224688,-0.03047365510792749,-0.4685259220082369,0.9513806613291448,1.0022134659511246,0.5058864265927977,-0.3350470031365739,,0.00398406374501992,0.94601593625498,0.05,0.00796812749003984,0.07569721115537849,0.0796812749003984,5.058864265927978,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,5.0,2023+,2023-01-03,2026-04-02,1.0277844753910648,0.24346242656537576,-0.28249455140413327,0.24342173474077494,1.0201001442887676,1.1548217717801466,-0.06232071736406011,-0.2362605078900689,1.017522302295511,1.278098511588502,8.232729727217142,,0.24346242656537576,0.16104782266752998,0.78895217733247,0.05,0.3141104294478528,0.3079754601226994,0.3165644171779141,16.027848101265825,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,10.0,Full Sample,2018-01-02,2026-04-02,2.637297794456013,0.169506971089739,-0.3746286984581756,0.2747733374507123,0.7094812095265873,1.0879395744251361,-0.015911212018921227,0.012344610252502587,1.0794759947993002,1.1576456481483275,7.1463543675043635,-0.33521339409225426,0.2383366922569612,0.1489897648503267,0.8010102351496732,0.05000000000000001,0.25940212150433944,0.29893924783027964,0.30327868852459017,14.30926294820717,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,10.0,2018-2021,2018-01-02,2021-12-31,1.7346070711558945,0.28639237516942284,-0.3372408465265707,0.288222422076037,1.0188514674415818,1.1068201670685387,-0.0017951900337619987,0.2572975183116622,1.1516173298626746,1.236806041715782,7.941336277019075,,,0.1753480127237506,0.7746519872762493,0.05,0.2777777777777778,0.3472222222222222,0.3482142857142857,15.27090472926662,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,10.0,2022,2022-01-03,2022-12-30,-0.33521339409225426,-0.3384011753536913,-0.36260407455769694,0.31034740923223314,-1.1643154438011483,0.9612621336098672,-0.030725206179538788,-0.47535852625250197,0.9513806613291448,1.0025704461916662,0.5058864265927977,-0.33521339409225426,,0.00398406374501992,0.94601593625498,0.05,0.00796812749003984,0.07569721115537849,0.0796812749003984,5.058864265927978,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::ma_stack_rsi_macd::qqq,hybrid_tqqq::ma_stack_rsi_macd::qqq,10.0,2023+,2023-01-03,2026-04-02,1.000790727742368,0.2383366922569612,-0.28339605501823506,0.24349405015813932,1.0028383276936033,1.1551359518105835,-0.06653460925214044,-0.28325453781753834,1.0093869216666436,1.288727201076647,8.232729727217142,,0.2383366922569612,0.16104782266752998,0.78895217733247,0.05,0.3141104294478528,0.3079754601226994,0.3165644171779141,16.027848101265825,hybrid_growth_tqqq_attack_only,ma_stack_rsi_macd,MA20/MA60 stack plus RSI14 > 55 and MACD line above signal.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,0.0,Full Sample,2018-01-02,2026-04-02,0.07528071279749193,0.008840470433644443,-0.39435012789616475,0.17568834233521197,0.1392830188550786,0.24904399183529857,-0.02379776630321919,-0.6942443138914255,0.23751923453275536,0.3452037732318405,8.648149137024129,0.0,-0.011655562208603643,0.1764342268374713,0.8235657731625288,0.8235657731625288,0.23963355834136935,0.27434908389585344,0.27820636451301833,13.581673306772908,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,0.0,2018-2021,2018-01-02,2021-12-31,0.11696883568548833,0.02807956713575077,-0.39435012789616475,0.18588138665112183,0.24363956541183343,0.2662560514881984,-0.025785476694051738,-0.887326390307425,0.31015135316640235,0.531086343356056,9.456049771454468,,,0.18892134906535177,0.8110786509346481,0.8110786509346481,0.251984126984127,0.3115079365079365,0.3115079365079365,15.521247429746401,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,0.0,2022,2022-01-03,2022-12-30,0.0,0.0,0.0,,,0.0,0.0,1.0719308364537838,0.0,-0.0,0.0,0.0,,0.0,1.0,1.0,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,0.0,2023+,2023-01-03,2026-04-02,-0.037322547913712034,-0.011655562208603643,-0.29463766675223857,0.1892354421993155,0.03307627226563688,0.41937061826827887,-0.10654721088437939,-1.2795109404350589,0.1909900151111415,0.6200310576487094,10.339112729252834,,-0.011655562208603643,0.21532744368471274,0.7846725563152873,0.7846725563152873,0.298159509202454,0.2907975460122699,0.3006134969325153,14.178481012658228,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,5.0,Full Sample,2018-01-02,2026-04-02,0.0375983258339212,0.004485767280701047,-0.39665304950313585,0.17569534384228366,0.11461767383265037,0.2490759152721854,-0.028136564590336893,-0.7120134619834328,0.22905514155252166,0.35097099165421786,8.648149137024129,0.0,-0.01676113944336477,0.1764342268374713,0.8235657731625288,0.8235657731625288,0.23963355834136935,0.27434908389585344,0.27820636451301833,13.581673306772908,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,5.0,2018-2021,2018-01-02,2021-12-31,0.09608931973927382,0.023234422422679923,-0.39665304950313585,0.1858561204110435,0.21826834434997763,0.26616648999253784,-0.03048312200787057,-0.9062189106675627,0.30140867839749974,0.5384946534615132,9.456049771454468,,,0.18892134906535177,0.8110786509346481,0.8110786509346481,0.251984126984127,0.3115079365079365,0.3115079365079365,15.521247429746401,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,5.0,2022,2022-01-03,2022-12-30,0.0,0.0,0.0,,,0.0,0.0,1.0719308364537838,0.0,-0.0,0.0,0.0,,0.0,1.0,1.0,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,5.0,2023+,2023-01-03,2026-04-02,-0.05336334626384609,-0.01676113944336477,-0.30082830925661674,0.18928317052894011,0.005670343966174291,0.41973800263517114,-0.11183193585209761,-1.30493494360972,0.1810319130770239,0.6329594145324852,10.339112729252834,,-0.01676113944336477,0.21532744368471274,0.7846725563152873,0.7846725563152873,0.298159509202454,0.2907975460122699,0.3006134969325153,14.178481012658228,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,10.0,Full Sample,2018-01-02,2026-04-02,0.0012234054518154291,0.00014827650493987043,-0.3989480763239974,0.17571094333834741,0.0899498928779485,0.24910783870907216,-0.03247536287745459,-0.7297644329213411,0.2205947057444218,0.35673528308601055,8.648149137024129,0.0,-0.021842166586945377,0.1764342268374713,0.8235657731625288,0.8235657731625288,0.23963355834136935,0.27434908389585344,0.27820636451301833,13.581673306772908,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,10.0,2018-2021,2018-01-02,2021-12-31,0.07559255740144044,0.01841032295206091,-0.3989480763239974,0.18583982325235932,0.1928809148099194,0.26607692849687725,-0.03518076732168944,-0.9250863251846354,0.2926708370241715,0.5458983045431247,9.456049771454468,,,0.18892134906535177,0.8110786509346481,0.8110786509346481,0.251984126984127,0.3115079365079365,0.3115079365079365,15.521247429746401,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,10.0,2022,2022-01-03,2022-12-30,0.0,0.0,0.0,,,0.0,0.0,1.0719308364537838,0.0,-0.0,0.0,0.0,,0.0,1.0,1.0,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::cash,hybrid_tqqq::consensus_5::cash,10.0,2023+,2023-01-03,2026-04-02,-0.06914249400283845,-0.021842166586945377,-0.3069668361952921,0.18934016004503096,-0.021720704364569996,0.4201053870020634,-0.11711666081981582,-1.3303101086644764,0.17107667279748448,0.6458827877820414,10.339112729252834,,-0.021842166586945377,0.21532744368471274,0.7846725563152873,0.7846725563152873,0.298159509202454,0.2907975460122699,0.3006134969325153,14.178481012658228,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,0.0,Full Sample,2018-01-02,2026-04-02,0.21392606533295755,0.0237868961566301,-0.39435012789616475,0.1743987838055432,0.22349456330696718,0.24739020091424654,-0.00897046142693946,-0.6361783228607096,0.26049754152419796,0.315153276501224,8.568513664782268,0.000664766393272842,0.025779093489090688,0.174941584385141,0.7750584156148589,0.05000000000000001,0.23963355834136935,0.27434908389585344,0.27820636451301833,13.581673306772908,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,0.0,2018-2021,2018-01-02,2021-12-31,0.11696883568548833,0.02807956713575077,-0.39435012789616475,0.18588138665112183,0.24363956541183343,0.2662560514881984,-0.025785476694051738,-0.887326390307425,0.31015135316640235,0.531086343356056,9.46856690647846,,,0.18892134906535177,0.7610786509346481,0.05,0.251984126984127,0.3115079365079365,0.3115079365079365,15.521247429746401,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,0.0,2022,2022-01-03,2022-12-30,0.000664766393272842,0.000672595221768546,0.0,0.0005407517797039917,1.2340970331202872,3.9655079562818985e-05,0.0006809791588592104,1.0740517466926696,0.0,-0.0010722975632605277,0.0,0.000664766393272842,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,0.0,2023+,2023-01-03,2026-04-02,0.08608189003884581,0.025779093489090688,-0.257059634284166,0.18618061591161328,0.23079906442055423,0.4129778027430852,-0.06811649983146574,-1.1092179821069486,0.25041546710544516,0.4867969299899184,10.121286111200105,,0.025779093489090688,0.21152898914958024,0.7384710108504199,0.05,0.298159509202454,0.2907975460122699,0.3006134969325153,14.178481012658228,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,5.0,Full Sample,2018-01-02,2026-04-02,0.17177366274646877,0.01940868920789751,-0.3966530495031355,0.17440492752239842,0.19887319573234896,0.24742025696161904,-0.013269001444525374,-0.6538229262997257,0.25209552060592755,0.3208677156233915,8.568513664782268,0.000664766393272842,0.020592364162167698,0.174941584385141,0.7750584156148589,0.05000000000000001,0.23963355834136935,0.27434908389585344,0.27820636451301833,13.581673306772908,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,5.0,2018-2021,2018-01-02,2021-12-31,0.09606191750628001,0.023228018380955673,-0.3966530495031355,0.18585612624437986,0.21823470933692218,0.2661655816134455,-0.030489129528067316,-0.9062431294809083,0.30139352238067396,0.5384946534615132,9.46856690647846,,,0.18892134906535177,0.7610786509346481,0.05,0.251984126984127,0.3115079365079365,0.3115079365079365,15.521247429746401,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,5.0,2022,2022-01-03,2022-12-30,0.000664766393272842,0.000672595221768546,0.0,0.0005407517797039917,1.2340970331202872,3.9655079562818985e-05,0.0006809791588592104,1.0740517466926696,0.0,-0.0010722975632605277,0.0,0.000664766393272842,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,5.0,2023+,2023-01-03,2026-04-02,0.06836594335725432,0.020592364162167698,-0.2633925641025854,0.1862275943752051,0.20348041039441864,0.4133392341692571,-0.07329036582974409,-1.134282269484158,0.2406385768143528,0.4994880016899678,10.121286111200105,,0.020592364162167698,0.21152898914958024,0.7384710108504199,0.05,0.298159509202454,0.2907975460122699,0.3006134969325153,14.178481012658228,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,10.0,Full Sample,2018-01-02,2026-04-02,0.13107046127756528,0.015047627610239811,-0.3989480763239972,0.1744195701259004,0.17424507195994457,0.2474503130089917,-0.017567541462111296,-0.67145110963005,0.24369710271291156,0.326579265592168,8.568513664782268,0.000664766393272842,0.015430044966764145,0.174941584385141,0.7750584156148589,0.05000000000000001,0.23963355834136935,0.27434908389585344,0.27820636451301833,13.581673306772908,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,10.0,2018-2021,2018-01-02,2021-12-31,0.07553877777356943,0.01839757513362361,-0.3989480763239972,0.18583983449975208,0.19281364091548733,0.2660751117386925,-0.03519278236208288,-0.9251347288233621,0.2926405249905199,0.5458983045431247,9.46856690647846,,,0.18892134906535177,0.7610786509346481,0.05,0.251984126984127,0.3115079365079365,0.3115079365079365,15.521247429746401,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,10.0,2022,2022-01-03,2022-12-30,0.000664766393272842,0.000672595221768546,0.0,0.0005407517797039917,1.2340970331202872,3.9655079562818985e-05,0.0006809791588592104,1.0740517466926696,0.0,-0.0010722975632605277,0.0,0.000664766393272842,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::boxx,hybrid_tqqq::consensus_5::boxx,10.0,2023+,2023-01-03,2026-04-02,0.05093287802280533,0.015430044966764145,-0.26967371315425837,0.18628360259309945,0.17616699611776224,0.413700665595429,-0.07846423182802234,-1.1593061585191342,0.2308644082456425,0.5121742598642577,10.121286111200105,,0.015430044966764145,0.21152898914958024,0.7384710108504199,0.05,0.298159509202454,0.2907975460122699,0.3006134969325153,14.178481012658228,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,0.0,Full Sample,2018-01-02,2026-04-02,2.75527247656708,0.1740426164348683,-0.3445043038408786,0.27296182131545016,0.7265744095344435,1.0817015277381248,-0.011321637973674126,0.050027875442754575,1.0784503710198143,1.137752375952152,6.8804647987789425,-0.3106578066940354,0.2542689353455705,0.13965352045773216,0.8103464795422678,0.05000000000000001,0.23963355834136935,0.27434908389585344,0.27820636451301833,13.581673306772908,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,0.0,2018-2021,2018-01-02,2021-12-31,1.612116374375479,0.2717186312422326,-0.33656587987860853,0.28660307658119716,0.9830111583201538,1.1014401406544307,-0.012280878420870325,0.1444485836999316,1.1288899148528042,1.2507840681298352,8.229775829958477,,,0.1626552153791315,0.7873447846208684,0.05,0.251984126984127,0.3115079365079365,0.3115079365079365,15.521247429746401,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,0.0,2022,2022-01-03,2022-12-30,-0.3106578066940354,-0.3136703218542467,-0.3327622830896182,0.30481777296295376,-1.071930836453784,0.95,0.0,1.0719308364537818,0.9513806613291448,0.9498881386698169,0.0,-0.3106578066940354,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,0.0,2023+,2023-01-03,2026-04-02,1.085518616459202,0.2542689353455705,-0.28303180630814884,0.24292835071744928,1.0574204885632985,1.1518628497436894,-0.05296192898197924,-0.13847233553848637,1.0377511800879635,1.2664840719397765,7.355879356972793,,0.2542689353455705,0.15421465561616193,0.7957853443838381,0.05,0.298159509202454,0.2907975460122699,0.3006134969325153,14.178481012658228,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,5.0,Full Sample,2018-01-02,2026-04-02,2.6502687889069234,0.1700119264704365,-0.3446888767646662,0.27296377678767736,0.7139410671734749,1.0817127575157566,-0.01477083850806951,0.011818896175565287,1.0713973204483513,1.142196976435482,6.8804647987789425,-0.3106578066940354,0.24965101712110327,0.13965352045773216,0.8103464795422678,0.05000000000000001,0.23963355834136935,0.27434908389585344,0.27820636451301833,13.581673306772908,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,5.0,2018-2021,2018-01-02,2021-12-31,1.5696448516641857,0.26651033977327376,-0.3367893750444284,0.2865753225019457,0.9687671810816743,1.1013517701032822,-0.016366544009620905,0.1043613383351539,1.120922730091771,1.2568735999619574,8.229775829958477,,,0.1626552153791315,0.7873447846208684,0.05,0.251984126984127,0.3115079365079365,0.3115079365079365,15.521247429746401,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,5.0,2022,2022-01-03,2022-12-30,-0.3106578066940354,-0.3136703218542467,-0.3327622830896182,0.30481777296295376,-1.071930836453784,0.95,0.0,1.0719308364537818,0.9513806613291448,0.9498881386698169,0.0,-0.3106578066940354,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,5.0,2023+,2023-01-03,2026-04-02,1.0607100038485306,0.24965101712110327,-0.2839352185080821,0.24298485008563017,1.0419902558314382,1.152134845053217,-0.056724662140382284,-0.18058156093777789,1.030383920835083,1.2757803597723216,7.355879356972793,,0.24965101712110327,0.15421465561616193,0.7957853443838381,0.05,0.298159509202454,0.2907975460122699,0.3006134969325153,14.178481012658228,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,10.0,Full Sample,2018-01-02,2026-04-02,2.5481718331601213,0.16599390510741996,-0.34487344529491826,0.27296924415798146,0.7012988831096352,1.0817239872933881,-0.018220039042464845,-0.026387978343155327,1.064346907503065,1.1466396809877881,6.8804647987789425,-0.3106578066940354,0.24504893638394631,0.13965352045773216,0.8103464795422678,0.05000000000000001,0.23963355834136935,0.27434908389585344,0.27820636451301833,13.581673306772908,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,10.0,2018-2021,2018-01-02,2021-12-31,1.527850655405652,0.2613217253423823,-0.3370128702102483,0.28655192482302433,0.9545059331787252,1.101263399552134,-0.020452209598371535,0.06424587443011166,1.1129594763382011,1.2629598004915008,8.229775829958477,,,0.1626552153791315,0.7873447846208684,0.05,0.251984126984127,0.3115079365079365,0.3115079365079365,15.521247429746401,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,10.0,2022,2022-01-03,2022-12-30,-0.3106578066940354,-0.3136703218542467,-0.3327622830896182,0.30481777296295376,-1.071930836453784,0.95,0.0,1.0719308364537818,0.9513806613291448,0.9498881386698169,0.0,-0.3106578066940354,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_5::qqq,hybrid_tqqq::consensus_5::qqq,10.0,2023+,2023-01-03,2026-04-02,1.0361903267837924,0.24504893638394631,-0.2848377198347136,0.24304494772153562,1.0265519989006957,1.152406840362744,-0.06048739529878519,-0.22263221183712983,1.0230181181453697,1.2850739695585838,7.355879356972793,,0.24504893638394631,0.15421465561616193,0.7957853443838381,0.05,0.298159509202454,0.2907975460122699,0.3006134969325153,14.178481012658228,hybrid_growth_tqqq_attack_only,consensus_5,MA stack + RSI + MACD + MFI > 50 + CCI > 0.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,0.0,Full Sample,2018-01-02,2026-04-02,0.26332054886099465,0.028750444397970476,-0.29622739899052386,0.1630548734834721,0.25693262848698456,0.21525436960805844,0.00017484420712292854,-0.6250460800957038,0.27272916714130035,0.31896818225457463,7.4700692706833784,0.0,0.020310078068457083,0.14861222063152377,0.8513877793684762,0.8513877793684762,0.20443587270973965,0.2381870781099325,0.24108003857280616,11.883964143426294,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,0.0,2018-2021,2018-01-02,2021-12-31,0.18354096937451891,0.04308789139692437,-0.29622739899052386,0.17714215329704802,0.3284320185590169,0.23878092559203193,-0.00556025993571705,-0.8350474574339447,0.32993314974185417,0.49927311411801145,8.709357916195732,,,0.16109887168109593,0.8389011283189041,0.8389011283189041,0.21428571428571427,0.2698412698412698,0.2698412698412698,14.019191226867717,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,0.0,2022,2022-01-03,2022-12-30,0.0,0.0,0.0,,,0.0,0.0,1.0719308364537838,0.0,-0.0,0.0,0.0,,0.0,1.0,1.0,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,0.0,2023+,2023-01-03,2026-04-02,0.06740753514315356,0.020310078068457083,-0.25401050424110627,0.1698352065319783,0.20405064080047983,0.34590247422201054,-0.0583892506442399,-1.157495178323504,0.2550516209694636,0.5579060882222732,8.264046787821743,,0.020310078068457083,0.17893752507390875,0.8210624749260912,0.8210624749260912,0.2552147239263804,0.25030674846625767,0.25766871165644173,11.712658227848102,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,5.0,Full Sample,2018-01-02,2026-04-02,0.22498038908708407,0.02491293547681117,-0.2988767122257,0.16306674528397885,0.23396376059078575,0.21529477714900147,-0.0035753956107846675,-0.6404475439898726,0.26501844814692177,0.32332434453102155,7.4700692706833784,0.0,0.01609407757673842,0.14861222063152377,0.8513877793684762,0.8513877793684762,0.20443587270973965,0.2381870781099325,0.24108003857280616,11.883964143426294,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,5.0,2018-2021,2018-01-02,2021-12-31,0.16314283705394028,0.03855799919517833,-0.2988767122257,0.17712622074835976,0.3039100423659182,0.23871756222809623,-0.00989206364993743,-0.8524296966759732,0.3211474769555,0.5044322370501552,8.709357916195732,,,0.16109887168109593,0.8389011283189041,0.8389011283189041,0.21428571428571427,0.2698412698412698,0.2698412698412698,14.019191226867717,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,5.0,2022,2022-01-03,2022-12-30,0.0,0.0,0.0,,,0.0,0.0,1.0719308364537838,0.0,-0.0,0.0,0.0,,0.0,1.0,1.0,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,5.0,2023+,2023-01-03,2026-04-02,0.05316419451094179,0.01609407757673842,-0.25874813173762856,0.16988604529774962,0.1795903481046078,0.34624085638827384,-0.06262536070175453,-1.1781047986657465,0.24710054094342504,0.5684374321958845,8.264046787821743,,0.01609407757673842,0.17893752507390875,0.8210624749260912,0.8210624749260912,0.2552147239263804,0.25030674846625767,0.25766871165644173,11.712658227848102,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,10.0,Full Sample,2018-01-02,2026-04-02,0.18779054355708968,0.021088359127774403,-0.30151703466096436,0.1630865790214242,0.21098793587200992,0.21533518468994448,-0.007325635428692298,-0.6558347836571525,0.25731127417634575,0.3276787467701233,7.4700692706833784,0.0,0.011894039713098659,0.14861222063152377,0.8513877793684762,0.8513877793684762,0.20443587270973965,0.2381870781099325,0.24108003857280616,11.883964143426294,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,10.0,2018-2021,2018-01-02,2021-12-31,0.1430888461201556,0.03404609960756555,-0.30151703466096436,0.1771190268966882,0.2793698700316364,0.23865419886416056,-0.014223867364157837,-0.869789864304575,0.31236700392418243,0.5095891173352397,8.709357916195732,,,0.16109887168109593,0.8389011283189041,0.8389011283189041,0.21428571428571427,0.2698412698412698,0.2698412698412698,14.019191226867717,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,10.0,2022,2022-01-03,2022-12-30,0.0,0.0,0.0,,,0.0,0.0,1.0719308364537838,0.0,-0.0,0.0,0.0,,0.0,1.0,1.0,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::cash,hybrid_tqqq::consensus_7_weekly_kdj::cash,10.0,2023+,2023-01-03,2026-04-02,0.03910605688145674,0.011894039713098659,-0.26345730621042307,0.16994493337189637,0.15513734231340096,0.3465792385545372,-0.06686147075926918,-1.1986790593717318,0.23915153265899852,0.5789647987304544,8.264046787821743,,0.011894039713098659,0.17893752507390875,0.8210624749260912,0.8210624749260912,0.2552147239263804,0.25030674846625767,0.25766871165644173,11.712658227848102,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,CASH,2,2,attack_only,"('BOXX', 'CASH', 'CASH')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,0.0,Full Sample,2018-01-02,2026-04-02,0.43156103808040935,0.04446592160181284,-0.29622739899052386,0.1619397238903798,0.3513827194943303,0.2139371172771763,0.015438849264756376,-0.5643095582967121,0.2970240046833563,0.28874633215576984,7.407547235741224,0.000664766393272842,0.0601781612928729,0.1473784840334207,0.8026215159665792,0.05000000000000001,0.20443587270973965,0.2381870781099325,0.24108003857280616,11.883964143426294,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,0.0,2018-2021,2018-01-02,2021-12-31,0.18354096937451891,0.04308789139692437,-0.29622739899052386,0.17714215329704802,0.3284320185590169,0.23878092559203193,-0.00556025993571705,-0.8350474574339447,0.32993314974185417,0.49927311411801145,8.721875051219723,,,0.16109887168109593,0.7889011283189039,0.05,0.21428571428571427,0.2698412698412698,0.2698412698412698,14.019191226867717,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,0.0,2022,2022-01-03,2022-12-30,0.000664766393272842,0.000672595221768546,0.0,0.0005407517797039917,1.2340970331202872,3.9655079562818985e-05,0.0006809791588592104,1.0740517466926696,0.0,-0.0010722975632605277,0.0,0.000664766393272842,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,0.0,2023+,2023-01-03,2026-04-02,0.20875411467634786,0.0601781612928729,-0.21247196501791754,0.1670940777787408,0.43474542350247686,0.34074009800693866,-0.019012221272872224,-0.9760247058396838,0.31788182436967577,0.4239015900718121,8.08971862812067,,0.0601781612928729,0.17579793034450278,0.7742020696554971,0.05,0.2552147239263804,0.25030674846625767,0.25766871165644173,11.712658227848102,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,5.0,Full Sample,2018-01-02,2026-04-02,0.38847746507974135,0.040602735876126506,-0.29887671222570045,0.1619505904190421,0.32844421802843654,0.21397577067520013,0.01172027215644497,-0.5796100183684085,0.2893617542942436,0.29305972816458087,7.407547235741224,0.000664766393272842,0.05589052810935735,0.1473784840334207,0.8026215159665792,0.05000000000000001,0.20443587270973965,0.2381870781099325,0.24108003857280616,11.883964143426294,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,5.0,2018-2021,2018-01-02,2021-12-31,0.1631137584830149,0.03855149924891599,-0.29887671222570045,0.17712622872644312,0.30387474310694,0.23871665384900384,-0.009898071170134137,-0.8524539395534005,0.32113232093867417,0.5044322370501552,8.721875051219723,,,0.16109887168109593,0.7889011283189039,0.05,0.21428571428571427,0.2698412698412698,0.2698412698412698,14.019191226867717,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,5.0,2022,2022-01-03,2022-12-30,0.000664766393272842,0.000672595221768546,0.0,0.0005407517797039917,1.2340970331202872,3.9655079562818985e-05,0.0006809791588592104,1.0740517466926696,0.0,-0.0010722975632605277,0.0,0.000664766393272842,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,5.0,2023+,2023-01-03,2026-04-02,0.19296591153161313,0.05589052810935735,-0.21731906064635698,0.16714337268886578,0.41034074809435384,0.3410731097423819,-0.023159447049654492,-0.9963151923251715,0.3100767754459287,0.4342406654546516,8.08971862812067,,0.05589052810935735,0.17579793034450278,0.7742020696554971,0.05,0.2552147239263804,0.25030674846625767,0.25766871165644173,11.712658227848102,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,10.0,Full Sample,2018-01-02,2026-04-02,0.3466757377482581,0.0367524594721389,-0.3015170346609638,0.1619693384444344,0.30549392841450734,0.21401442407322405,0.008001695048133594,-0.5948978072962159,0.2817030076457006,0.2973713925452202,7.407547235741224,0.000664766393272842,0.051618781921216605,0.1473784840334207,0.8026215159665792,0.05000000000000001,0.20443587270973965,0.2381870781099325,0.24108003857280616,11.883964143426294,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,10.0,2018-2021,2018-01-02,2021-12-31,0.14303169167785046,0.03403315607033286,-0.3015170346609638,0.17711904251691987,0.27929927138992966,0.23865238210597575,-0.01423588240455121,-0.8698383181278939,0.31233669189053087,0.5095891173352397,8.721875051219723,,,0.16109887168109593,0.7889011283189039,0.05,0.21428571428571427,0.2698412698412698,0.2698412698412698,14.019191226867717,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,10.0,2022,2022-01-03,2022-12-30,0.000664766393272842,0.000672595221768546,0.0,0.0005407517797039917,1.2340970331202872,3.9655079562818985e-05,0.0006809791588592104,1.0740517466926696,0.0,-0.0010722975632605277,0.0,0.000664766393272842,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::boxx,hybrid_tqqq::consensus_7_weekly_kdj::boxx,10.0,2023+,2023-01-03,2026-04-02,0.1773786479355588,0.051618781921216605,-0.22213794815734078,0.16720051768529998,0.38593234315879116,0.3414061214778251,-0.027306672826436763,-1.0165775437647853,0.3022736914989755,0.44457589112041507,8.08971862812067,,0.051618781921216605,0.17579793034450278,0.7742020696554971,0.05,0.2552147239263804,0.25030674846625767,0.25766871165644173,11.712658227848102,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,BOXX,2,2,attack_only,"('BOXX', 'CASH', 'BOXX')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,0.0,Full Sample,2018-01-02,2026-04-02,3.053884485988763,0.1849867254638411,-0.34429394992693874,0.2678542084954263,0.769949721767107,1.0654207655380463,-0.00025900199736921214,0.14603232176971306,1.0973505979353346,1.124170640498272,6.0708610728584755,-0.3106578066940352,0.27198726903976,0.11927215934034592,0.8307278406596539,0.05000000000000001,0.20443587270973965,0.2381870781099325,0.24108003857280616,11.883964143426294,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,0.0,2018-2021,2018-01-02,2021-12-31,1.694371759929775,0.28162773592839185,-0.33825476212662753,0.2815028815553811,1.0232021628877435,1.0853734487353226,-0.0016917522000260352,0.21633859759885835,1.1423970999203403,1.2301760360362695,7.59832923873215,,,0.1385569458084119,0.8114430541915879,0.05,0.21428571428571427,0.2698412698412698,0.2698412698412698,14.019191226867717,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,0.0,2022,2022-01-03,2022-12-30,-0.3106578066940352,-0.3136703218542465,-0.33276228308961797,0.3048177729629538,-1.0719308364537836,0.9500000000000001,0.0,1.0719308364537863,0.9513806613291464,0.949888138669817,0.0,-0.3106578066940352,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,0.0,2023+,2023-01-03,2026-04-02,1.1826243192100727,0.27198726903976,-0.278443997318629,0.23570600039642564,1.1421313954444774,1.1217621882877116,-0.03253535057864922,0.0026833280377798084,1.0681964887419273,1.2415857274610216,6.075503115729554,,0.27198726903976,0.13215344429079542,0.8178465557092045,0.05,0.2552147239263804,0.25030674846625767,0.25766871165644173,11.712658227848102,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,5.0,Full Sample,2018-01-02,2026-04-02,2.9536990856755914,0.18139630272555074,-0.34447482515562144,0.2678565253709074,0.7585883897791559,1.0654348057532896,-0.003303146217454996,0.11027580526870129,1.0907911890850894,1.1275470520017592,6.0708610728584755,-0.3106578066940352,0.2681170545902807,0.11927215934034592,0.8307278406596539,0.05000000000000001,0.20443587270973965,0.2381870781099325,0.24108003857280616,11.883964143426294,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,5.0,2018-2021,2018-01-02,2021-12-31,1.6538929872205577,0.27678013424810377,-0.33848372840934515,0.28147890251616364,1.0098106496767791,1.0853001743138,-0.0054661564072549865,0.17747906007658484,1.1344045264827416,1.2343388259715469,7.59832923873215,,,0.1385569458084119,0.8114430541915879,0.05,0.21428571428571427,0.2698412698412698,0.2698412698412698,14.019191226867717,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,5.0,2022,2022-01-03,2022-12-30,-0.3106578066940352,-0.3136703218542465,-0.33276228308961797,0.3048177729629538,-1.0719308364537836,0.9500000000000001,0.0,1.0719308364537863,0.9513806613291464,0.949888138669817,0.0,-0.3106578066940352,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,5.0,2023+,2023-01-03,2026-04-02,1.1611521525509048,0.2681170545902807,-0.2789856972388176,0.23575777626970548,1.12895477101377,1.1220085765450147,-0.035648983327984655,-0.034910353259616174,1.062140511818179,1.2494606462836513,6.075503115729554,,0.2681170545902807,0.13215344429079542,0.8178465557092045,0.05,0.2552147239263804,0.25030674846625767,0.25766871165644173,11.712658227848102,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,10.0,Full Sample,2018-01-02,2026-04-02,2.8559610924778336,0.17781570237911204,-0.34465569600255663,0.2678620635452026,0.7472182682074133,1.065448845968533,-0.006347290437540745,0.07450861786154848,1.0842344571927904,1.1309223929539014,6.0708610728584755,-0.3106578066940352,0.26425763521086254,0.11927215934034592,0.8307278406596539,0.05000000000000001,0.20443587270973965,0.2381870781099325,0.24108003857280616,11.883964143426294,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,10.0,2018-2021,2018-01-02,2021-12-31,1.6140095910835308,0.2719493143655849,-0.33871269469206255,0.2814590758223697,0.9964021545736226,1.085226899892277,-0.009240560614483818,0.13858297070170886,1.1264162081680384,1.2385001893539402,7.59832923873215,,,0.1385569458084119,0.8114430541915879,0.05,0.21428571428571427,0.2698412698412698,0.2698412698412698,14.019191226867717,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,10.0,2022,2022-01-03,2022-12-30,-0.3106578066940352,-0.3136703218542465,-0.33276228308961797,0.3048177729629538,-1.0719308364537836,0.9500000000000001,0.0,1.0719308364537863,0.9513806613291464,0.949888138669817,0.0,-0.3106578066940352,,0.0,0.95,0.05,0.0,0.07171314741035857,0.07171314741035857,4.0470914127423825,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" +hybrid_tqqq::consensus_7_weekly_kdj::qqq,hybrid_tqqq::consensus_7_weekly_kdj::qqq,10.0,2023+,2023-01-03,2026-04-02,1.1398858391126048,0.26425763521086254,-0.2795271259839188,0.23581265996539544,1.1157692277325837,1.1222549648023183,-0.03876261607732018,-0.07246736023646577,1.0560856508470755,1.2573332553982528,6.075503115729554,,0.26425763521086254,0.13215344429079542,0.8178465557092045,0.05,0.2552147239263804,0.25030674846625767,0.25766871165644173,11.712658227848102,hybrid_growth_tqqq_attack_only,consensus_7_weekly_kdj,Consensus_5 plus BIAS20 > 0 and weekly K>D with J > 50.,QQQ,2,2,attack_only,"('BOXX', 'CASH', 'QQQ')" diff --git a/research/results/tqqq_hybrid_indicator_variants_recommendation.json b/research/results/tqqq_hybrid_indicator_variants_recommendation.json new file mode 100644 index 0000000..c45361b --- /dev/null +++ b/research/results/tqqq_hybrid_indicator_variants_recommendation.json @@ -0,0 +1,50 @@ +{ + "baseline_attack_only_boxx": { + "oos_cagr": 0.23946589243573047, + "oos_max_drawdown": -0.20112252780688988, + "oos_ir_vs_qqq": -0.17226666681804959, + "oos_alpha_ann_vs_qqq": -0.02970471903762832, + "return_2022": NaN + }, + "best_attack_only_candidate": { + "strategy": "hybrid_tqqq::baseline::qqq", + "overlay": "baseline", + "idle_asset": "QQQ", + "oos_cagr": 0.38650337762547693, + "oos_max_drawdown": -0.32111994889021644, + "oos_ir_vs_qqq": 0.7513742177806451, + "oos_alpha_ann_vs_qqq": -0.052876006297183864, + "return_2022": NaN, + "turnover_per_year": 1.1420129445246108 + }, + "idle_asset_baseline_comparison": [ + { + "idle_asset": "CASH", + "CAGR": 0.21153055543754018, + "Max Drawdown": -0.2025249507591308, + "Information Ratio vs QQQ": -0.33882909960401536, + "Alpha Ann vs QQQ": -0.0525637854000517, + "2022 Return": NaN, + "Turnover/Year": 1.2441727044790705 + }, + { + "idle_asset": "BOXX", + "CAGR": 0.23946589243573047, + "Max Drawdown": -0.20112252780688988, + "Information Ratio vs QQQ": -0.17226666681804959, + "Alpha Ann vs QQQ": -0.02970471903762832, + "2022 Return": NaN, + "Turnover/Year": 1.2416875639444467 + }, + { + "idle_asset": "QQQ", + "CAGR": 0.38650337762547693, + "Max Drawdown": -0.32111994889021644, + "Information Ratio vs QQQ": 0.7513742177806451, + "Alpha Ann vs QQQ": -0.052876006297183864, + "2022 Return": NaN, + "Turnover/Year": 1.1420129445246108 + } + ], + "verdict": "The tested overlays mainly trade more often; they do not justify upgrading the default logic yet." +} \ No newline at end of file diff --git a/research/results/tqqq_hybrid_indicator_variants_summary.md b/research/results/tqqq_hybrid_indicator_variants_summary.md new file mode 100644 index 0000000..d825088 --- /dev/null +++ b/research/results/tqqq_hybrid_indicator_variants_summary.md @@ -0,0 +1,45 @@ +# TQQQ / hybrid_growth_income indicator overlay review + +## Setup +- Baseline signal: current QQQ MA200 + ATR staged TQQQ logic. +- Main research set: attack-only normalization (`income_threshold_usd = 1e9`) so the idle-asset choice is visible. +- Runtime reference: current full `hybrid_growth_income` with income layer on. +- Idle asset candidates: `CASH`, `BOXX`, `QQQ`. +- Extra indicator gates are nested from simple to complex to avoid blind indicator stuffing. + +## OOS 2023+ (5 bps) +| overlay | idle_asset | CAGR | Max Drawdown | Information Ratio vs QQQ | Alpha Ann vs QQQ | 2022 Return | Turnover/Year | Average TQQQ Weight | Average Idle Asset Weight | Gate Active Share | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| baseline | BOXX | 0.239466 | -0.201123 | -0.172267 | -0.029705 | | 1.241688 | 0.458291 | 0.491709 | 1.000000 | +| baseline | CASH | 0.211531 | -0.202525 | -0.338829 | -0.052564 | | 1.244173 | 0.458611 | 0.541389 | 1.000000 | +| baseline | QQQ | 0.386503 | -0.321120 | 0.751374 | -0.052876 | | 1.142013 | 0.456134 | 0.493866 | 1.000000 | +| consensus_5 | BOXX | 0.020592 | -0.263393 | -1.134282 | -0.073290 | | 10.121286 | 0.211529 | 0.738471 | 0.300613 | +| consensus_5 | CASH | -0.016761 | -0.300828 | -1.304935 | -0.111832 | | 10.339113 | 0.215327 | 0.784673 | 0.300613 | +| consensus_5 | QQQ | 0.249651 | -0.283935 | -0.180582 | -0.056725 | | 7.355879 | 0.154215 | 0.795785 | 0.300613 | +| consensus_7_weekly_kdj | BOXX | 0.055891 | -0.217319 | -0.996315 | -0.023159 | | 8.089719 | 0.175798 | 0.774202 | 0.257669 | +| consensus_7_weekly_kdj | CASH | 0.016094 | -0.258748 | -1.178105 | -0.062625 | | 8.264047 | 0.178938 | 0.821062 | 0.257669 | +| consensus_7_weekly_kdj | QQQ | 0.268117 | -0.278986 | -0.034910 | -0.035649 | | 6.075503 | 0.132153 | 0.817847 | 0.257669 | +| ma20_ma60_stack | BOXX | 0.107698 | -0.175128 | -0.854381 | -0.019696 | | 6.554695 | 0.296228 | 0.653772 | 0.571779 | +| ma20_ma60_stack | CASH | 0.077047 | -0.180886 | -1.008867 | -0.048551 | | 6.628876 | 0.298799 | 0.701201 | 0.571779 | +| ma20_ma60_stack | QQQ | 0.296045 | -0.284608 | 0.257137 | -0.046158 | | 6.273944 | 0.283060 | 0.666940 | 0.571779 | +| ma_stack_rsi_macd | BOXX | 0.013013 | -0.265125 | -1.182128 | -0.081451 | | 11.232051 | 0.218740 | 0.731260 | 0.316564 | +| ma_stack_rsi_macd | CASH | -0.023811 | -0.304549 | -1.352885 | -0.119740 | | 11.473083 | 0.222736 | 0.777264 | 0.316564 | +| ma_stack_rsi_macd | QQQ | 0.243462 | -0.282495 | -0.236261 | -0.062321 | | 8.232730 | 0.161048 | 0.788952 | 0.316564 | + +## Runtime full reference (2023+, 5 bps) +| strategy | idle_asset | CAGR | Max Drawdown | Information Ratio vs QQQ | Alpha Ann vs QQQ | 2022 Return | Turnover/Year | +| --- | --- | --- | --- | --- | --- | --- | --- | +| hybrid_growth_income_runtime_full_reference | BOXX | 0.180025 | -0.177757 | -1.291324 | -0.027152 | | 0.478999 | + +## Recommendation +- The tested overlays mainly trade more often; they do not justify upgrading the default logic yet. +- Best attack-only candidate in this run: `baseline` + `QQQ` +- OOS CAGR: 38.65% +- OOS MaxDD: -32.11% +- OOS IR vs QQQ: 0.751 +- 2022: nan% + +## Caveats +- BOXX pre-launch history is naturally short; before listed data exists it behaves like 0% carry in this backtest, so early BOXX results are closer to cash than to realized BOXX carry. +- These tests add daily gates on top of the existing daily TQQQ logic; they are not monthly overlays and should not be read as direct runtime recommendations. +- Weekly KDJ is mapped back to daily with forward-fill from Friday weekly bars; useful for a sanity check, but not a reason to trust the heaviest gate by default. diff --git a/research/results/tqqq_hybrid_position_scaling_followup_comparison.csv b/research/results/tqqq_hybrid_position_scaling_followup_comparison.csv new file mode 100644 index 0000000..0898d0b --- /dev/null +++ b/research/results/tqqq_hybrid_position_scaling_followup_comparison.csv @@ -0,0 +1,97 @@ +strategy,display_name,cost_bps_one_way,period,Start,End,Total Return,CAGR,Max Drawdown,Ulcer Index,Volatility,Sharpe,Beta vs QQQ,Alpha Ann vs QQQ,Information Ratio vs QQQ,Up Capture vs QQQ,Down Capture vs QQQ,Turnover/Year,Average TQQQ Weight,Average Idle Asset Weight,Average Cash Weight,Average Scale While Invested,2022 Return,2023+ CAGR,family,scaling,scaling_description,idle_asset +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,0.0,Full Sample,2018-01-02,2026-04-02,4.241858067670606,0.2224985051649182,-0.4537670219512815,12.288032457130226,0.2807942527371727,0.8590040616972735,0.7815959197660712,0.08971926219916983,0.21925360268043212,1.1634559345968802,1.047723498691548,1.2726290657246742,0.3949161432235001,0.5550838567764999,0.05000000000000001,1.0,-0.16094747221032568,0.24023598893760867,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,0.0,2018-2021,2018-01-02,2021-12-31,2.106955538863576,0.3281663811135862,-0.4537670219512815,12.322844754206143,0.3343531899660587,1.017632048071479,0.9671304177302957,0.08208575204911082,0.3093995629277704,1.3397065991933268,1.3952464645193492,1.4919739331536854,0.43513857926198757,0.5148614207380124,0.05,1.0,,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,0.0,2022,2022-01-03,2022-12-30,-0.16094747221032568,-0.16267910116631934,-0.17358241218326942,17.00106528483551,0.08557725863357606,-2.0143922726332266,0.05081646006326282,-0.1549083328044079,0.5430125590639115,0.0,0.259441968935757,0.5123799195847096,0.027606347089391997,0.9223936529106079,0.05,1.0,-0.16094747221032568,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,0.0,2023+,2023-01-03,2026-04-02,1.010763850664984,0.24023598893760867,-0.20112248792367227,7.484087863525461,0.24467609425863857,1.005733188202808,1.0229339906950543,-0.029079931827804363,-0.16771047530748084,1.1805459502569293,1.8103203484360122,1.2416874485412759,0.4582910429816177,0.4917089570183824,0.05,1.0,,0.24023598893760867,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,5.0,Full Sample,2018-01-02,2026-04-02,4.214182011317579,0.22171397042406604,-0.4545080790167939,12.311460441662414,0.28081372396680215,0.856674059479482,0.781621961336206,0.0890766442470098,0.21628536629895082,1.1625391998837997,1.0491332582743544,1.2726290657246742,0.3949161432235001,0.5550838567764999,0.05000000000000001,1.0,-0.16116196775788294,0.23946594420737966,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,5.0,2018-2021,2018-01-02,2021-12-31,2.0975769774384423,0.3271615789222708,-0.4545080790167939,12.347922859438453,0.33438422953361,1.0153097118002479,0.9671748571215087,0.08132892377090997,0.306213393337487,1.3385327199154111,1.396825501788881,1.4919739331536854,0.43513857926198757,0.5148614207380124,0.05,1.0,,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,5.0,2022,2022-01-03,2022-12-30,-0.16116196775788294,-0.16289567372704838,-0.17379367773237242,17.021365430830517,0.08560371058308373,-2.01673952095231,0.050832447216506794,-0.1551570519443235,0.5422045378777843,0.0,0.25978772956945045,0.5123799195847096,0.027606347089391997,0.9223936529106079,0.05,1.0,-0.16116196775788294,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,5.0,2023+,2023-01-03,2026-04-02,1.0067162449629734,0.23946594420737966,-0.2011224879236717,7.500255198481181,0.24467865166648115,1.0031772689326897,1.0229412492082917,-0.029704691104599622,-0.17226635339526875,1.1797771547842468,1.8132855157217878,1.2416874485412759,0.4582910429816177,0.4917089570183824,0.05,1.0,,0.23946594420737966,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,10.0,Full Sample,2018-01-02,2026-04-02,4.186646720714057,0.22092978618618875,-0.45524833416871313,12.334929363802289,0.2808336217967468,0.8543430825656202,0.781648002906341,0.08843402629484975,0.2133170887762941,1.1616225665617246,1.0505425240102984,1.2726290657246742,0.3949161432235001,0.5550838567764999,0.05000000000000001,1.0,-0.1613764389322091,0.2386962504047463,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,10.0,2018-2021,2018-01-02,2021-12-31,2.08822467602542,0.3261573165344891,-0.45524833416871313,12.373040087323185,0.33441573433569555,1.012986397381014,0.9672192965127219,0.08057209549270908,0.303027262277505,1.337358958998154,1.3984037486627192,1.4919739331536854,0.43513857926198757,0.5148614207380124,0.05,1.0,,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,10.0,2022,2022-01-03,2022-12-30,-0.1613764389322091,-0.16311222102667988,-0.1740049192752705,17.041663668418124,0.08563056739264263,-2.0190757728925353,0.050848434369750756,-0.15540577108423922,0.5413963348834626,0.0,0.2601334509141986,0.5123799195847096,0.027606347089391997,0.9223936529106079,0.05,1.0,-0.1613764389322091,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::boxx,hybrid_tqqq_scaling::baseline::boxx,10.0,2023+,2023-01-03,2026-04-02,1.002676119852417,0.2386962504047463,-0.20112248792367204,7.51648649398249,0.24468162221025144,1.0006197135790358,1.0229485077215295,-0.03032945038139499,-0.1768211078913804,1.1790084599946409,1.8162499181378562,1.2416874485412759,0.4582910429816177,0.4917089570183824,0.05,1.0,,0.2386962504047463,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,BOXX +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,0.0,Full Sample,2018-01-02,2026-04-02,6.907423037176722,0.2849912115662059,-0.4993622291355213,17.08335293191642,0.36789507418963946,0.8689298580639737,1.4396500277350464,0.040650850247270255,0.7503312775133378,1.6610823479577816,1.66244928972698,1.242602113024156,0.3786503606556797,0.5713496393443203,0.05000000000000001,1.0,-0.38759675919467107,0.38729582967176523,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.464273399977465,0.45432130329894105,-0.4993622291355213,12.219056968295094,0.4020258221813158,1.1350426113129868,1.537227913129752,0.04597362689508486,0.9706876164089591,1.7696686604562881,1.852488799317836,1.5125478933229402,0.40351837337433744,0.5464816266256625,0.05,1.0,,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,0.0,2022,2022-01-03,2022-12-30,-0.38759675919467107,-0.3911219699670473,-0.41282898947336777,31.462087250189345,0.32019083450294716,-1.37552634599831,0.9831470124386541,-0.10228691127073734,-1.7499545501216582,0.9513806498497431,1.1149551582509316,0.5058864265927978,0.027191235059760958,0.922808764940239,0.05,1.0,-0.38759675919467107,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,0.0,2023+,2023-01-03,2026-04-02,1.8923224571312405,0.38729582967176523,-0.32071858140331144,9.601123601649789,0.3348739401273945,1.148998148546468,1.6248578662632154,-0.05230064036161274,0.75512878476614,1.670040930711379,2.282175898750364,1.1420128169372057,0.456134144341776,0.4938658556582241,0.05,1.0,,0.38729582967176523,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,5.0,Full Sample,2018-01-02,2026-04-02,6.866659754665163,0.28418610138095324,-0.49982699537146513,17.10017703092772,0.36790779677873486,0.8672077345817509,1.4396755448352243,0.04002337706037221,0.7465344684799274,1.6601554596144081,1.663823233013574,1.242602113024156,0.3786503606556797,0.5713496393443203,0.05000000000000001,1.0,-0.38775218252187793,0.3865033426282003,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,5.0,2018-2021,2018-01-02,2021-12-31,3.450630394504575,0.453207386760921,-0.49982699537146513,12.23692950836031,0.4020467578001082,1.1331050220441732,1.5372696261305623,0.04520725349303614,0.9666659036359151,1.7684166655698714,1.8540857995650841,1.5125478933229402,0.40351837337433744,0.5464816266256625,0.05,1.0,,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,5.0,2022,2022-01-03,2022-12-30,-0.38775218252187793,-0.39127831763190657,-0.41297800905068993,31.478236428800237,0.32020053815235344,-1.3762685321042323,0.9831637408863653,-0.10253215369698532,-1.7537079975325178,0.9513806498497431,1.115288607876213,0.5058864265927978,0.027191235059760958,0.922808764940239,0.05,1.0,-0.38775218252187793,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,5.0,2023+,2023-01-03,2026-04-02,1.8869654835771938,0.3865033426282003,-0.3211199338433649,9.612987986459109,0.3348768231439471,1.1472777413638375,1.6248674623942565,-0.0528760335340464,0.751374065832975,1.6693524826593085,2.2849699561746517,1.1420128169372057,0.456134144341776,0.4938658556582241,0.05,1.0,,0.3865033426282003,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,10.0,Full Sample,2018-01-02,2026-04-02,6.826099146257124,0.28338134722268116,-0.5002914262034555,17.117026277161745,0.3679208194287109,0.8654850243465517,1.439701061935403,0.039395903873474025,0.7427356221661006,1.659228664221504,1.66519671493617,1.242602113024156,0.3786503606556797,0.5713496393443203,0.05000000000000001,1.0,-0.38790758880583176,0.3857111755535678,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,10.0,2018-2021,2018-01-02,2021-12-31,3.4370263926017826,0.45209410302043906,-0.5002914262034555,12.25483277400584,0.4020680464109955,1.1311666414568144,1.5373113391313722,0.04444088009098757,0.9626418691018978,1.7671648010900107,1.8556820485002423,1.5125478933229402,0.40351837337433744,0.5464816266256625,0.05,1.0,,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,10.0,2022,2022-01-03,2022-12-30,-0.38790758880583176,-0.3914346476849666,-0.4131270122869748,31.494384594920643,0.3202103500344993,-1.377010207791082,0.9831804693340765,-0.10277739612323324,-1.757438341914792,0.9513806498497431,1.115622020936412,0.5058864265927978,0.027191235059760958,0.922808764940239,0.05,1.0,-0.38790758880583176,,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::baseline::qqq,hybrid_tqqq_scaling::baseline::qqq,10.0,2023+,2023-01-03,2026-04-02,1.881617536333859,0.3857111755535678,-0.32152111227747526,9.624892886058332,0.33487998774889427,1.1455564005460623,1.6248770585252972,-0.053451426706479954,0.7476165361475234,1.6686640970224604,2.2877633214405417,1.1420128169372057,0.456134144341776,0.4938658556582241,0.05,1.0,,0.3857111755535678,hybrid_growth_tqqq_position_scaling,baseline,No extra scaling; use the existing MA200 + ATR staged TQQQ sizing as-is.,QQQ +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,0.0,Full Sample,2018-01-02,2026-04-02,3.39710381670717,0.1967228234457934,-0.3202856721598274,10.874140683764526,0.22699191664610752,0.907461521466919,0.5909389093060463,0.09145426446198583,0.06000653316801401,0.928979706241694,0.7662814888257097,7.243383573213819,0.3533065779734249,0.596693422026575,0.05000000000000001,0.8997591190640056,-0.10845399026601144,0.16140954928439455,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,0.0,2018-2021,2018-01-02,2021-12-31,2.035200560968969,0.3204200014276639,-0.3202856721598274,8.773742487522183,0.26440530405587354,1.1839998490713017,0.7099814314012866,0.12353561695119994,0.2176590432527138,1.0985256126318625,0.9203565211622895,7.339504010277546,0.39352521900102594,0.556474780998974,0.05,0.9262536873156344,,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,0.0,2022,2022-01-03,2022-12-30,-0.10845399026601144,-0.10965810328638503,-0.12171908392726316,11.963623591350231,0.06259573949801955,-1.808910009159374,0.03387920804387443,-0.10157762994270202,0.7299560309434798,0.0,0.17482399066748888,0.7335353185595568,0.015912574067150406,0.9340874259328494,0.05,0.5676470588235294,-0.10845399026601144,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,0.0,2023+,2023-01-03,2026-04-02,0.6249333984411465,0.16140954928439455,-0.18206243350186369,7.860973602655189,0.2079980531592066,0.8263191669077649,0.8166513730103669,-0.047798103997025616,-0.7176560649357311,0.9032998903491934,1.525658873388605,9.15099470170893,0.4074728415619563,0.5425271584380438,0.05,0.8835092348284961,,0.16140954928439455,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,5.0,Full Sample,2018-01-02,2026-04-02,3.2679658377358143,0.19240476802792195,-0.3209738840406271,10.956462327382702,0.22696907315102427,0.8915645887852575,0.5908638537393487,0.08783996960342406,0.042118495286873434,0.9223842048083035,0.7722536448251007,7.243383573213819,0.3533065779734249,0.596693422026575,0.05000000000000001,0.8997591190640056,-0.10877963244601341,0.15611184561134706,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,5.0,2018-2021,2018-01-02,2021-12-31,1.9911766658108268,0.31559915952444495,-0.3209738840406271,8.806594503267243,0.26436970222443906,1.1702971600153889,0.7098638315769003,0.11990228029214917,0.20037405934038793,1.0917681708994946,0.9265152992574218,7.339504010277546,0.39352521900102594,0.556474780998974,0.05,0.9262536873156344,,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,5.0,2022,2022-01-03,2022-12-30,-0.10877963244601341,-0.1099871335096042,-0.12200742455306912,11.99186555068204,0.06263654302149631,-1.8135420387556096,0.033897347548176616,-0.10193533525669467,0.728799514248773,0.0,0.17534891646570275,0.7335353185595568,0.015912574067150406,0.9340874259328494,0.05,0.5676470588235294,-0.10877963244601341,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,5.0,2023+,2023-01-03,2026-04-02,0.6010089774752778,0.15611184561134706,-0.18393279540250984,7.957515622102983,0.20799235185652207,0.8042738667802822,0.8166421696737669,-0.0523855933100213,-0.7516078678715116,0.895464953516533,1.5407873260357359,9.15099470170893,0.4074728415619563,0.5425271584380438,0.05,0.8835092348284961,,0.15611184561134706,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,10.0,Full Sample,2018-01-02,2026-04-02,3.1426068500097086,0.18810181858747477,-0.32166154943154857,11.03916782978893,0.22694776238670628,0.8756585419103469,0.5907887981726514,0.08422567474486223,0.024229466909372062,0.915791655908414,0.7782235752420342,7.243383573213819,0.3533065779734249,0.596693422026575,0.05000000000000001,0.8997591190640056,-0.10910518133597724,0.15083779340528802,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,10.0,2018-2021,2018-01-02,2021-12-31,1.947785956791023,0.310795322246604,-0.32166154943154857,8.839821644515801,0.2643356182449234,1.156584138561568,0.7097462317525142,0.11626894363309842,0.1830855798000972,1.0850138481082463,0.9326717502289991,7.339504010277546,0.39352521900102594,0.556474780998974,0.05,0.9262536873156344,,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,10.0,2022,2022-01-03,2022-12-30,-0.10910518133597724,-0.11031606805740912,-0.12229569458960521,12.020100775303103,0.06267776818756053,-1.818155806280485,0.03391548705247881,-0.10229304057068735,0.7276428088830019,0.0,0.17587369188306687,0.7335353185595568,0.015912574067150406,0.9340874259328494,0.05,0.5676470588235294,-0.10910518133597724,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::boxx,hybrid_tqqq_scaling::trend_score_4_boost::boxx,10.0,2023+,2023-01-03,2026-04-02,0.5774345190634582,0.15083779340528802,-0.18579909431407426,8.054592936193039,0.20798839749747655,0.7822207879348718,0.816632966337167,-0.05697308262301701,-0.7855471354563751,0.8876333958951692,1.5559101182993853,9.15099470170893,0.4074728415619563,0.5425271584380438,0.05,0.8835092348284961,,0.15083779340528802,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",BOXX +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,0.0,Full Sample,2018-01-02,2026-04-02,6.411838610633141,0.27494520183566595,-0.42085772445475156,16.497993254636942,0.3342818090693107,0.8967284799300484,1.3203597809458592,0.04385596029023313,0.7865147484605393,1.5131323253221376,1.4688974809092434,7.0298614881352,0.3394691810109143,0.6105308189890856,0.05000000000000001,0.8997591190640056,-0.36288977222484675,0.3331226678728574,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.5770813192972053,0.46343534909086115,-0.42085772445475156,10.109257765688124,0.3578885387218169,1.2442307112721,1.3801252831624233,0.07688958373545601,1.1700288610355183,1.6240471185974072,1.5234972118802266,6.954528960861724,0.3667578575565947,0.5832421424434053,0.05,0.9262536873156344,,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,0.0,2022,2022-01-03,2022-12-30,-0.36288977222484675,-0.3662621823204174,-0.3891399794559439,28.88046066127116,0.3146880028566705,-1.2793149118907687,0.9724259369444054,-0.06812844874927083,-1.400205717155887,0.9513806498497431,1.0619480859217998,0.7335353185595567,0.01588645418326693,0.934113545816733,0.05,0.5676470588235294,-0.36288977222484675,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,0.0,2023+,2023-01-03,2026-04-02,1.5416909859234882,0.3331226678728574,-0.3142321270620666,9.701339775151517,0.3077971929859977,1.0918385636237167,1.4887796558392665,-0.06440168312959937,0.5170473869999664,1.4861526588973162,2.0815974695200348,9.082260589338373,0.4053738171774096,0.5446261828225905,0.05,0.8835092348284961,,0.3331226678728574,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,5.0,Full Sample,2018-01-02,2026-04-02,6.200571714967527,0.27048211467792327,-0.421216153104769,16.57449334392771,0.3342638181696196,0.8862405457941357,1.3202945970699043,0.04034672396933137,0.7604655645404684,1.5066479770140628,1.4746746154772612,7.0298614881352,0.3394691810109143,0.6105308189890856,0.05000000000000001,0.8997591190640056,-0.3631234799056622,0.3270903097871012,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,5.0,2018-2021,2018-01-02,2021-12-31,3.514183252017242,0.45837469783265905,-0.421216153104769,10.133821530584962,0.3578604312402652,1.2346249212128118,1.3800252708713652,0.0734437763389033,1.1474519204274491,1.6175583679884207,1.5293380274942265,6.954528960861724,0.3667578575565947,0.5832421424434053,0.05,0.9262536873156344,,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,5.0,2022,2022-01-03,2022-12-30,-0.3631234799056622,-0.36649738925265185,-0.38934157993658236,28.90248853684826,0.31469919830298276,-1.280425883013607,0.9724444542900595,-0.06848602410834216,-1.4075985733146248,0.9513806498497431,1.0624494890251421,0.7335353185595567,0.01588645418326693,0.934113545816733,0.05,0.5676470588235294,-0.3631234799056622,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,5.0,2023+,2023-01-03,2026-04-02,1.5045664406954384,0.3270903097871012,-0.31560601686171486,9.779819498332923,0.3077935152523236,1.0770511380414698,1.4887716256318098,-0.06895501227871942,0.4819548024685543,1.478238491843415,2.096448049976104,9.082260589338373,0.4053738171774096,0.5446261828225905,0.05,0.8835092348284961,,0.3270903097871012,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,10.0,Full Sample,2018-01-02,2026-04-02,5.99530530316161,0.2660341799966992,-0.4221142730634563,16.651435093921265,0.33424679531770424,0.8757489462674783,1.3202294131939492,0.03683748764842966,0.734396684447165,1.5001664269807247,1.4804496199452375,7.0298614881352,0.3394691810109143,0.6105308189890856,0.05000000000000001,0.8997591190640056,-0.363357120430144,0.32108466485610654,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,10.0,2018-2021,2018-01-02,2021-12-31,3.4521423731805667,0.45333096197500744,-0.42157440046864814,10.158520144172872,0.3578333142065678,1.2250142313674108,1.3799252585803072,0.06999796894235057,1.1248498349540805,1.611072455586179,1.535176680866585,6.954528960861724,0.3667578575565947,0.5832421424434053,0.05,0.9262536873156344,,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,10.0,2022,2022-01-03,2022-12-30,-0.363357120430144,-0.36673252758204944,-0.3895431308658047,28.924512852686647,0.3147104827905193,-1.2815364125075415,0.9724629716357135,-0.06884359946741353,-1.4149564090647069,0.9513806498497431,1.062950748049375,0.7335353185595567,0.01588645418326693,0.934113545816733,0.05,0.5676470588235294,-0.363357120430144,,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::trend_score_4_boost::qqq,hybrid_tqqq_scaling::trend_score_4_boost::qqq,10.0,2023+,2023-01-03,2026-04-02,1.467980610906233,0.32108466485610654,-0.3169772910868218,9.858562549740096,0.3077910064585205,1.062259324771458,1.488763595424353,-0.07350834142783948,0.4468492617849032,1.4703276881889322,2.1112930990169745,9.082260589338373,0.4053738171774096,0.5446261828225905,0.05,0.8835092348284961,,0.32108466485610654,hybrid_growth_tqqq_position_scaling,trend_score_4_boost,"Use MA20, MA20>MA60, RSI14>55, MACD bullish as a 4-factor score to scale TQQQ while already in-risk.",QQQ +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,0.0,Full Sample,2018-01-02,2026-04-02,3.1124252057669874,0.18704876021969552,-0.2623297622152332,9.124563613488675,0.19862499735406203,0.9653404309715499,0.5038417541759675,0.0940892129431415,-0.0104959481232202,0.827523509919863,0.6399585173301173,6.625117884609417,0.30939611209680606,0.6406038879031939,0.05000000000000001,0.7782863041982105,-0.0838995345529322,0.16162087514884305,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,0.0,2018-2021,2018-01-02,2021-12-31,1.7609782749527154,0.28948679719052417,-0.2623297622152332,7.356031284398107,0.22948934364947932,1.222789758955588,0.59845836781972,0.12086661391270756,0.06761491682621888,0.959534023737625,0.7580544851789723,6.862481673123172,0.3454099844192087,0.6045900155807912,0.05,0.7994837758112092,,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,0.0,2022,2022-01-03,2022-12-30,-0.0838995345529322,-0.08484413878400643,-0.09560035733725158,9.400840387356265,0.050380370988511905,-1.7203348830886487,0.026579090682937553,-0.07752948545525487,0.8134862245111206,0.0,0.13524291654246529,0.430003462603878,0.011905696824358557,0.9380943031756415,0.05,0.40882352941176464,-0.0838995345529322,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,0.0,2023+,2023-01-03,2026-04-02,0.6258928424328116,0.16162087514884305,-0.15433928768812033,6.836944398258654,0.18531604957264636,0.9041929038945166,0.7108899181744911,-0.023660673387110327,-0.7618407901481409,0.8306037522427331,1.3114508682240564,8.25929371928849,0.35647354882368043,0.5935264511763196,0.05,0.7676121372031661,,0.16162087514884305,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,5.0,Full Sample,2018-01-02,2026-04-02,3.0017262833423164,0.18312734613364912,-0.26300754988283637,9.198818608355484,0.1986154273002244,0.9486757628465943,0.5038154377312493,0.09077521489517093,-0.02730021481378847,0.8215928276077349,0.6456517126220439,6.625117884609417,0.30939611209680606,0.6406038879031939,0.05000000000000001,0.7782863041982105,-0.08409453990551363,0.15683884851349816,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,5.0,2018-2021,2018-01-02,2021-12-31,1.7234362409759232,0.28507483166763325,-0.26300754988283637,7.390542075331983,0.22948364698422274,1.2078885756039566,0.5984422772522192,0.11744436535463107,0.05067970515262068,0.9533065035865077,0.7640621944902867,6.862481673123172,0.3454099844192087,0.6045900155807912,0.05,0.7994837758112092,,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,5.0,2022,2022-01-03,2022-12-30,-0.08409453990551363,-0.08504123621899562,-0.09579287199895514,9.41964610031917,0.0503865955429016,-1.7243565537991654,0.02658402105129588,-0.07774113631573167,0.8128131984163529,0.0,0.13555725954422007,0.430003462603878,0.011905696824358557,0.9380943031756415,0.05,0.40882352941176464,-0.08409453990551363,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,5.0,2023+,2023-01-03,2026-04-02,0.6042775989064677,0.15683884851349816,-0.15606305829253042,6.923502500876718,0.18530364052666898,0.8818971493246214,0.7108780882713064,-0.02780019592533471,-0.793039193099514,0.8237649431205925,1.3259568915383375,8.25929371928849,0.35647354882368043,0.5935264511763196,0.05,0.7676121372031661,,0.15683884851349816,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,10.0,Full Sample,2018-01-02,2026-04-02,2.8939968949551647,0.17921850902336445,-0.2636848334640992,9.273416061601583,0.19860724890851203,0.9320029580192174,0.5037891212865311,0.08746121684720032,-0.04410451310527068,0.8156644778840422,0.6513428500736873,6.625117884609417,0.30939611209680606,0.6406038879031939,0.05000000000000001,0.7782863041982105,-0.08428952144856516,0.15207611871717286,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,10.0,2018-2021,2018-01-02,2021-12-31,1.6864005863540266,0.2806774731066266,-0.2636848334640992,7.425329893816249,0.22947940499552766,1.192979090048017,0.5984261866847183,0.11402211679655466,0.03374392959614848,0.9470815498442099,0.7700675511412067,6.862481673123172,0.3454099844192087,0.6045900155807912,0.05,0.7994837758112092,,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,10.0,2022,2022-01-03,2022-12-30,-0.08428952144856516,-0.08523830909507346,-0.0959853631552341,9.438449666994758,0.050393199706046145,-1.72836421123555,0.026588951419654217,-0.07795278717620849,0.8121400140659467,0.0,0.1358715641656996,0.430003462603878,0.011905696824358557,0.9380943031756415,0.05,0.40882352941176464,-0.08428952144856516,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::boxx,hybrid_tqqq_scaling::consensus_score_6::boxx,10.0,2023+,2023-01-03,2026-04-02,0.5829479815268699,0.15207611871717286,-0.15778347852526498,7.010553924068704,0.18529268913602406,0.8595916461745077,0.7108662583681217,-0.03193971846355913,-0.8242314890330742,0.8169286639906519,1.340457858419039,8.25929371928849,0.35647354882368043,0.5935264511763196,0.05,0.7676121372031661,,0.15207611871717286,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,BOXX +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,0.0,Full Sample,2018-01-02,2026-04-02,6.185479614103817,0.2701589031718503,-0.40453558713057625,15.432270250712484,0.3168843102086737,0.915911874798635,1.2622630921258309,0.04559398937579051,0.8315866995303427,1.445497442716378,1.3833530810531152,6.351840658958479,0.29408019192373613,0.6559198080762638,0.05000000000000001,0.7782863041982105,-0.3501458304073689,0.33537666837339297,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.3265010695909334,0.4429530757621791,-0.3900530629688086,9.297265987967709,0.33613499597547397,1.2599402214572843,1.3071423581963484,0.07458550768290861,1.2067442592774844,1.533391426633794,1.41860662732872,6.4033302083320285,0.3169398827865781,0.6330601172134219,0.05,0.7994837758112092,,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,0.0,2022,2022-01-03,2022-12-30,-0.3501458304073689,-0.3534349592041133,-0.3760377013530093,27.451374031004104,0.31206310440858726,-1.2291825123423072,0.9672341323197329,-0.05091157636172357,-1.1549904568711393,0.9513806498497431,1.0346068708030849,0.4300034626038781,0.011508964143426295,0.9384910358565736,0.05,0.40882352941176464,-0.3501458304073689,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,0.0,2023+,2023-01-03,2026-04-02,1.5556597688929323,0.33537666837339297,-0.2988713279178564,9.053361265910539,0.29180853825282527,1.1409067249800118,1.4158872220306855,-0.047932883984804234,0.5610686746092223,1.4349584697185844,1.9286678401124935,8.130003409980178,0.35283210576804663,0.5971678942319534,0.05,0.7676121372031661,,0.33537666837339297,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,5.0,Full Sample,2018-01-02,2026-04-02,5.999965034775191,0.26613641693753354,-0.4052914550085476,15.49701807411644,0.31687836145466786,0.905886760969907,1.2622423260584028,0.04241582395010877,0.8041845852821775,1.4397531918587216,1.3888313523990856,6.351840658958479,0.29408019192373613,0.6559198080762638,0.05000000000000001,0.7782863041982105,-0.350284618685464,0.3299672549938357,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,5.0,2018-2021,2018-01-02,2021-12-31,3.2715839629221772,0.43834590079584856,-0.390359976107979,9.319110340632012,0.3361334166548841,1.250434197195346,1.3071333877278972,0.07139061996820259,1.1821018448760459,1.5275187975471431,1.4242753750497312,6.4033302083320285,0.3169398827865781,0.6330601172134219,0.05,0.7994837758112092,,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,5.0,2022,2022-01-03,2022-12-30,-0.350284618685464,-0.35357467051690716,-0.37617095994713345,27.465833545613023,0.31206532278474086,-1.2298574345749111,0.9672391802740169,-0.0511231867796452,-1.1610363342940995,0.9513806498497431,1.034904631121023,0.4300034626038781,0.011508964143426295,0.9384910358565736,0.05,0.40882352941176464,-0.350284618685464,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,5.0,2023+,2023-01-03,2026-04-02,1.5222247035576868,0.3299672549938357,-0.3001197941680209,9.125673716851056,0.29180252660153305,1.126955521695324,1.4158798567408761,-0.05200875789803011,0.5253430960516513,1.4281174725653842,1.9428312794272282,8.130003409980178,0.35283210576804663,0.5971678942319534,0.05,0.7676121372031661,,0.3299672549938357,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,10.0,Full Sample,2018-01-02,2026-04-02,5.819223712139885,0.2621263024984313,-0.40604643793832085,15.562981707379274,0.3168732037016411,0.8958590344200578,1.262221559990976,0.039237658524426754,0.7767651320303844,1.434011058214996,1.3943076963372765,6.351840658958479,0.29408019192373613,0.6559198080762638,0.05000000000000001,0.7782863041982105,-0.35042339037762893,0.3245793212940751,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,10.0,2018-2021,2018-01-02,2021-12-31,3.2173583727762223,0.4337529630543244,-0.3906667652139231,9.341095256428359,0.3361326942184025,1.240924920177073,1.3071244172594458,0.06819573225349657,1.1574396377766532,1.521648373647847,1.4299420139415493,6.4033302083320285,0.3169398827865781,0.6330601172134219,0.05,0.7994837758112092,,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,10.0,2022,2022-01-03,2022-12-30,-0.35042339037762893,-0.35371436478217433,-0.37630420261615327,27.48029226199164,0.3120676045746556,-1.2305320971613782,0.9672442282283013,-0.051334797197566714,-1.1670608676152723,0.9513806498497431,1.0352023558550358,0.4300034626038781,0.011508964143426295,0.9384910358565736,0.05,0.40882352941176464,-0.35042339037762893,,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::consensus_score_6::qqq,hybrid_tqqq_scaling::consensus_score_6::qqq,10.0,2023+,2023-01-03,2026-04-02,1.489224420603926,0.3245793212940751,-0.3013661405217849,9.19823252421561,0.29179741148620025,1.1130003238997632,1.4158724914510663,-0.05608463181125584,0.4895995967193661,1.4212789413804834,1.9569898159703332,8.130003409980178,0.35283210576804663,0.5971678942319534,0.05,0.7676121372031661,,0.3245793212940751,hybrid_growth_tqqq_position_scaling,consensus_score_6,Use the trend score plus MFI>50 and CCI>0; weaker consensus trims TQQQ more aggressively.,QQQ +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,0.0,Full Sample,2018-01-02,2026-04-02,3.4966666158797324,0.19997652619495376,-0.26446582616574354,9.693726401552611,0.19247789391743925,1.0460182664899078,0.4881351574516755,0.10672802185389652,0.038382304475376855,0.8575916787402195,0.6380078343907194,6.763046494172005,0.306016896344617,0.6439831036553829,0.05000000000000001,0.7854439091534756,-0.08932366050997842,0.16326687610980528,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,0.0,2018-2021,2018-01-02,2021-12-31,2.023010045828052,0.31909035385983886,-0.26446582616574354,7.037426827320785,0.21812682326714516,1.3782384742135116,0.5672324035079763,0.1492155360613867,0.16938211318485635,1.009307701641006,0.7363732013966184,6.673208688755263,0.33666764035165797,0.6133323596483419,0.05,0.803834808259587,,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,0.0,2022,2022-01-03,2022-12-30,-0.08932366050997842,-0.09032627199334842,-0.10287338963952208,10.129396484355137,0.0568635574914572,-1.6226585451346949,0.02854674454024737,-0.08245175755500408,0.7946303716538975,0.0,0.14398645107965952,0.5058864265927978,0.012113353479706927,0.937886646520293,0.05,0.42647058823529405,-0.08932366050997842,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,0.0,2023+,2023-01-03,2026-04-02,0.6333792963167477,0.16326687610980528,-0.16520389649044476,6.953272964503745,0.18514386517935472,0.9125291922705375,0.709532221565404,-0.021907742115619286,-0.7505035944741205,0.8404373160573959,1.3255039167644198,8.81979710004401,0.358622834136022,0.5913771658639781,0.05,0.7770448548812663,,0.16326687610980528,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,5.0,Full Sample,2018-01-02,2026-04-02,3.3729652046625027,0.19592423272267312,-0.26523304122411107,9.773855690038205,0.19249391103224642,1.0283296384719827,0.48816229309868375,0.10333456359543833,0.021091460536908826,0.8515490649979268,0.6438106291880663,6.763046494172005,0.306016896344617,0.6439831036553829,0.05000000000000001,0.7854439091534756,-0.08955164780986946,0.15814954597995912,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,5.0,2018-2021,2018-01-02,2021-12-31,1.9829480553284742,0.3146921929811912,-0.26523304122411107,7.0685090995266435,0.21815407872310164,1.3627925044671894,0.5672932094520908,0.14586726793084623,0.15262272088627216,1.0037154336196703,0.7433608854031372,6.673208688755263,0.33666764035165797,0.6133323596483419,0.05,0.803834808259587,,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,5.0,2022,2022-01-03,2022-12-30,-0.08955164780986946,-0.09055668905642911,-0.10309798477248766,10.151396535280641,0.056868635730845295,-1.6269272560731438,0.028551452319895948,-0.08270113437513035,0.7938394206260632,0.0,0.1443539600288292,0.5058864265927978,0.012113353479706927,0.937886646520293,0.05,0.42647058823529405,-0.08955164780986946,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,5.0,2023+,2023-01-03,2026-04-02,0.6101821831314909,0.15814954597995912,-0.1670143441115478,7.04614342681323,0.18515121293336886,0.8885998457225874,0.70957438775091,-0.026342926887058724,-0.7837044818774985,0.8324420909890619,1.3386904842197742,8.81979710004401,0.358622834136022,0.5913771658639781,0.05,0.7770448548812663,,0.15814954597995912,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,10.0,Full Sample,2018-01-02,2026-04-02,3.252653115948183,0.1918851597873117,-0.26599961763936175,9.854410289172936,0.19251170938830678,1.0106346027716766,0.48818942874569193,0.09994110533698014,0.0038019648481806335,0.8455090842184796,0.6496112147912234,6.763046494172005,0.306016896344617,0.6439831036553829,0.05000000000000001,0.7854439091534756,-0.08977960600884938,0.15305419027616796,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,10.0,2018-2021,2018-01-02,2021-12-31,1.9434120715584955,0.31030814955610864,-0.26599961763936175,7.09990793233527,0.21818302917087365,1.3473399266567196,0.5673540153962054,0.1425189998003057,0.13586402511134676,0.9981255132223351,0.7503456046534537,6.673208688755263,0.33666764035165797,0.6133323596483419,0.05,0.803834808259587,,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,10.0,2022,2022-01-03,2022-12-30,-0.08977960600884938,-0.09078707602930369,-0.10332255123752765,10.173393967489103,0.05687425047623862,-1.6311798173217709,0.028556160099544543,-0.08295051119525669,0.7930482250634171,0.0,0.14472142206817012,0.5058864265927978,0.012113353479706927,0.937886646520293,0.05,0.42647058823529405,-0.08977960600884938,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::boxx,hybrid_tqqq_scaling::overheat_trim::boxx,10.0,2023+,2023-01-03,2026-04-02,0.5873121139585358,0.15305419027616796,-0.16882107252595369,7.139616470287232,0.18516066270851678,0.8646625822567713,0.7096165539364163,-0.030778111658498232,-0.8168885965401927,0.8244504713083566,1.351872403722346,8.81979710004401,0.358622834136022,0.5913771658639781,0.05,0.7770448548812663,,0.15305419027616796,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",BOXX +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,0.0,Full Sample,2018-01-02,2026-04-02,6.641118074983711,0.2796640519103022,-0.4145040927476522,15.968881773538397,0.3155300701081456,0.9420560910791974,1.2576091098445343,0.05350491756714982,0.9030295721598245,1.4709174929679292,1.3886601658960511,6.583965023541461,0.29519486818748947,0.6548051318125105,0.05000000000000001,0.7854439091534756,-0.35367699384535034,0.3367729402613333,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,0.0,2018-2021,2018-01-02,2021-12-31,3.6103274401372465,0.4660892322345924,-0.3911150537131589,9.246555346028039,0.3326854549233189,1.3171034962689705,1.2957225725040589,0.09230504413372183,1.3585717748712585,1.5734500671923852,1.4134874690622181,6.365453082679136,0.31570856981422024,0.6342914301857798,0.05,0.803834808259587,,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,0.0,2022,2022-01-03,2022-12-30,-0.35367699384535034,-0.3569894978037502,-0.38030678585015365,27.920580599967966,0.313122006778992,-1.241359729497936,0.9689239357095939,-0.05544492358681314,-1.1586652841128378,0.9513806498497431,1.0421827292431167,0.5058864265927977,0.012106573705179284,0.9378934262948208,0.05,0.42647058823529405,-0.35367699384535034,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,0.0,2023+,2023-01-03,2026-04-02,1.5643395120387131,0.3367729402613333,-0.3045841097391988,9.079764366371911,0.29256402932279124,1.1422874686797955,1.41850308314138,-0.04737062313513665,0.5670613791697541,1.446029631249991,1.9483205806335038,8.743528779137572,0.3570075684026002,0.5929924315973999,0.05,0.7770448548812663,,0.3367729402613333,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,5.0,Full Sample,2018-01-02,2026-04-02,6.4364344400927225,0.27545750841980166,-0.41534120423182674,16.042875763009697,0.3155393785194357,0.9315748302323063,1.2576314245799898,0.050202111173413125,0.8741211009143203,1.464889607356294,1.3941779516897868,6.583965023541461,0.29519486818748947,0.6548051318125105,0.05000000000000001,0.7854439091534756,-0.35383928781594765,0.33094438992260966,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,5.0,2018-2021,2018-01-02,2021-12-31,3.552035138841073,0.4614264687663838,-0.39151344876793914,9.26935161643718,0.3327032465399751,1.307479896078842,1.2957722015702773,0.08911342667982211,1.3331074831998042,1.5679529556794825,1.4199021428541265,6.365453082679136,0.31570856981422024,0.6342914301857798,0.05,0.803834808259587,,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,5.0,2022,2022-01-03,2022-12-30,-0.35383928781594765,-0.35715286062216334,-0.3804623929867079,27.937526657745078,0.3131241587908872,-1.2421527842273794,0.9689287415631537,-0.055694266675355174,-1.1650232935184084,0.9513806498497431,1.0425309193420749,0.5058864265927977,0.012106573705179284,0.9378934262948208,0.05,0.42647058823529405,-0.35383928781594765,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,5.0,2023+,2023-01-03,2026-04-02,1.528241752090897,0.33094438992260966,-0.30592060038997093,9.154724342842593,0.29257280989762335,1.1272634556801047,1.4185466159365765,-0.05176792077126991,0.5288860481734244,1.4379426329924039,1.9612649410305592,8.743528779137572,0.3570075684026002,0.5929924315973999,0.05,0.7770448548812663,,0.33094438992260966,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,10.0,Full Sample,2018-01-02,2026-04-02,6.237211820803569,0.271264326892225,-0.41617720506609235,16.117315222329594,0.315549709171179,0.9210912038267959,1.2576537393154448,0.04689930477967656,0.8451991990046309,1.458864286298888,1.3996937091293693,6.583965023541461,0.29519486818748947,0.6548051318125105,0.05000000000000001,0.7854439091534756,-0.3540015609989009,0.32514064102932316,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,10.0,2018-2021,2018-01-02,2021-12-31,3.49447316712436,0.4567779903508098,-0.3919116298469213,9.292246941362562,0.3327220314420737,1.2978534505617896,1.2958218306364957,0.08592180922592244,1.3076255251107758,1.5624580661652512,1.426314236674829,6.365453082679136,0.31570856981422024,0.6342914301857798,0.05,0.803834808259587,,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,10.0,2022,2022-01-03,2022-12-30,-0.3540015609989009,-0.3573162020330658,-0.3806179801921098,27.95447178340572,0.31312640834965727,-1.2429454408466498,0.9689335474167133,-0.055943609763897235,-1.1713558236834978,0.9513806498497431,1.0428790648426343,0.5058864265927977,0.012106573705179284,0.9378934262948208,0.05,0.42647058823529405,-0.3540015609989009,,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ +hybrid_tqqq_scaling::overheat_trim::qqq,hybrid_tqqq_scaling::overheat_trim::qqq,10.0,2023+,2023-01-03,2026-04-02,1.4926483991462933,0.32514064102932316,-0.3072546686834331,9.229942094479709,0.29258291094545813,1.112235324725569,1.4185901487317725,-0.05616521840740303,0.4907013111418024,1.4298592346511745,1.9742047872616364,8.743528779137572,0.3570075684026002,0.5929924315973999,0.05,0.7770448548812663,,0.32514064102932316,hybrid_growth_tqqq_position_scaling,overheat_trim,"Keep baseline size unless the setup looks overbought or weakening, then trim in steps.",QQQ diff --git a/research/results/tqqq_hybrid_position_scaling_followup_recommendation.json b/research/results/tqqq_hybrid_position_scaling_followup_recommendation.json new file mode 100644 index 0000000..0aca54e --- /dev/null +++ b/research/results/tqqq_hybrid_position_scaling_followup_recommendation.json @@ -0,0 +1,26 @@ +{ + "baseline_growth_reference": { + "idle_asset": "QQQ", + "oos_cagr": 0.3865033426282003, + "oos_max_drawdown": -0.3211199338433649, + "oos_ulcer": 9.612987986459109, + "oos_ir_vs_qqq": 0.751374065832975 + }, + "baseline_defensive_reference": { + "idle_asset": "BOXX", + "oos_cagr": 0.23946594420737966, + "oos_max_drawdown": -0.2011224879236717, + "oos_ulcer": 7.500255198481181 + }, + "best_scaled_candidate": { + "scaling": "consensus_score_6", + "idle_asset": "QQQ", + "oos_cagr": 0.3299672549938357, + "oos_max_drawdown": -0.3001197941680209, + "oos_ulcer": 9.125673716851056, + "oos_ir_vs_qqq": 0.5253430960516513, + "turnover_per_year": 8.130003409980178, + "average_scale_while_invested": 0.7676121372031661 + }, + "verdict": "No tested scaling rule clearly upgrades the current baseline. The score-based variants smooth drawdown a bit, but the gain mostly comes from carrying less TQQQ and paying materially more turnover." +} \ No newline at end of file diff --git a/research/results/tqqq_hybrid_position_scaling_followup_summary.md b/research/results/tqqq_hybrid_position_scaling_followup_summary.md new file mode 100644 index 0000000..c8f4058 --- /dev/null +++ b/research/results/tqqq_hybrid_position_scaling_followup_summary.md @@ -0,0 +1,46 @@ +# TQQQ position-scaling follow-up + +## Setup +- Keep the existing MA200 + ATR TQQQ entry/exit framework. +- Change only the TQQQ position size while already invested. +- Compare two idle assets: `BOXX` and `QQQ`. +- Goal: see whether smoother in-position scaling creates a smoother equity curve without obviously killing CAGR. + +## OOS 2023+ (5 bps) +| 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 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| baseline | BOXX | 0.239466 | -0.201122 | 7.500255 | -0.172266 | -0.029705 | 1.241687 | 0.458291 | 1.000000 | +| baseline | QQQ | 0.386503 | -0.321120 | 9.612988 | 0.751374 | -0.052876 | 1.142013 | 0.456134 | 1.000000 | +| consensus_score_6 | BOXX | 0.156839 | -0.156063 | 6.923503 | -0.793039 | -0.027800 | 8.259294 | 0.356474 | 0.767612 | +| consensus_score_6 | QQQ | 0.329967 | -0.300120 | 9.125674 | 0.525343 | -0.052009 | 8.130003 | 0.352832 | 0.767612 | +| overheat_trim | BOXX | 0.158150 | -0.167014 | 7.046143 | -0.783704 | -0.026343 | 8.819797 | 0.358623 | 0.777045 | +| overheat_trim | QQQ | 0.330944 | -0.305921 | 9.154724 | 0.528886 | -0.051768 | 8.743529 | 0.357008 | 0.777045 | +| trend_score_4_boost | BOXX | 0.156112 | -0.183933 | 7.957516 | -0.751608 | -0.052386 | 9.150995 | 0.407473 | 0.883509 | +| trend_score_4_boost | QQQ | 0.327090 | -0.315606 | 9.779819 | 0.481955 | -0.068955 | 9.082261 | 0.405374 | 0.883509 | + +## Full Sample (5 bps) +| scaling | idle_asset | CAGR | Max Drawdown | Ulcer Index | Information Ratio vs QQQ | Turnover/Year | Average TQQQ Weight | Average Scale While Invested | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| baseline | BOXX | 0.221714 | -0.454508 | 12.311460 | 0.216285 | 1.272629 | 0.394916 | 1.000000 | +| baseline | QQQ | 0.284186 | -0.499827 | 17.100177 | 0.746534 | 1.242602 | 0.378650 | 1.000000 | +| consensus_score_6 | BOXX | 0.183127 | -0.263008 | 9.198819 | -0.027300 | 6.625118 | 0.309396 | 0.778286 | +| consensus_score_6 | QQQ | 0.266136 | -0.405291 | 15.497018 | 0.804185 | 6.351841 | 0.294080 | 0.778286 | +| overheat_trim | BOXX | 0.195924 | -0.265233 | 9.773856 | 0.021091 | 6.763046 | 0.306017 | 0.785444 | +| overheat_trim | QQQ | 0.275458 | -0.415341 | 16.042876 | 0.874121 | 6.583965 | 0.295195 | 0.785444 | +| trend_score_4_boost | BOXX | 0.192405 | -0.320974 | 10.956462 | 0.042118 | 7.243384 | 0.353307 | 0.899759 | +| trend_score_4_boost | QQQ | 0.270482 | -0.421216 | 16.574493 | 0.760466 | 7.029861 | 0.339469 | 0.899759 | + +## 2022 (5 bps) +| scaling | idle_asset | Total Return | 2022 Return | Max Drawdown | Ulcer Index | Turnover/Year | +| --- | --- | --- | --- | --- | --- | --- | +| baseline | BOXX | -0.161162 | -0.161162 | -0.173794 | 17.021365 | 0.512380 | +| baseline | QQQ | -0.387752 | -0.387752 | -0.412978 | 31.478236 | 0.505886 | +| consensus_score_6 | BOXX | -0.084095 | -0.084095 | -0.095793 | 9.419646 | 0.430003 | +| consensus_score_6 | QQQ | -0.350285 | -0.350285 | -0.376171 | 27.465834 | 0.430003 | +| overheat_trim | BOXX | -0.089552 | -0.089552 | -0.103098 | 10.151397 | 0.505886 | +| overheat_trim | QQQ | -0.353839 | -0.353839 | -0.380462 | 27.937527 | 0.505886 | +| trend_score_4_boost | BOXX | -0.108780 | -0.108780 | -0.122007 | 11.991866 | 0.733535 | +| trend_score_4_boost | QQQ | -0.363123 | -0.363123 | -0.389342 | 28.902489 | 0.733535 | + +## Recommendation +- No tested scaling rule clearly upgrades the current baseline. The score-based variants smooth drawdown a bit, but the gain mostly comes from carrying less TQQQ and paying materially more turnover. diff --git a/tests/test_hybrid_growth_continuous_scaling_followup.py b/tests/test_hybrid_growth_continuous_scaling_followup.py new file mode 100644 index 0000000..7055134 --- /dev/null +++ b/tests/test_hybrid_growth_continuous_scaling_followup.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +import importlib.util +import sys +from pathlib import Path + +import pandas as pd + +MODULE_PATH = Path(__file__).resolve().parents[1] / "research" / "backtest_hybrid_growth_continuous_scaling_followup.py" +spec = importlib.util.spec_from_file_location("tqqq_continuous_followup", MODULE_PATH) +module = importlib.util.module_from_spec(spec) +assert spec and spec.loader +sys.modules[spec.name] = module +spec.loader.exec_module(module) + + +def test_continuous_scale_boosts_above_ma20(): + row = pd.Series({"close": 104.0, "ma20": 100.0}) + assert module.continuous_scale("ma20_gap_linear", row) == 1.15 + + +def test_continuous_scale_trims_below_ma20(): + row = pd.Series({"close": 94.0, "ma20": 100.0}) + assert round(module.continuous_scale("ma20_gap_linear", row), 4) == 0.6625 + + +def test_trim_only_never_boosts_above_one(): + above = pd.Series({"close": 104.0, "ma20": 100.0}) + below = pd.Series({"close": 94.0, "ma20": 100.0}) + assert module.continuous_scale("ma20_gap_trim_only", above) == 1.0 + assert round(module.continuous_scale("ma20_gap_trim_only", below), 4) == 0.6625 + + +def test_recommendation_keys_present(): + sample = pd.DataFrame([ + {"period": "2023+", "cost_bps_one_way": 5.0, "scaling": "baseline", "idle_asset": "QQQ", "CAGR": 0.38, "Max Drawdown": -0.32, "Ulcer Index": 9.6, "Information Ratio vs QQQ": 0.75, "Turnover/Year": 1.1}, + {"period": "2023+", "cost_bps_one_way": 5.0, "scaling": "baseline", "idle_asset": "BOXX", "CAGR": 0.24, "Max Drawdown": -0.20, "Ulcer Index": 7.5, "Information Ratio vs QQQ": -0.17, "Turnover/Year": 1.2}, + {"period": "2023+", "cost_bps_one_way": 5.0, "scaling": "ma20_gap_trim_only", "idle_asset": "QQQ", "CAGR": 0.35, "Max Drawdown": -0.30, "Ulcer Index": 9.0, "Information Ratio vs QQQ": 0.70, "Alpha Ann vs QQQ": -0.02, "Turnover/Year": 2.0, "Average Scale While Invested": 0.95}, + ]) + rec = module.build_recommendation(sample) + assert rec["baseline_growth_reference"]["idle_asset"] == "QQQ" + assert rec["baseline_defensive_reference"]["idle_asset"] == "BOXX" + assert rec["continuous_candidate"]["idle_asset"] == "QQQ" + assert rec["continuous_candidate"]["scaling"] == "ma20_gap_trim_only" diff --git a/tests/test_hybrid_growth_idle_throttle_followup.py b/tests/test_hybrid_growth_idle_throttle_followup.py new file mode 100644 index 0000000..c6cb38e --- /dev/null +++ b/tests/test_hybrid_growth_idle_throttle_followup.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +import importlib.util +import sys +from pathlib import Path + +import pandas as pd + +MODULE_PATH = Path(__file__).resolve().parents[1] / 'research' / 'backtest_hybrid_growth_idle_throttle_followup.py' +spec = importlib.util.spec_from_file_location('tqqq_followup', MODULE_PATH) +module = importlib.util.module_from_spec(spec) +assert spec and spec.loader +sys.modules[spec.name] = module +spec.loader.exec_module(module) + + +def test_throttle_multiplier_halves_only_below_ma60(): + row = pd.Series({'close': 100.0, 'ma60': 105.0}) + assert module.throttle_multiplier('ma60_half', row) == 0.5 + row2 = pd.Series({'close': 106.0, 'ma60': 105.0}) + assert module.throttle_multiplier('ma60_half', row2) == 1.0 + + +def test_markdown_table_has_headers(): + frame = pd.DataFrame([{'a': 1, 'b': 2}]) + text = module.base.frame_to_markdown_table(frame) + assert '| a | b |' in text + assert '| --- | --- |' in text + + +def test_recommendation_shape(): + sample = pd.DataFrame([ + {'period': '2023+', 'cost_bps_one_way': 5.0, 'throttle': 'baseline', 'idle_asset': 'QQQ', 'CAGR': 0.3, 'Max Drawdown': -0.3, 'Information Ratio vs QQQ': 0.7, 'Alpha Ann vs QQQ': 0.0, '2022 Return': -0.4}, + {'period': '2023+', 'cost_bps_one_way': 5.0, 'throttle': 'baseline', 'idle_asset': 'BOXX', 'CAGR': 0.2, 'Max Drawdown': -0.2, 'Information Ratio vs QQQ': -0.1, 'Alpha Ann vs QQQ': 0.0, '2022 Return': -0.16}, + {'period': '2023+', 'cost_bps_one_way': 5.0, 'throttle': 'ma60_half', 'idle_asset': 'BOXX', 'CAGR': 0.1, 'Max Drawdown': -0.15, 'Information Ratio vs QQQ': -0.3, 'Alpha Ann vs QQQ': 0.0, '2022 Return': -0.06}, + ]) + rec = module.build_recommendation(sample) + assert rec['best_baseline_by_cagr']['idle_asset'] == 'QQQ' + assert rec['safest_baseline_idle_asset']['idle_asset'] == 'BOXX' + assert rec['best_throttle_candidate']['idle_asset'] == 'BOXX' diff --git a/tests/test_hybrid_growth_indicator_variants.py b/tests/test_hybrid_growth_indicator_variants.py new file mode 100644 index 0000000..fcbc11b --- /dev/null +++ b/tests/test_hybrid_growth_indicator_variants.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +import importlib.util +import sys +from pathlib import Path + +import pandas as pd + + +MODULE_PATH = Path(__file__).resolve().parents[1] / "research" / "backtest_hybrid_growth_indicator_variants.py" +spec = importlib.util.spec_from_file_location("tqqq_variants", MODULE_PATH) +module = importlib.util.module_from_spec(spec) +assert spec and spec.loader +sys.modules[spec.name] = module +spec.loader.exec_module(module) + + +def test_confirmation_gate_respects_entry_and_exit_streaks(): + raw = pd.Series([False, True, True, True, False, False, True]) + active = module.apply_confirmation_gate(raw, entry_confirm_days=2, exit_confirm_days=2) + assert active.tolist() == [False, False, True, True, True, False, False] + + +def test_build_target_weights_allocates_idle_to_selected_asset(): + weights = module.build_target_weights( + current_equity=100.0, + target_tqqq_value=30.0, + idle_value=65.0, + reserved_value=5.0, + idle_asset="QQQ", + ) + assert weights == {"TQQQ": 0.3, "QQQ": 0.65, "CASH": 0.05} + + cash_weights = module.build_target_weights( + current_equity=100.0, + target_tqqq_value=30.0, + idle_value=65.0, + reserved_value=5.0, + idle_asset="CASH", + ) + assert cash_weights == {"TQQQ": 0.3, "CASH": 0.7} + + +def test_result_files_are_written(tmp_path): + comparison = pd.DataFrame([{"a": 1}]) + comparison_path = tmp_path / "comparison.csv" + comparison.to_csv(comparison_path, index=False) + recommendation_path = tmp_path / "recommendation.json" + recommendation_path.write_text('{"ok": true}', encoding="utf-8") + summary_path = tmp_path / "summary.md" + summary_path.write_text("# ok\n", encoding="utf-8") + + assert comparison_path.read_text(encoding="utf-8").strip() + assert recommendation_path.read_text(encoding="utf-8").strip() + assert summary_path.read_text(encoding="utf-8").strip() diff --git a/tests/test_hybrid_growth_position_scaling_followup.py b/tests/test_hybrid_growth_position_scaling_followup.py new file mode 100644 index 0000000..3ef314f --- /dev/null +++ b/tests/test_hybrid_growth_position_scaling_followup.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +import importlib.util +import sys +from pathlib import Path + +import pandas as pd + +MODULE_PATH = Path(__file__).resolve().parents[1] / 'research' / 'backtest_hybrid_growth_position_scaling_followup.py' +spec = importlib.util.spec_from_file_location('tqqq_scaling_followup', MODULE_PATH) +module = importlib.util.module_from_spec(spec) +assert spec and spec.loader +sys.modules[spec.name] = module +spec.loader.exec_module(module) + + +def test_trend_score_boost_scaling_mapping(): + row = pd.Series({ + 'close': 110.0, 'ma20': 100.0, 'ma60': 90.0, + 'rsi14': 60.0, 'macd_line': 1.0, 'macd_signal': 0.5, + 'mfi14': 55.0, 'cci20': 10.0, 'bias20': 0.02, + 'weekly_k': 60.0, 'weekly_d': 50.0, 'weekly_j': 70.0, + }) + assert module.scaling_multiplier('trend_score_4_boost', row) == 1.15 + + +def test_overheat_trim_reduces_size(): + row = pd.Series({ + 'close': 110.0, 'ma20': 100.0, 'ma60': 95.0, + 'rsi14': 80.0, 'macd_line': 1.0, 'macd_signal': 0.5, + 'mfi14': 60.0, 'cci20': 15.0, 'bias20': 0.09, + 'weekly_k': 65.0, 'weekly_d': 55.0, 'weekly_j': 75.0, + }) + assert module.scaling_multiplier('overheat_trim', row) == 0.75 + + +def test_recommendation_returns_expected_keys(): + sample = pd.DataFrame([ + {'period': '2023+', 'cost_bps_one_way': 5.0, 'scaling': 'baseline', 'idle_asset': 'QQQ', 'CAGR': 0.38, 'Max Drawdown': -0.32, 'Ulcer Index': 10.0, 'Information Ratio vs QQQ': 0.75, 'Alpha Ann vs QQQ': -0.05, 'Turnover/Year': 1.1, 'Average Scale While Invested': 1.0}, + {'period': '2023+', 'cost_bps_one_way': 5.0, 'scaling': 'baseline', 'idle_asset': 'BOXX', 'CAGR': 0.24, 'Max Drawdown': -0.20, 'Ulcer Index': 7.0, 'Information Ratio vs QQQ': -0.17, 'Alpha Ann vs QQQ': -0.03, 'Turnover/Year': 1.2, 'Average Scale While Invested': 1.0}, + {'period': '2023+', 'cost_bps_one_way': 5.0, 'scaling': 'trend_score_4_boost', 'idle_asset': 'QQQ', 'CAGR': 0.34, 'Max Drawdown': -0.28, 'Ulcer Index': 8.0, 'Information Ratio vs QQQ': 0.60, 'Alpha Ann vs QQQ': -0.03, 'Turnover/Year': 2.0, 'Average Scale While Invested': 0.9}, + ]) + rec = module.build_recommendation(sample) + assert rec['baseline_growth_reference']['idle_asset'] == 'QQQ' + assert rec['baseline_defensive_reference']['idle_asset'] == 'BOXX' + assert rec['best_scaled_candidate']['idle_asset'] == 'QQQ'