In the past, we have tested TQQQ/UPRO on simulation data and real data. Today, I encountered an interesting video talking about using volatility indicators to decide when to hold leveraged ETFs. Here, I am just recording its link and its main result. We may come back and add more discussions in the future.

Update 2024-07-08
Personally, I don’t completely trust volatility indicators that much. I prefer staying in the market with a right re-balance strategy. I see a strategy online, which is about rebalancing between TQQQ and BTLA (an ETF aiming for stability) annually to weather extreme volatility. When backtesting on last 3~5 years, this strategy seems to outperform holding TQQQ alone. Here is more analysis.
I created 3 portfolios, where portfolio 1=holding TQQQ 100%, portfolio 2=holding 50% TQQQ and 50% BTLA, and portfolio 3=holding 70% TQQQ and 30% BTAL. We can see that portfolio 3 has similar performance with portfolio 1 while having about half volatility. Portfolio 2 is more stable but also less return overall.


However, portfolio 3 still has -47.32% worst year and -48.10% max drawdown. So next I am trying different ratios between TQQQ and BTLA. In the new comparison, portfolio 1= 70% TQQQ and 30% BTAL, portfolio 2=65% TQQQ and 35% BTAL, portfolio 3=60% TQQQ and 40% BTAL.


But we see that we have to trade stability with return. Personally, my comfortable ratio of TQQQ is between 65%~70% because the max drawdown is less than 50%, some threshold I can bare with.
I also find some alternative to BTAL because its return is too flat. I believe JEPI is a better option because it has monthly dividend to grow itself. hence much higher total return over long term. The largest drawdown of JEPI is about 1-125/140=10%, while that of BTAL is even higher 1-75/87=14%.

