Does anyone use a good rule of thumb for avg daily volume and position size.
10x or 20x the position that is going to be bought?
And use Using AvgDailyTot(120) >( 100* 1000) or Mediandailytot(120) >( 100* 1000)?
Does anyone use a good rule of thumb for avg daily volume and position size.
10x or 20x the position that is going to be bought?
And use Using AvgDailyTot(120) >( 100* 1000) or Mediandailytot(120) >( 100* 1000)?
Hi Whycliffes, Yuval will probably have good advice here given his experience with low liquidity stocks, but I’ll chime in during the mean time. Mediandailytot() makes alot more sense for me as many smaller companies might trade a high amount around earnings and then fall back to relatively low volume at other times. Using average in that case might make liquidity seem higher than it is on most days; w/ median being more representative. But even then, it might make sense to consider the variance in liquidity, or how often liquidity dries up to even lower levels. I’m not in the highly illiquid stocks, but 5-10% of volume usually feels workable to me, but I don’t require it all in one day and don’t have high concentrations.
One I currently hold that with lower liquidity is DLHC. On several days it trades less than 6000 shares or around $75k, and on others 10x that, so just have to find a comfort level I can tolerate on stocks like that. Here’s a link showing the wide range of daily volumes.
https://www.portfolio123.com/app/stock?tab=issues&t=DLHC:USA
Another is FSI. A couple days ago it looks like it only traded about $40k all day long.
https://www.portfolio123.com/app/stock?tab=issues&t=FSI:USA
I do have a rule of thumb. 2 * LoopStdDev(“(Hi(Ctr)-Low(Ctr))/Close(Ctr)”,100) * ([average trade size]/MedianDailyTot(126))^0.5+[commissions & taxes divided by trade amount] < 0.05
This is for stocks without spread data. If I have spread data, I lower the 2 at the beginning of the formula to 1 and add 0.5*LoopMedian(“Spread(Ctr)/Close(Ctr)”,35)
I’ll explain each component now.
The basic formula for the transaction cost of a stock is x * volatility * square root of shares you trade divided by total shares traded + y * spread.
Through gathering lots of data on my own trades, I’m estimating x = 0.5 and y = 0.25. If I don’t have the spread cost, I’ll double the other part of the formula to make up for that. (That doesn’t mean that if you use spread alone, it’s 0.25. It’s actually more like 0.5. But if you use it together with the other part of the formula it’s closer to 0.25.)
I measure volatility in daily trading as the standard deviation of the high-low difference divided by the closing price.
I measure the total shares traded by using the median, as SpacemanJones suggests.
0.05 is my approximate excess return per stock before slippage. If the round-trip transaction costs (twice the single transaction cost) are greater than my approximate excess return per stock, then it’s obviously not worthwhile buying the stock.
I also scale my buys by the transaction cost. If a stock has a high transaction cost as measured by this formula, I’ll buy much less of it.
Yuval,
Thank you. That sounds about right.
Solving for the “Easy to Trade” universe and the minimum ADT(126) = 50,000 for that universe I get:
LoopStdDev(“(Hi(Ctr)-Low(Ctr))/Close(Ctr)”,100) < (0.05 times 50,000^0.5)/2 times [average trade size]. Note using * for multiplication causes italics and the multiplication sign goes missing.
If I want to put $3,000 on an equity and simplifying:
0.05 * 224/6,000 = 0.0019. Or about 0.2% standard deviation would be the maximum standard deviation for placing $3,000 per stock.
Is my math right?
What is the usual standard deviation? I note that SPY (a large-cap ETF with multiple stocks) is down 0.3% today but that is anecdotal.
Again, sounds right (but my math may not be right) and just trying to get one general rule of thumb for a safe trade size. I clearly do not have a usual range for LoopStdDev(“(Hi(Ctr)-Low(Ctr))/Close(Ctr)”,100) at this point and realize that.
But just doing the math (if it is correct) maybe $3,000 is too much for a single trade using this formula if my math is correct? A $1,000 trade would be 0.6%.
Could I make 3 $1,000 dollar trades or is this the day’s total amount based on the market impact?
Thanks,
Jim
I’ve created two screens so that you can play around with these rules.
https://www.portfolio123.com/app/screen/summary/275396?st=0&mt=1 This is for market impact.
https://www.portfolio123.com/app/screen/summary/275399?st=0&mt=1 This is for market impact plus spread = transaction cost.
I think these screens will make it easier for you to see what values certain stocks have for these variables and you can then do the calculations accordingly.
Please note: you’ll have to put “4” in the Precision box to see the variables in any kind of detail. Or multiply them by 100 in the ShowVar commands.
Thank you Yuval. I will definitely be using this to decide what to do with any new ports.
Im trying to use is inn a simualtion, but have a question. Just so Im getting this right, what would your numbers look like here "[commissions & taxes divided by trade amount] " ?
It depends. For me, US and Canadian stocks traded on Fidelity would be 0, European stocks traded on Fidelity would be 2% (currency conversion fee), stocks traded on IB would be 0.5% (commissions) but higher in certain countries, especially Great Britain, because of stamp taxes; for European stocks I’d also add the foreign taxes on a portion of the dividend yield (the portion depending on my holding period).
So using your IB example (0.5%) and an average trade size of 8000 USD would give something like this: “2 * LoopStdDev(“(Hi(Ctr)-Low(Ctr))/Close(Ctr)”,100) * (8000/MedianDailyTot(126))^0.5+0.5/8000 < 0.05” ?
But how will you use such a volume filter in the simulator, given that the total portfolio value will rise over time, causing the minimum trade size to rise from 8000USD?
I don’t vary the portfolio value when running simulations.
Should be 0.5% (=0.005), not 0.5/8000
Like this ?:
2 * LoopStdDev(“(Hi(Ctr)-Low(Ctr))/Close(Ctr)”,100) * (8000/MedianDailyTot(126))^0.5< 0.05
Looks fine to me if you’re not paying any commissions or trading taxes.
I added 0.7 in trading cost "2 * LoopStdDev(“(Hi(Ctr)-Low(Ctr))/Close(Ctr)”,100) * (8000/MedianDailyTot(126))^0.5+0.7< 0.05 "
But when I did that i dident get any stocks?
Is this rule possible to use in a simulation?
Um, you added a 70% trading cost and want it to be below 5%?
This is a universe rule, but I suppose you could put it as a buy rule in a simulation instead. But then you’d be ranking a bunch of stocks you can’t buy.
Sorry, like this, as a universe rule:
2 * LoopStdDev(“(Hi(Ctr)-Low(Ctr))/Close(Ctr)”,100) * (8000/MedianDailyTot(126))^0.5+0.007 < 0.05 // no spread universe
1 * 0.5*LoopMedian(“Spread(Ctr)/Close(Ctr)”,35) * (8000/MedianDailyTot(126))^0.5+0.007< 0.05 // Universe with spread
?
No, you don’t want to multiply the spread by the square root of the fraction of volume traded. The spread cost is an additional cost that’s really separate from the market impact cost, so it should be added to the volatility times the square root of the fraction of volume traded.
Thank you Yuval, this is a really interesting way of dealing with liquidity issues.
When you say stocks that don't have Spread data, is that primarily non-US? When playing with the screener and requiring @spread > 0, it seems almost all stocks have some spread data, even back in 2000.
We don't have spread data on P123 for OTC stocks, Canadian stocks, and European stocks. To get those I have to look at actual historical trades. And they can make a big difference.
Yuval,
Thanks.
Once you have filtered through the universe with these rules, what do you assume in the simulation as slippage?
Also if you assume that you are making 5% gain per trade should not be the rule be more restrictive than the "rule" < 0.05. Indeed, if I understand it correctly there would be no point buying it. Also shouldn't it be all multiplied by 2 for the buying and selling?
For simulations I use variable slippage because P123 does not allow one to use one's own slippage formula.
I've done quite a bit more research since these posts. My round-trip (both buying and selling) transaction cost formula is now this:
IsNA ($VWAP * 0.9 * $DV * ($tradesize / $MDT)^0.5 + 0.5 * $Spread2price, $VWAP * 1.5 * $DV * ($tradesize / $MDT)^0.5) + $commission + $tax + $delaycost
where
$VWAP = 0.7 if you can use VWAP orders and 1.2 if you can't
$DV = LoopAvg ("Abs (Close (Ctr) - Close (Ctr+1)) / Close (Ctr+1))",100)
$tradesize is the amount you typically trade in dollars
$MDT = MedianDailyTot (126)
$Spread2Price = LoopMedian ("Spread (Ctr) / Close (Ctr)", 35)
$commission and $tax are obvious: you can come up with your own formulas for those ($tax should include stamp tax for certain exchanges and dividend taxes for certain countries)
$delaycost is about 0.0025 if you spend a number of days getting a fill.