Stocks with Non-1-Cent Tick Values (Tick Size Pilot Program)
Author: Dave B.
Creation Date: 10/31/2016 5:30 PM
profile picture

Dave B.

#1
Eugene, Cone:

In my backtesting, I have run into a new issue (for me) that I would like to hear your general thoughts on.

My understanding is that the SEC has begun testing a new program where certain (and I don’t know their selection criteria) reasonable size stocks now trade with a “tick” value larger than $0.01 (1 cent), usually $0.05 (5 cents). I believe they phrased this as an experiment, which I take to mean that the selected symbols can change and the tick values could also change.

Some example Nasdaq symbols: ABCB, AGII, AMSF, BANF, BNCL, BNCN, CBF, ESGR, FFBC, FIBK, FULT, IBKC, INDB, IPCC, KRNY, MHLD, NAVG, OPB, PRAA, SAFT, SFNC, SIGI, TCBI, TOWN, UBSI, WAFD, WSFS.

I realize this would not affect market orders, but obviously would affect Limit and Stop orders (any order with a stated price). I searched the forums and could not find a specific reference to this issue, but if I missed it, I apologize.

Questions:
• Does this imply Wealth-Lab (and potentially many other backtesters), at present, do not handle this situation correctly?
• Can Wealth-Lab automatically gather this information from Fidelity, a broker (IB has this information available), or other information source and assign non-1-cent tick values to stocks as part of normal data collection and build a stock symbol table with this information?
• Would this be an extension of the way futures are handled, such as rounding (floor / ceiling) prices to a tick value automatically?

Please discuss this issue and / or point us to the necessary information.

Thanks
Dave
profile picture

Cone

#2
I haven't heard about it, but it looks like they started doing it with that set of symbols on 10/17/2016.

You could add the symbols to the Symbol Info Manager with a 0.05 tick, but considering they were trading at 0.01 tick prior to that date, it sure complicates things!

It sure seems like the easiest solution is to check the date. If prior to 10/17/2016, round your stop/limit orders to 0.01, otherwise round to a nickel

Questions:
1. No, it's not handled.
2. Anything's possible, but we'll have to look for that info source.
3. I think it's easiest to deal with it in the strategy code.

Thanks for the heads up!
profile picture

Eugene

#3
Hi Dave,

QUOTE:
• Does this imply Wealth-Lab (and potentially many other backtesters), at present, do not handle this situation correctly?