To conclude, I’ll stick to 65% TQQQ and 35% JEPI in the future to have a good return and stability balance.
The portfolio backtest tool I used is available at https://valueinvesting.io/backtest-portfolio
Update 2025-05-11:
I saw another post saying other good volatility indicators are moving average 200 and CNN Fear & Greedy Index: https://seekingalpha.com/article/4699905-tqqq-two-ways-to-tame-the-volatility-and-capture-far-more-upside
Update 2025-08-13:
In practice, the re-balance strategy or moving-average-200 strategy will be expensive in execution because of long-term/short-term capital gain tax. Personally, I would favor an approximate re-balance strategy in which we never sell stocks and only choose either of the two stocks to pour DCA money into. So I wrote a simple script to test this approximate rebalance strategy, with different target ratios between TQQQ:SPY.
</p>
# https://stockcharts.com/h-sc/ui
import yfinance as yf
TICK_RATIO = 0.5
def my_stock_return(tick):
stock = yf.Ticker(tick)
stock_hist = stock.history(start="2018-04-01", end="2025-08-13")
spy = yf.Ticker("SPY")
spy_hist = spy.history(start="2018-04-01", end="2025-08-13")
days = 0
total_tick_share = 0
total_spy_share = 0
single_invest = 3000
total_invest = 0
total_invest_time = 0
total_tick_value = 0.01
total_spy_value = 0.01
max_value = 0
max_drawback = 0
for a, b in zip(stock_hist.iterrows(), spy_hist.iterrows()):
idx, row = a
_, spy_row = b
if days % 10 != 0:
days += 1
continue
total_invest += single_invest
total_invest_time += 1
if total_tick_value / (total_tick_value + total_spy_value) < TICK_RATIO:
single_tick_share = single_invest / row['Open']
total_tick_share += single_tick_share
else:
single_spy_share = single_invest / spy_row['Open']
total_spy_share += single_spy_share
total_tick_value = total_tick_share * row['Close']
total_spy_value = total_spy_share * spy_row['Close']
total_value = total_tick_value + total_spy_value
if total_value > max_value:
max_value = total_value
drawback = (max_value - total_value) / max_value * 100
if drawback > max_drawback:
max_drawback = drawback
days += 1
total_tick_value = total_tick_share * stock_hist.iloc[-1]["Close"]
total_spy_value = total_spy_share * spy_hist.iloc[-1]["Close"]
total_value = total_tick_value + total_spy_value
print(f"tick={tick}")
print(f"days: {days}")
print(f'last day close: {stock_hist.iloc[-1]["Close"]}')
print(f"total_tick_share: {total_tick_share}")
print(f"total_spy_share: {total_spy_share}")
print(f'total_tick_value = total_share * last day close: {total_tick_value}')
print(f'total_spy_value = total_share * last day close: {total_spy_value}')
print(f"total_value = total_tick_value + total_spy_value: {total_value}")
print(f"total_invest: {total_invest}, total_invest_time: {total_invest_time}")
print(f"total gain: {(total_value / total_invest - 1) * 100}%")
print(f"max drawback: {max_drawback}%")
my_stock_return("TQQQ")
print("\n")
<p>Here is the result:
- Period: 2018-04-01 ~ 2025-08-13
- TQQQ:SPY=0:100. Total gain: 80%, Max drawdown: 23%
- TQQQ:SPY=40:60. Total gain: 163%, Max drawdown: 45%
- TQQQ:SPY=50:50. Total gain: 178%, Max drawdown: 50%
- TQQQ:SPY=60:40. Total gain: 192%, Max drawdown: 54%
- TQQQ:SPY=70:30. Total gain: 208%, Max drawdown: 58%
- TQQQ:SPY=80:20. Total gain: 224%, Max drawdown: 64%
- TQQQ:SPY=100:0. Total gain: 257%, Max drawdown: 76%
- (Baesline) QLD:SPY=100:0. Total gain: 210%, Max drawdown: 55%
- Period: 2015-04-01 ~ 2025-08-13
- TQQQ:SPY=0:100. Total gain: 125%, Max drawdown: 27%
- TQQQ:SPY=40:60. Total gain: 299%, Max drawdown: 54%
- TQQQ:SPY=50:50. Total gain:344%, Max drawdown: 60%
- TQQQ:SPY=60:40. Total gain: 395%, Max drawdown: 64%
- TQQQ:SPY=70:30. Total gain: 450%, Max drawdown: 68%
- TQQQ:SPY=80:20. Total gain: 509%, Max drawdown: 71%
- TQQQ:SPY=100:0. Total gain: 662%, Max drawdown: 79%
- (Baesline) QLD:SPY=100:0. Total gain: 457%, Max drawdown: 58%
Note that, if you have accumulated so much total value and your DCA money becomes so little relative to the total value, then this approximate rebalance strategy will be essentially the same as not rebalancing. So some manual rebalancing (and consequently some tax occurred) is still necessary at that point. Ultimately, when you have accumulated so much total value, I expect we should still rely on annually/semi-annually manual rebalancing as described in 2024-07-08 update. If you look at our baseline, which purely invested in QLD (2x leveraged QQQ), you can find it can achieve better gain with similar drawdown as the corresponding TQQQ:SPY ratio. This again illustrates that the approximate rebalance strategy I am implementing here is not optimal.
I am relying on https://valueinvesting.io/backtest-portfolio to re-test the semi-annually rebalancing strategy.
- From Jan 2013 – July 2025, initial money is 10K, then invest 5K every month (inflation adjusted), rebalance semi-annually
- 100% TQQQ. Final balance: 11M, max drawdown: 78%
- TQQQ:SPY=80:20. Final balance: 10.6M, max drawdown: 66%
- TQQQ:SPY=70:30. Final balance: 9.6M, max drawdown: 60%
- TQQQ:SPY=60:40. Final balance: 8.3M, max drawdown: 54%
- TQQQ:SPY=50:50. Final balance: 7M, max drawdown: 49%
- 100% QLD. Final balance: 7M, max drawdown: 59%
This time, we can see that the real rebalance strategy (TQQQ:SPY=60:40) can outperform buying 100% QLD with similar max drawdown.
On the other hand, we could apply any re-balance or moving-average-200 strategy without worrying about tax in tax-advantaged accounts like 401k. I take an additional investigation on how good the moving-average-200 strategy is (i.e., sell all TQQQ shares if Nasdaq index is below MA200 and only buy TQQQ if Nasdaq index is above MA200). The result is this strategy will reduce max drawdown while keeping he same net profit. But this strategy seems only overfitted to TQQQ – if I test on UPRO, this strategy is far worse.