Expectations when going short / buying puts

To hedge long positions, I use a trend-following short strategy on RTY futures

To be honest, I do not understand the Portfolio123 methodology good enough to understand why inverting the ranking system (i.e. going from long to short and from higher is better to lower is better) does not result in inverting the results too.

I saw that @feldy had a comment on this (below). If you understand it better Feldy, could you perhaps elaborate further? Will for example focussing on improving the ‘worst’ bucket within a ‘long’ ranking system result in significantly different outcomes out of sample compared to improving the ‘best’ bucket in a ‘short’ ranking system?

Yuval, what ranking system are you testing there? Is it public? Are you trying to reconcile the per-bucket long performance vs the negated per-bucket short performance?

Victor, you’re not going to be able realistically trade that system based on that snapshot. Those very low MktCaps caught my eye, so I cross-referenced the IBKR borrow fees and shortable shares as of 01-12-2024 when you posted them.

Symbol MktCap BorrowFee ShortableShares
1 ADTX 2 390.11% 15000
2 AEON 262 74.22% 10000
3 ALUR 104 13.75% 150000
4 APLD 830 1.57% 300000
5 ASTI 0 133.49% 100000
6 ATLX 290 13.87% 150000
7 BLFS 753 0.31% 800000
8 CANO 10 40.24% 20000
9 CAPR 119 0.45% 650000
10 CBUS 308 16.14% 25000
11 CING 6 732.31% 4000
12 DBGI 2 164.62% 20000
13 GMBL 0 20.53% 8000
14 HSDT 5 123.82% 25000
15 LIFW 21 187.46% 45000
16 LTRY 7 97.52% 35000
17 MTAL 556 nan% 0
18 NWTN 1968 142.94% 550000
19 OCEA 21 25.20% 30000
20 OMEX 93 4.76% 1100000
21 PAVM 27 1.70% 20000
22 SCLX 181 37.22% 300000
23 SIDU 8 953.11% 100
24 SMTI 331 0.90% 100000
25 SYTA 8 95.55% 20000
26 TMCI 801 0.46% 1800000
27 TRML 128 17.44% 150000
28 TTOO 18 83.95% 7000
29 XOMA 238 0.86% 100000

You will need something like a MktCap constraint to keep things viable even if its imperfect. You may also want to exclude ADRs like NWTN that have high market caps but may still have high borrow fees.

For me, short selling no-revenue, small, and mostly biotech stocks is a recipe for disaster when risk is off and junk is on. There may be even no liquidity in the book when you need to cover your short. I could not sleep well… :slight_smile:

I’m using more or less the factors provided in this post, and testing short system using puts. I found that the stocks in my portfolio are super correlated with each other, either all stocks go up or go down.
However, this is probably the only way to gain positive return in long term.

In addition, I sell short-dated, ~0.2 delta ES puts. This is the region where volatility risk premia has been historically the highest.

This is my universe I use for trading puts:
https://www.portfolio123.com/app/universe/summary/290776

It follows more or less CBOE regulations.

Pitmaster,

Just a thought. I have papertraded a pairs strategy and took one Coursera course on this. So exactly no real experience with this and I know my limitations.

But you want the shorts to be correlated to the longs perhaps (and not so much to each other)?

Pairs traders use cointegration as I am sure you already know. And you probably have the expertise to develop a Python program to loop through all of the combinations of longs and shorts using the cointegration formulas. I am not sure I could do that so i will not suggest it here.

But from the Coursera course, many would use hierarchical clustering–which I know you can do with a Python library(Clustering in Sklearn)—matching stocks close to each other in the dendrogram. At least as an initial screen.

As you know the correlation distance for hierarchical clustering is simply: Correlation distance=1−r

In real-time you could draw the dendrogram and get a visual understanding of what stocks to pair with your longs.

In words, the Python algorithm would take the highest ranked stock (for the long position) and use a loop to find the stock with the largest correlation (or smallest correlation distance) in the bottom quantile of the ranking system (e.i., in lowest bucket). Loop through all of the long positions purchase at rebalance. Buy the long and short the other stock found in your loop. Sell both when your long port sells the long position.

I think I could do this in Python (and get the returns) so I know you could. And again, in real time you could do it with a dendrogram.

Just a thought for now. But something I will certainly try when I start using shorts or options. If (and only if) members found this useful thought experience, P123 could do a dendrogram: not a feature suggestion.

This is different or adds to classic pairs trading as it uses P123 to select long stocks. Pairs trading focuses more on relative price movements. So maybe call it an optimally correlated (or inversely correlated when using shorts) hedge. But not pairs trading exactly. Is there any simpler way to gat an inversely correlated hedge to reduce drawdowns?

