Intro
Superior algo returns can be thought of as being the result of two components: a great strategy regarding ‘what stocks to buy’ (the stock selection component, SEL) and a ‘clever timing’ (the in & out component, I/O) regarding when we are ‘in’ the market and hold the stocks versus when we are ‘out’ of the market and hold alternative assets such as bonds. We often focus on optimizing SEL and tend to neglect I/O; thus, for an important discussion of recent I/O tactics, see here.
Focus of this thread: Optimal SEL + I/O combinations
It is worthwhile to separately optimize SEL and I/O. However, the ultimate total return will also be determined by a certain synergy or dissonance between the two components. So, it seems that we won’t get around the arduous task of individually testing (all possible) combinations to identify optimal SEL + I/O pairs, which is the eventual focus of this thread. I reckon a preparatory step can be to dig up all the hidden SEL and I/O treasures from this forum and beyond to see what inputs are available for the combinations.
Ultimate objective
Let's get rich together, why not?
Peter Guenther
(Simplified) Demonstration of concept: SEL[“QQQ”] + I/O[“In & Out”]
In the following backtest, I combine a simple tech stock selection strategy, via buying the QQQ ETF, with the 3 Nov 2020 version of the “In & Out” strategy, which is one possible in & out-type tactic (see the In & Out thread for more tactics; link above). The backtest is from 1 Jan 2008 to 30 Oct 2020. The total return is 1,723%.
The components seem to integrate nicely: the QQQ alone (no in & out) would have yielded about 515% during the backtest period, while the In & Out strategy without a tech selection (only holding the market, SPY) would have resulted in about 1,100%.
Peter Guenther
And an additional (simplified) application, combining a yet more specific tech stock selection, the semiconductor industry, with the In & Out algo. Below are the specs for the same backtest period as above.
SEL[“SOXX”] + I/O[“In & Out”]
Total return: 1,686%
SOXX alone (i.e., always in): 559%
Implications
The In & Out combines slightly better with the QQQ selection (see above) than the SOXX selection, improving the returns from 515% to 1,723% versus from 559% to 1,686%.
Nathan Swenson
Just messing around with Flex4 QQQ version. Changing TLT and IEF to TMF and TYD pumps results up to 3539% return.
Peter Guenther
Nathan Swenson: Absolutely, and great point! If we really trust our strategy, leveraged products, such as the 3 x leveraged bond ETFs, can substantially boost returns. In the attached backtest, I have taken it one step further and used 3 x leverage for all holdings, the 'in' side and the 'out' side. Of course, one would not put all the money on a highly leveraged strategy like this. The max drawdown is 50%+, so this can be psychologically quite distressing. It may be something for a (small) portion of one's total investment, if one feels comfortable with leveraged products.
3 x leveraged SEL[“QQQ”] + I/O[“In & Out”]
'In' holdings: TQQQ
'Out' holdings: TMF, TYD (as per Nathan's test above)
Total returns: 21,882%
Note: The In & Out is the latest 'lazy trader edition', reducing the total number of trades from above 3,000 (see in the QQQ version above) to 207 ... 207 glorious trades to get us to the 20,000%+ :)
As always, for details regarding the latest versions of I/O strategies, see our discussion here.
Nathan Swenson
Wow! Well, I wouldn't likely use TQQQ due to the decay, For bonds, my thinking is that holding period is shorter and they should be less volatile resulting in less decay. Anyway, that was my thinking. Those results are amazing!
Matthew Wormington
Per comments made in the other "In and Out" thread, perhaps the risk-off asset selection is at least as critical as the risk-on asset selcetion to provide good performance in the future.
Mateusz Pulka
Peter Guenther
If may I ask about your last algo.
You set symbol for long order:
self.HLD_IN = {self.STKS: 1}
but in the code when you want to send an order to market you have:
wt[self.MRKT] = 1
Is it a mistake or is it right? Cause HLD_IN parameter suggests that here you should have:
wt[self.STKS] = 1
By the way:
Great work with algorith.
Joshua Tsai
You can use TIPS instead of bonds (to slightly reduce returns, but it's widely applicable). Then again, the US gov's only option during bad economic times is to lower rates, and it's very unlikely the Fed would decrease rates as a section of the economy was faltering. I've also looked into going long volatility during market downturns, but it hasn't worked well.
I've attached the global ETF rotation strategy that was modified from the tutorial one on Quantconnect.
Peter Guenther
gpw radar Thanks for joining this thread and well spotted! This looks like a bug from combining the In & Out with the QQQ stock selection; will post an update soon.
Joshua Tsai
Using TIPs we achieve similar returns, but the Sharpe is much worse.
Peter Guenther
Corrected: 3 x leveraged SEL[“QQQ”] + I/O[“In & Out”]
'In' holdings: TQQQ
'Out' holdings: TMF, TYD (as per Nathan's test above)
Total returns: 15,438%
Not quite the 20,000%+, still some way to go :)
Thanks to gpw radar for spotting a bug in the earlier code which I think resulted in holding the SPY and TQQQ in parallel, i.e. on margin / leveraged. In future editions, I will try and record the leverage so that similar issues pop up quickly,
At least the max drawdown also decreased from 50%+ to 40%+, still quite steep of course.
Peter Guenther
@Joshua Tsai: Thanks for sharing these results regarding TIPs, a long volatility strategy, and the ETF rotation outline. Much appreciated and great thinking!
Tien Duy Vo
Thanks for sharing the code. I used your last version ( Corrected: 3 x leveraged SEL[“QQQ”] + I/O[“In & Out”] ) in a small backtest from 2019-now. However, based on the orders I can not see any "In" or "Out" orders. The strategy buys TQQQ, TMF, and TYD and sells it in the same time frame. Despite all this, the performance looked good. I still wonder whether this was intentional.
Nathan Swenson
Based on corrected version and only using TQQQ and TMF, no TYD.
Nathan Swenson
Almost qualifies for competition with nearly 80% alpha score. Pretty tough for anyone to beat 23000% return over this period!
Nathan Swenson
Large drawdown of course, but otherwise good numbers.
Tien Duy Vo
Nathan Swenson Which version did you used? Did you checked the orders?
Peter Guenther
Great series of tests there Nathan Swenson, thanks for sharing! You cracked the 20,000% again, nice :)
Tien Duy Vo: Thanks for joining the discussion! I am not 100% whether you looked at the order data below, this is from the Corrected algo version above running from 1 Jan 2008 to today. I have copied in a part of 2019. What should be happening is that the algo alternates between holding the leveraged bond ETFs (TMF and TYD) versus holding the leveraged tech stock selection (TQQQ). For example, see the first lines with the negative quantities (-70701 and -29249): it's selling the bonds on 18 Jan 2019 which it was holding before. In parallel, it's buying the TQQQ (see positive quantity 55093). Then on 24 Jun 2019, it's selling the TQQQ quantity (-55093) and it's investing the money in the bonds (see positive quantities). So, the algo sometimes holds the TQQQ and sometimes the bonds, based on the in & out indicator (see the variable self.be_in in the code). Not sure whether this answers the question?
(Sidenote: there are some "invalid" entries in there, were it doesn't seem to be able to get a price for TQQQ. However, this doesn't seem to affect the holdings.)
Time Symbol Price Quantity Type Status Value Tag 2019-01-18T16:30:00Z TMF 18.09502674 -70701 Market Filled -1279336.485 2019-01-18T16:30:00Z TYD 41.89420637 -29249 Market Filled -1225363.642 2019-01-18T16:30:00Z TQQQ 45.31716207 55093 Market Filled 2496658.41 2019-06-24T15:30:00Z TQQQ 63.66676589 -55093 Market Filled -3507593.133 2019-06-24T15:30:00Z TMF 24.64069751 71190 Market Filled 1754171.256 2019-06-24T15:30:00Z TYD 50.32595584 34820 Market Filled 1752349.782 2019-09-06T15:30:00Z TQQQ 64.62641568 65562 Market Filled 4237037.065 2019-09-06T15:30:00Z TMF 32.36969776 -71190 Market Filled -2304398.783 2019-09-06T15:30:00Z TYD 55.32687056 -34820 Market Filled -1926481.633 2019-09-11T15:30:00Z TQQQ 64.55644122 -65562 Market Filled -4232449.399 2019-09-11T15:30:00Z TMF 29.42790146 71810 Market Filled 2113217.604 2019-09-11T15:30:00Z TYD 53.32674448 39628 Market Filled 2113232.23 2019-11-01T15:30:00Z TQQQ 0 59469 Market Invalid 0 2019-11-01T15:30:00Z TMF 28.76884979 -71810 Market Filled -2065891.103 2019-11-01T15:30:00Z TYD 53.35052892 -39628 Market Filled -2114174.76 2019-11-01T15:30:00Z TQQQ 70.48427795 59269 Market Filled 4177532.67 2019-11-05T16:30:00Z TQQQ 72.61350093 -59269 Market Filled -4303729.587 2019-11-05T16:30:00Z TMF 26.83698518 80200 Market Filled 2152326.211 2019-11-05T16:30:00Z TYD 51.835342 41577 Market Filled 2155158.014 2019-12-06T16:30:00Z TQQQ 0 56469 Market Invalid 0 2019-12-06T16:30:00Z TMF 27.60375618 -80200 Market Filled -2213821.246 2019-12-06T16:30:00Z TYD 51.82537367 -41577 Market Filled -2154743.561 2019-12-06T16:30:00Z TQQQ 77.21182285 56515 Market Filled 4363626.168
Tien Duy Vo
Peter Guenther : Thanks for the clarification. You are right. If I start the algo on 01/01/2008, I get the same result as you have posted. However, if I start the algo on 01/01/2018 then I get these results.
Fill: $48.15361309433875 USD
2071Filled +2018-01-02 11:30:00TMFBuy MarketFill: $20.750885826 USD
2404Filled +2018-01-02 11:30:00TYDBuy MarketFill: $42.892753618 USD
1158Filled +2018-01-05 11:30:00TMFSell MarketFill: $20.760609765 USD
-2404Filled +2018-01-05 11:30:00TYDSell MarketFill: $42.60804548 USD
-1158Filled-2018-02-02 11:30:00TQQQSell MarketFill: $55.87096473697939 USD
-2071FilledNathan Swenson
Ok, I see that this strategy works much better with SPY derivatives rather that NQ. Just switching over to SPXL in tandem with TMF (no TYD) I get nearly 40,000% return:
https://www.quantconnect.com/terminal/processCache?request=embedded_backtest_3f192d90a6cb21b1968829b75efdb63f.htmlPeter Guenther
The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by QuantConnect. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. QuantConnect makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances. All investments involve risk, including loss of principal. You should consult with an investment professional before making any investment decisions.
To unlock posting to the community forums please complete at least 30% of Boot Camp.
You can continue your Boot Camp training progress from the terminal. We hope to see you in the community soon!