You could adjust to this change now by activating the Symbol info manager (Tools menu). Set up each stock participating in the SEC program (there's even support for regular expressions if needed) and configure its tick value as 0.05.

QUOTE:
• Can Wealth-Lab automatically gather this information from

Theoretically yes. Assuming there's a bunch of symbols in the pilot program. If such information source exists then a motivated user could come up with a solution to poll the source and create entries in the SymbolInfo.xml file. The source must be freely accessible and easily parseable. Although a WealthScript strategy is powerful enough for this task, he/she might have to do it outside Wealth-Lab because overwriting program's XML files isn't possible while WLP is running.
profile picture

Cone

#4
Just thinking, if you've been in the business for a while you'll recall that it wasn't all that long ago that the U.S. stock market used fractional prices...
Refs:
Stock Market Decimalization.
SEC Decimals Implementation Plan for the Equities and Options Markets

There might have been, but I don't remember any special considerations made by Wealth-Lab or other technical analysis platforms to account for this change in backtesting limit order strategies.
profile picture

Dave B.

#5
Guys, thanks for the discussion.

In my testing, IB currently rejects Limit orders for any stocks that do not conform to the (new) tick level pricing.

This same exact trade can be executed (filled) by Wealth-Lab during backtesting at a non-tick level of pricing via a limit order.

Robert, your comment on fractional pricing made me stop and think – how was this handled before? If memory serves, limit / stop prices on stocks had to conform to the fractional pricing, even back then. This may have been and probably is still different for the big boys and their special treatment (fractional cents).

This implies backtesting is at present and has been in the past a little too optimistic on fills. Do you agree?

I see this as a three (3) part problem:

1. Ideally, this type of stock data (including inception dates, which I agree makes it more complicated) should be collected and stored in an editable table for proper use in Wealth-Lab.
2. Wealth-Lab should reference this collected data as it does now for futures and automatically adjust any prices contained in orders to the proper tick value using Round, Ceiling and Floor functions.
3. Previous backtests using Limit and Stop orders should be rerun for accuracy.

Am I missing something or overreacting?

Does the Wealth-Lab community agree?
profile picture

Cone

#6
QUOTE:
This implies backtesting is at present and has been in the past a little too optimistic on fills.
Backtesting is generally too optimistic using current symbol lists. That said, limit orders fills can be made precise and highly realistic if you use Limit order slippage (which actually makes the result overly pessimistic). If you don't use Wealth-Data for EOD testing, you're often not testing with "realistic" opening prices. (I trade market and limit orders every day, and my live results precisely match my backtests for both order types, except for those handful of days where I'm not filled at the limit price matching the low of the day.)

Anyway, it's a good discussion but this is just a "12 month pilot program". And, there are 3 test groups of symbols, each with different quote and trade requirements. The first group is actually quoted in nickels, but traded in pennies! If you trade those symbols in the second group (see article), it seems that you'll need your strategy to adjust the limit price to conform to your broker's requirements. Example:

CODE:
Please log in to see this code.


profile picture

Dave B.

#7
Thanks Eugene and Robert.

I appreciate you guys taking the time to discuss and even providing a routine to modify prices.

We have decided to implement the automatic data collection part of this issue in our external data collection program. This will automatically gather the tick values of the stocks as they are downloaded. We will then modify the necessary Wealth-Lab routines as you have suggested. We have not implemented Wealth-Data yet.

As always, world-class service.

Dave
profile picture

Eugene

#8
Cone's code from post #6 has been added to Community Components:

RoundToNickel
profile picture

superticker

#9
QUOTE:
Cone: ... there are 3 test groups of symbols, each with different quote and trade requirements. The first group is actually quoted in nickels, but traded in pennies!
In theory that's true. But due to a Fidelity server bug, the first group (G1) also must trade in 0.05 increments--occasionally. See the screenshot below for the 11/30/2016 trading day.

But there's more. I placed a stop order for MOD the day before in 0.01 increments, and the request went through the server okay. So this is an intermittent server bug; your millage will vary. If your order fails through Wealth-Lab server, you might try placing it by another means.

UPDATE: For the 12/1/2016 trading day, I found some more Group 1 (G1) stocks that get rejected by the Fidelity WL orders server: IIVI, SCHN. Will this continue to be the case or should we just nickle round all stop/limit order prices for all Group 1 stocks as well? Either way works for me.
profile picture

superticker

#10
Here's a simple Quantize (Quant) class that will round appropriately based on stocks entered into the Symbol Info Manager. It may be included it in the Community.Components library if you like. If you're including it in your own class library, change the Superticker.Components namespace to your own class library namespace.
CODE:
Please log in to see this code.

To use it, you need to call the Quant(Bars) constructor near the very top of the Execute{ } procedure as shown. Most of the internal testing occurs inside the constructor so that overhead stays out of the trading loop.
CODE:
Please log in to see this code.

Then the Round member function, refName.Rnd(proposedPrice), needs to be included with all the prices for every Stop and Limit order directive inside the trading loop as shown. If no rounding is required, the proposedPrice simply passes through the Rnd() call. Otherwise, if rounding is required, the rounded price is returned.
CODE:
Please log in to see this code.

Finally, one needs to include all symbols that require rounded pricing in the Symbol Info Manager, which is found under the WL Tools menu. For each symbol, be sure to set Type to "Equity" and Tick to "0.05" if you want it to round to the nearest nickel.
profile picture

Frank1972

#11
Here is an implementation that does the following:
- Downloads the http://tsp.finra.org/finra_org/ticksizepilot/TSPilotSecurities.txt file
- Processes that file into a class structure that holds the data
- Processes the PilotData and all of the group 2 securities are then put into SymbolInfo.xml
- If SymbolInfo.xml exists it will process and update this file.
- If SymbolInfo.xml does not exist it will create one and add the TSPilotSecurities to it.

The assumption here is that only group 2 needs to be put into SymbolInfo.xml. If this wrong it can be changed by modifying:
CODE:
Please log in to see this code.
I have tested this. The code below is a console application called "UpdateSymbolInfoWithPilotData" created using Visual Studio. The assumption is that you can run this code once each day before or after the market opens or closes, as the file may be updated each day at or after 2:00 PM EST. The other assumption is that all the symbols that matter are in the TSPilotSecurities.txt and not the TSPilotChanges.txt. If I am wrong about this please let me know and I will update the code.

The way that I know which symbols should be removed or replaced is that there is comment in the SymbolInfo.xml. All SymbolInfo below this comment is considered to be part of the Securities in the Pilot Data. If there is a symbol above this comment the code will modify the entries but won't remove it from SymbolInfo.xml. Because of this you cannot use the Symbol Info Manager because it will overwrite SymbolInfo.xml and remove the comment. This is how I choose to implement this and may not work for everyone.

I hope that this may be helpful to others.

-Frank

Sample SymbolInfo.xml to show the comment and layout of the file that I used to test this code.

CODE:
Please log in to see this code.


CODE:
Please log in to see this code.
profile picture

Eugene

#12
Frank, thanks for sharing!
profile picture

Eugene

#13
In a deleted duplicate thread, 123blee9 wrote:

I'm analyzing a stock that participates in the tick size pilot program.

http://www.nasdaq.com/article/tick-size-pilot-program-what-investors-need-to-know-cm688067

The tick size for the stock of interest has changed from 1-cent to 5-cent tick increments.

I can easily round buy/sell prices to the nearest nickel [ Math.Round(Price*20,0)/20 ], but WLP will take 1-cent entry/exits based on market movement. Is there a way to force WLP to enter/exit only at prices in 5-cent increments?

Thanks