# Minimum market volume for trading?



## skittlebup (8 May 2008)

Are there any rules of thumb to determine minimum liquidity requirement for a stock to be tradeable - some say $500,000 worth daily - and others $200,000.

As our EOD data does not include either number of shares or number of transactions, we are left with bare vol or vol times price.
But what value of either?


----------



## tech/a (8 May 2008)

I use $500K T/O min on a 3 day average.


----------



## wayneL (8 May 2008)

skittlebup said:


> Are there any rules of thumb to determine minimum liquidity requirement for a stock to be tradeable - some say $500,000 worth daily - and others $200,000.
> 
> As our EOD data does not include either number of shares or number of transactions, we are left with bare vol or vol times price.
> But what value of either?




Depends on your style of trading and position size. If you trade in $50,000 blocks, I'd say 200,000 is way too small. If slippage is a big factor in your method, 200,000 is probably too small, even with a small position size.

Also, don't ignore raw volume. A 2c stock with 200k turnover is probably quite liquid, whereas a $100 stock with a 200k turnover isn't going to be very liquid at all.


----------



## skittlebup (8 May 2008)

thanks, Tech a and Wayne.

Wayne, your point about vol in relation to price is very well taken. Thanks.


----------



## skittlebup (9 May 2008)

*An Algorithm for CFD Minimum market volume for trading*

Using both Tech-a's calculation of average vol and Wayne's consideration of price to volume, here is a possible calculation of variable position size for CFDs  written in 'pseudo' Amibroker afl. Grammatically wrong for afl, yes. But I hope I've got the signs right!!


//Possible Position Sizing Algorithm for CFDs (ie includes margining 
calculation),
//in which share volume is considered in relation to share price.

//Input parameters:

ActualCapitalAvailable=cap;
PercentToRiskPerTrade=perc;//Standard figure would be 2%
CFDMarginPercent=marg;
GuaranteedStopLossPercentFromEntry=GSL;
TradeablePercent=TradPerc;//explained below

//Then:

AmountAvailableToRisk=cap*(perc/100);
TheoreticalAvailableMarginedCapital=(cap*(perc/100))*(100/marg);