Jim

No, it’s the ranking system I use to buy put options. I’m trying to reconcile the right-most bucket of the ranking system (around -20% return) with the right-most bucket of exactly the same ranking system but using the “short” button instead of the “long” button (about 3% return). And I’m wondering how anyone can get 20% using the “short” button. At this proportion, that would mean getting -130% using the “long” button.

Hmm, I ran a test to try to isolate the effect of dividends on the performance of the right-most bucket when switching between long and short in the rank performance. Using Victor’s public shorting system, I ran a long and short rank performance on the Easy to Trade US universe. I then ran the same comparison on a custom Easy to Trade US No Dividend universe.

Even for the no dividends universe, I still see a large discrepancy between the long performance of the top bucket and the inverse of the short performance of the top bucket, so there must be some other factors at play.

@yuvaltaylor, can you check with the p123 developers to see if there’s a carry cost that’s hard-coded when you run with transaction type set to short? There’s no parameter exposed, but there must be something going on under the hood.

Long - Easy to Trade US

Short - Easy to Trade US

Long - Easy to Trade US No Dividends

Short - Easy to Trade US No Dividends

Aaron explained it to me. It’s the compounding effect. Two periods of a 10% gain compound to 21%. Two periods of a 10% loss compound to -19%. There’s no carry cost involved.

Hi, I have some questions,
Do you reduce short positions when it get bigger due to losses ?

I developed a good system that work well on screener and I want apply it to a (live) simulated strategy. However, I want to have my position equal weighted after each rebalancing.

I do not have access to dynamic weighting. Is there any option to have my position equal weighted w/o dynamic weighting ? or to reduce my positions that are far too big from ideal size ?

Yes, it’s possible to accomplish this with Weight or a combination of Eval and Weight. You could add a rule like “Weight > 20” to exit a position if it exceeds 20% of the portfolio value, and set “Allow Immediate Buyback” to Yes to allow the buy rules to repurchase.

An even more precise solution is to use Eval with Weight to specify how much of the position you want to sell. This usage is well documented in the factor reference for Eval:

To trim a position that gets too large in a Portfolio

SELL rules sell a position when any of the rules evaluates to TRUE, or 1. But a little known feature allows you to sell a portion of a position if a rule evaluates to a number between 0 and 1.0. For example to sell half a position if the weight exceeds 30% of the portfolio, and do nothing otherwise, enter the following SELL rule:

Eval(Weight>30, 0.5, 0)

This may do what you want. I made a few edits from my original form, hopefully it still works as intended. Of course, replace the condition part of Eval with what you want. You’ll probably want to condition it with Weight>@ReBalTarget.

!SetVar(@ReBalTarget,10) // Ideal position weight is 10% of port value
!SetVar(@ReBal,@ReBalTarget/Weight) // Calculate portion that represents target
eval(Weight>@ReBalTarget*1.50,1-@ReBal,0) // trigger sell when position is 150% over @ReBalTarget
1 Like

Thank you @WalterW and @feldy. It was really helpful.
These are my sell rules:

  • Rank < 90
  • Eval(Weight>10, 0.5, 0)
  • Eval(Weight<1, 1, 0) - this allows to cover short when position is very small (~ +90% positive return)

I have the some conclusions from research:

  • My ranking has < 10 factors, all fundamental (without: price volatility, mktcap, liquidity based factors).
  • My system works very well when I allow to sell small stocks within Easy To Trade and Russel 2000/3000 universe, (20 stocks, 10yr period, variable slippage). It is comfortably above 20-40% p.a. but when I switch universe to sp1500 then the return drops to negative returns at -10%.

One explanation is that, I used universe with small stocks for ML training. Possibly other factors will work better for sp1500 universe. In general this drop in returns should be expected but not by so high margin.

Looking forward, I would be happy to get 5-10% p.a. in sp1500 universe without allocating to much to Biotech stocks. Of course I will be buying options rather than selling stocks so the backtest has limited value.

1 Like

Hello,
What is the best way to avoid Turn of the Month in formulas please?
I tried playing with "MonthBars" but could not figure it out.

You can use monthbars, made an example. Need to rebalance every day to use Monthbars.

https://www.portfolio123.com/port_summary.jsp?portid=1770144

Thank you. This is unfortunate that there seems to be the look ahead bias of the Fed indicator.

Yes, I realized that

Hi Yuval, I'm interested in your comment about price volatility as it relates to hedging via put options. Is there a basic price volatility rule you could recommend that I might experiment with in terms of looking for shorting opportunities? Thanks.

PctDev(60,1), lower, universe.

1 Like