As I outlined in the last post (overview), I will be performing
several steps in this design-from-scratch ranking system
project. This post describes the first stage of the design
process and is the most straightforward. There are four items
I am going to consider for the target universe:
- Choice of standard Portfolio123 universe
- Minimum liquidity
- Minimum stock price
- Ranking system design process
Choice of Standard Portfolio123 Universe
Since this is a brand new process I am inventing, I have decided
to go with a fairly broad universe. I don't like
Over-the-counter (OTC) stocks and I also don't want Master Limited
Partnerships (MLPs). Therefore, my decision is to use the
S&P 1500. All stocks in this universe are listed on a
major US exchange with (I believe) no MLPs and all companies are
either U.S. companies or international companies with headquarters
in the U.S. For me this is preferable to trying to filter out
Chinese companies, a rather difficult task.
I normally design very high liquidity models with at least $5M
$Volume per day, sometimes a lot higher. For this project I am going
to drop my requirement down to $2M $Volume per day. The lower
$Volume should give this ranking system better performance than I am accustomed to. My portfolio design will use a buy rule of
AvgDailyTot(60)>2,000,000 (minimum $2M $Volume per day on
average). But this is an average, and the
filter only applies to the days preceding the trade, not the actual
day of trade so one has to expect that the $Volume could be lower,
either on trade day or while the stock is held. Thus my target
universe will be set to $1M, allowing stock liquidity to bounce
around a little bit without dropping out of the universe.
Minimum Stock Price
I like to work with a minimum stock price of $2. I find
that this price gives very good performance in stock simulations
without too much compromise on stock volatility. I know most
R2G models buy stocks down to $1 but I don't wish to go down that
low. That is my personal preference and I don't care to try
to justify it. If a developer is comfortable with buying
stocks at $1 then that is OK. You should keep in mind
however that the stock price may drop down to penny stock status,
and possibly fall off the exchange it is listed on.
So, if I set the minimum stock price at $2 as a portfolio buy
rule then I will need to test below this price as the stock price
may drop below $2. For example, I don't want to buy at $2
and have to sell the next week because the stock price dropped to
$1.95. So I am going to set my minimum stock price for this
exercise at $1.50 in the target universe. As a general rule,
I require the closing price to be above $1.50 and also a 60 day
moving average to be above $1.50. The moving average
requirement is to prevent stocks with an unusual price around the
lower price from being bought.
One additional check that I like to include is to make sure the
stock has been around for awhile i.e. no IPOs. For this
filter I use Close(500)>1.
Ranking system design process
As a developer, I need to have a basic understanding of the
ranking system design process up front. This is important
because I want to know how many stocks will be in each ranking bin
which determines the reliability for the entire process.
The first step is to enter all of the rules for the target
universe into a screen as shown in the figure below. The
most recent date shows a total of 1440 stocks in the target
universe. By sampling various dates, I found a minimum of
1233 stocks at one point. For the purpose of this analysis I
am going to assume a minimum of 1200 stocks in the target
universe, a little more conservative than the minimum number that
I had found by sampling.
Out of curiosity I decided to repeat this experiment using the
Buy rules for a potential port as shown in the figure below. By sampling
different dates, I found a minimum of 1100 stocks that fulfilled the rules. As
liquidity has increased over the years, my conclusion is that I
could expect at least 1100 stocks that will meet portfolio
liquidity buy rules at any given point in time in the future.
Now getting back to the target universe analysis...
I will be analyzing the 10 sectors independently, and testing
with odd/even stock IDs. Therefore, individual test
universes have a minimum of (1200 / 10) /2 = 60 stocks
each. I generally test at a rank of 80 and higher, therefore
I will be testing 20% of each test universe or 60/5*0.2 = 12
stocks. I don't know if this will be a sufficient number of
stocks for test but I am going to proceed with this. If I
run into trouble there are some workarounds that I could use - I
can't explain just now as I would be getting ahead of myself.
Below is a snapshot of the Test Universe with one sector
specified. Already I am below my estimate of 60 stocks in
each test universe as I forgot to consider the variation in number
of stocks between each sector. Anyways, I will proceed on
while keeping a close eye on this issue. Note that I chose
the Even stock-IDs as there are more stocks than the odd stock-IDs
by ~50 stocks.