//but assuming Guaranteed Stop Loss which then becomes margin level
ActualAvailableMarginedCapital=AvailCap=IIf(marg<GSL,(cap*(perc/100))*(100/marg
),(cap*(perc/100))*(100/GSL);


//Now assume that in order not to move the market one does not trade more than 
a certain percentage,
//not of total volume, but of approximate number of shares. I dont know what 
that amount is,
//but suspect it would be less than 10% of number of shares - call it 
TradeablePercent (included above in Input Parameters).

EstimatedAveragedSharePrice=EstPrice=WMA((H+L+C)/3,3);
AveragedDailyVolume=EstVol=WMA(V,3);
ThereforeEstimatedNUMBERofShares=NumbShares=EstVol/EstPrice;
MaximumTradeableNumber=MaxTrdNumb=NumbShares*(TradPerc/100);
ThereforeValueOfMaxTrdNumb=MaxTrdVal=MaxTrdNumb*C;
RealTradeableVal=RealVal=IIf(MaxTrdVal<AvailCap,MaxTrdVal,AvailCap);

RealTradeableNumberOfShares=RealNum=RealVal/C;


----------



## skittlebup (9 May 2008)

Here is the algorithm actually implemented in afl:

_SECTION_BEGIN("position size2");
//Possible Position Sizing Algorithm for CFDs (ie includes margining calculation),
//in which share volume is considered in relation to share price.

//Input parameters:

ActualCapitalAvailable=20000;
PercentToRiskPerTrade=2;//Standard figure would be 2%
CFDMarginPercent=5;
GuaranteedStopLossPercentFromEntry=5;
TradeablePercent=7.5;//explained below

//Then:

AmountAvailableToRisk=ActualCapitalAvailable*(PercentToRiskPerTrade/100);
TheoreticalAvailableMarginedCapital=(ActualCapitalAvailable*(PercentToRiskPerTrade/100))*(100/CFDMarginPercent);

//but assuming Guaranteed Stop Loss which then becomes margin level
ActualAvailableMarginedCapital=
IIf(CFDMarginPercent>GuaranteedStopLossPercentFromEntry,
(ActualCapitalAvailable*(PercentToRiskPerTrade/100))*(100/CFDMarginPercent),
(ActualCapitalAvailable*(PercentToRiskPerTrade/100))*(100/GuaranteedStopLossPercentFromEntry));


//Now assume that in order not to move the market one does not trade more than a certain percentage,
//not of total volume, but of approximate number of shares. I dont know what that amount is,
//but suspect it would be less than 10% of number of shares - call it TradeablePercent (included above in Input Parameters).

EstimatedAveragedSharePrice=WMA((H+L+C)/3,3);
AveragedDailyVolume=WMA(V,3);
EstimatedNUMBERofShares=AveragedDailyVolume/EstimatedAveragedSharePrice;
MaximumTradeableNumber=EstimatedNUMBERofShares*(TradeablePercent/100);
ValueOfMaxTrdNumb=MaximumTradeableNumber*C;
RealTradeableVal=IIf(ValueOfMaxTrdNumb<ActualAvailableMarginedCapital,ValueOfMaxTrdNumb,ActualAvailableMarginedCapital);
RealTradeableNumberOfShares=RealTradeableVal/C;

Plot(RealTradeableNumberOfShares,"No. to buy",colorBlue,styleHistogram);

Filter=RealTradeableNumberOfShares>0;
AddColumn(C,"close");
AddColumn(V,"volume");
AddColumn(MaximumTradeableNumber,"max no to buy");
AddColumn(RealTradeableNumberOfShares,"actual no shares to buy");
AddColumn(RealTradeableVal,"value of shares to buy");


This can be used either as an exploration filter or inserted as a plot.


----------



## skittlebup (10 May 2008)

Here is revised amibroker code for version 2 of this Position Sizer, which corrects a serious error in the first posting (reversing the first comparison in the first IIF statement), and now allowing parameters to be varied from the Parameter Window.

_SECTION_BEGIN("position size2");
//Possible Position Sizing Algorithm for CFDs (ie includes margining calculation),
//in which share volume is considered in relation to share price.

//Input parameters:

ActualCapitalAvailable=Param("Available capital",50000,5000,500000);
PercentToRiskPerTrade=Param("Risk %",2,1,15);
CFDMarginPercent=Param("Percent cash to margin",10,3,100);
GuaranteedStopLossPercentFromEntry=Param("GSL % from entry",5,5,20);
TradeablePercent=Param("Tradeable %",7.5,.001,15);//explained below

//Then:

AmountAvailableToRisk=ActualCapitalAvailable*(PercentToRiskPerTrade/100);
TheoreticalAvailableMarginedCapital=(ActualCapitalAvailable*(PercentToRiskPerTrade/100))*(100/CFDMarginPercent);

//but assuming Guaranteed Stop Loss which then becomes margin level
ActualAvailableMarginedCapital=
IIf(CFDMarginPercent<GuaranteedStopLossPercentFromEntry,
(ActualCapitalAvailable*(PercentToRiskPerTrade/100))*(100/CFDMarginPercent),
(ActualCapitalAvailable*(PercentToRiskPerTrade/100))*(100/GuaranteedStopLossPercentFromEntry));


//Now assume that in order not to move the market one does not trade more than a certain percentage,
//not of total volume, but of approximate number of shares. I dont know what that amount is,
//but suspect it would be less than 10% of number of shares - call it TradeablePercent (included above in Input Parameters).

EstimatedAveragedSharePrice=C;
AveragedDailyVolume=V;
EstimatedNUMBERofShares=AveragedDailyVolume/EstimatedAveragedSharePrice;
MaximumTradeableNumber=EstimatedNUMBERofShares*(TradeablePercent/100);
ValueOfMaxTrdNumb=MaximumTradeableNumber*C;
RealTradeableVal=IIf(ValueOfMaxTrdNumb<ActualAvailableMarginedCapital,ValueOfMaxTrdNumb,ActualAvailableMarginedCapital);
RealTradeableNumberOfShares=RealTradeableVal/C;

Plot(RealTradeableNumberOfShares,"No. to buy",colorBlue,styleHistogram);

Filter=RealTradeableNumberOfShares>0;
AddColumn(C,"close");
AddColumn(V,"volume");
AddColumn(MaximumTradeableNumber,"max no to buy");
AddColumn(RealTradeableNumberOfShares,"actual no shares to buy");
AddColumn(RealTradeableVal,"value of shares to buy");
_SECTION_END();


----------



## skittlebup (13 May 2008)

"Crash" has posted an important correction to this algorithm on the AmiBroker Library page.


----------

