Backtest Setup
Last updated
Last updated
To create a new backtest, hit the “New Backtest” button on your dashboard
We offer backtesting in SPY, SPX, QQQ, IWM, AAPL and TSLA.
You can test as far back as 1/1/13 and as most recent as yesterday.
Since the stock market (and our tester) is based off US New York Time (GMT-5), please be aware internationally of the date/time you select.
We have some nice little bubbles with popular timeframes that will auto populate for you
If you notice on the “End Date” field, we have a little arrow. That will populate the last available trading day
Under the “Strategy” section, we have a list of common strategies that you can choose from if you don’t want to create your own. Below is information about each one.
Please note, all examples are from The Options Playbook and tastylive.
You can create a custom strategy by clicking the Add Leg option. You can add up to 8 legs for backtesting in one test.
Please note, you can only choose one selection for all legs in the trade.
By default, the option legs will be based on delta. However, there is also a % (OTM), a fixed premium, and a strike offset choice.
You can also use Percentage OTM (Out of the Money)
You can also use Fixed Premium
You can also use Strike Offset– if you select this– it will open up additional choices.
You can also select multiple types of leg selection criteria.
Clicking on the delta icon in the 15 delta 1 DTE call short below, for instance, brings up a choice of the different strike selection criteria.
What is an option leg? At the end of the day, a leg is made up of type (put or call), direction (buy or sell), and days to expiration (DTE)
You can choose the type (put or call)
Also the action (buy or sell)
quantity (qty) of each leg
Child/dependent legs can now be selected using either fixed premium or delta in conjunction with a maximum distance from the parent leg.
E.g., you can sell a $3.50 put, and buy a $0.05 long put that is no more than 75 points away from the short. If a 0.05 put is closer than 75 points (e.g., 50 points out), then that strike will be selected. On the other hand, if there is no $0.05 put 75 points away, then the put closest to $0.05 that is within 75 points will be selected.
There are some strategies that require different things. For instance, when you are selling a put spread that is 10-wide, you will need to know what the short leg’s strike is before you can buy a leg 10 points away. Another example would be if you are buying a calendar. You will need to know what the short strike is for the front month before you can purchase the long strike for the back month. To solve this, Option Omega uses the concept of “Linked Legs”.
In order to link a leg, we will use this magical button here:
When you click that button you will see that the button highlights and a new leg drops down underneath.
Notice on the bottom leg that the spot where your selection type goes looks different than the one above.
We default this to 0 for you. That means that as it currently stands, the bottom leg will be the same strike price as the top leg. This is useful for time spreads where you have different option legs with different days to expiration. For example, a common long calendar strategy:
Let’s say we wanted to sell a 25 delta put spread and we wanted the spread to be 10 points wide. How would we go about setting that up?
The top leg shows us selling a 25 delta put and the bottom leg has an offset of -10. It is important to remember that negative values in the offset mean down the option chain.
How about if we wanted to sell a 25 delta call spread and we wanted the spread to be 50 points wide. How would we go about setting that up?
The top leg shows us selling a 25 delta call and the bottom leg has an offset of +50. It is important to remember that positive values in the offset mean up the option chain.
Let’s say you want to use two delta variables to test a strategy instead of two using linked legs. Just unlink the legs and select the deltas you want.
Strikes can be rounded to the nearest multiple. – This should be used to target higher liquidity strikes (e.g., xx00/25/50/75 on SPX, or whole numbers on SPY)
The padlock next to the strike legs is on by default. You can click it to turn it off.
In the default mode (on), the trade will only execute if there is an option at the strike.
If the box is turned off (white, unlocked), then the tester will find the nearest strike by absolute value.
Entry conditions allow you to run a backtest only when certain conditions are met.
Entry Time
please note: The available entry times are between 9:32am and 3:59pm EST. This is for “market time” (i.e. New York time in the USA). International users may have to adjust their clocks accordingly. Browser or system settings may impact this.
How often do you run your backtest is one of the most important questions you will need to think through when setting up your strategy.
Before diving into the frequencies available to run your backtests, we need explain a very simple but very important toggle:
Use Exact DTE
This little button says that we want to run our strategy ONLY when there is an option contract that has our EXACT DTE. What does this mean?
Let’s look at a calendar strategy as an example.
If you have the “Use Exact DTE” button toggled, this test will only run IF there is BOTH a 15 DTE AND a 20 DTE available. Not 14 and 19. Not 16 and 21. ONLY a 15 DTE and a 20 DTE.
Note: SPX is only afternoon contracts– no morning expiries!
Additional Note: If exact DTE is unchecked, and there is not an options expiry on the date selected, the backtester will pick the next available expiry date.
Daily
If you choose daily, Option Omega will run this strategy every day that you:
Have the funds available to run it (more on this later)
Have not exceeded the “max open trades” threshold that you set (more on this later)
Weekly
If you choose weekly, Option Omega will run this strategy every weekday (that you select) where you:
Have the funds available to run it (more on this later)
Have not exceeded the “max open trades” threshold that you set (more on this later)
Monthly
If you choose weekly, Option Omega will run this strategy every day of the month (that you select) where you:
Have the funds available to run it (more on this later)
Have not exceeded the “max open trades” threshold that you set (more on this later)
Specific Dates
Specific dates allows you to choose a whitelist of dates that you want to trade.
Format is the same as blackout dates (i.e. Please use a list of comma-separated ISO-formatted dates! E.g.: 2022-05-25,2022-04-21).
All other conditions (VIX filters, TA, date range, etc.) still apply.
Note: Blackout dates are used only for initial entry of dates, not reentering.
As an alternate to a mechanical, timed trade, you can now choose to open a trade whenever entry conditions are met, e.g. intraday movement, regardless of the specific time. Toggle “Use Floating Entry Time” and optionally specify min and max entry times.
You must still specify a “range” of times during a day to use floating entry.
Note– this only “works” with certain entry triggers, such as underlying point move.
Tests can how have multiple entry times. This allows for entering the same trade at various times throughout the day. Up to 20 additional entry times are allowed per test.
Notes: margin requirements, max contracts, etc. are applied per tranche. Also, multiple entries cannot be used with floating time entry nor trade reentry.
This is the amount of money you want to start the test with. It will obviously change as your p/l changes.
This is the percentage of your starting funds that you want to use for each test. Let’s think through a couple of examples.
Let’s say you want to sell a call credit spread 5 points out. Assuming you are starting with over 1k in funds, you should be able to run through a couple of trades in the test before you were ever in danger of running out of funds.
Now, let’s say you wanted to sell a naked call with your starting funds at 1k. Would this run? No it would not. Why? Because naked options require more margin than spreads.
Quite often, we get asked why the number of contracts per trade seem to increase or decrease through the life of the trade. The reason is that Option Omega is dynamically running your strategy using the starting funds and the margin allocation % that you put in place. When in doubt, check these fields.
Please note: While we have made every effort to have accurate and realistic margin modeling, margin requirements vary between brokerages, and not all trades are supported.
This is the amount of trades you want to have on at any one time through the life of the test.
Let’s say you are selling a put credit spread 120 days out and you are doing it everyday that you have the capital available to place the trade. If you start with a million dollars and you are allocating 2% of your margin allocation, you theoretically could have hundreds of trades on your book. This option allows you to put in place a limit on how many trades you can have on at any given time. With this you are basically saying that no matter how much money and how high an allocation I am using, never have open more than x-number of trades at any given time.
You may notice that little toggle to the right that says, “Prune Oldest Trades”. If you want to have x-number of trades on but you want to continue the strategy, you can toggle this on. What it will do is close the oldest trade on your books before opening a new one.
If you would like to bypass all of the allocation work that is done through Option Omega, than you can simply put 1 (or another number) in this field. That way, the backtester will ever only use one contract per trade, no matter how much your allocation % is or what your starting funds are.
Another scenario where this comes in handy is if your strategy is hugely successfull over time! Let’s imagine a strategy that won 99.9% of the time while suffering only a 1% drawdown (If you find this please email us immediately!). If you are starting with 10k in funds and allocating 100% to this strategy, you would quickly be putting on thousands of contracts at one time. To be more realistic, you might want to limit the number of contracts to a reasonable representation of what you think you could get filled on.
Capping the contracts does have an impact on the performance metrics. It may limit both the number of winners, and losers. Due to sequence of return risk, this can have a significant impact on the viability of a strategy. In other words, it will bias a backtest depending on when wins/losses occur. Many users chose to always leave this blank in order to see the maximum drawdown the backtester experienced during the selected timeframe.
If Max Contracts Per Trade is enabled, an option to ignore margin requirements is available. This has been requested by community members who wish to completely disregard any margin simulations and just want to test a strategy without BP/margin limits.
Use Cases: this will be helpful to those with portfolio margin, or if your brokerage’s requirements differ from the tester and you know precisely how many lots you will be trading each month, or if you want to test short straddles with reusable longs, etc. Margin requirements vary by broker– but this toggle will allow the user to have an even more open sandbox.
You can set a minimum or maximum VIX level as an entry condition. For instance, you are buying a double calendar but you only want to do it in environments where the VIX is under 20. Another example would be you are selling a put credit spread but you only want to enter if the VIX is over 40.
VIX overnight movement can be used as an entry condition, similar to gaps.
Note: Overnight movement is defined as the 4:15 PM VIX price on the previous trading day vs VIX price at market open (first VIX print can be at 9:30, though VIX is sometimes delayed to 9:31-9:33.)
Additional note: if a backtest is scheduled to go on early in the morning, and the VIX has not printed, the backtester will use the last premarket VIX print (typically 9:25) as the opening print to determine when or not to enter the backtest.
Intraday VIX movement is similar to the underlying movement entry condition. Intraday VIX movement will enter a trade when the current VIX price has moved a specified amount (% or points) from the opening (RTH) VIX price.
VIX9D / VIX ratio is also available as both entry and exit conditions. This ratio is useful for trading when short-term volatility is especially high or low. Toggle “Use VIX” to enable these filters.
RSI and SMA are calculated at 1 minute intervals.
The Relative Strength Index (RSI), developed by J. Welles Wilder, is a momentum oscillator that measures the speed and change of price movements. The RSI oscillates between zero and 100. Traditionally the RSI is considered overbought when above 70 and oversold when below 30.
Simple moving averages calculate the average of a range of prices by the number of periods within that range.
We use the current value on the day of the trade, and the closing price of the previous days. For example, a 3-day SMA on July 11 at 1:00 p.m. would be the price at 1 p.m. on the 11th, plus the daily closing price for the two previous trading days.
This is often used for a multi-day strategy, whereas EMA (below) is typically used for an intraday strategy.
There are a variety of ways to calculate many technical indicators, including SMA and RSI. Option Omega uses 1-minute resolution, daily SMA & RSI, and calculates the value on the current day. Charting/broker/modeling software can be setup in different ways. For a user who wishes to match OO, the chart (in Trading View for example), should be the daily timeframe, even though the value is updated on a minute basis.
Exponential moving averages is a type of moving average that calculates price data with weighting to more current data. It is often used for intraday entries/exits, and is in minutes.
Please note: Use positive numbers for all values. Value can be in either points or a percentage, depending on which setting the user has selected.
If you want to trade when the market moves a certain amount up or down, you can enter values into both “min” fields, as shown below, and the condition will trigger when either are true.*
This will enable to you open trades when the market either moves a minimum amount up or down, or conversely under a certain amount, from the previous close to the open of the current day (or a combination of the two). Specificially, it is measuring the overnight gap, from previous trading day close, to official RTH open the following trading day.
Only trade when the underlying price moves a certain amount from open of day to entry time. Note: movement can be specified in either percent or points
Min DIX/Max DIX
Min GEX/Max GEX
Market Makers’ Gamma Exposure (billions $)
Min GEX/Max GXV
Gamma Volatility; “1-day volatility historically associated with the given level of GEX”
*Please note: A historical low of GXV would be around a 6. A historical high GXV would be above 30 *
Opening Range Breakout (ORB) is available as an entry condition. This is most often used in conjunction with floating time entry to wait until price breaks outside of the opening range.
There are two times to be aware of with an ORB. The range end time is from RTH open (9:30 a.m.) until the user specified time. The default range is based on one minute data ("candle"). If "Use High-Low Values to Calculate Opening Range" is also selected (like in the above picture), the default range will include the high-low of the values ("wick").
The other time to be aware of is the backtest entry time. Often use with floating time entry, this requires the opening price of the minute to be outside the breakout range for the backtest to put the trade on.
A breakout condition can be a low breakout, a high breakout, or both.
Leg Groups (Single Entry Multi Exit a.k.a. SEME)
Legs can be grouped, allowing for separate exit conditions per group. E.g., enter a condor, but exit the call and put sides separately. Or enter as a credit spread, but exit the short upon SL and leave the long as a runner. This should allow for increased accuracy for margin requirements and improved speed of iteration on testing in general.
To use, leg groups, simply make the selection, and click on the leg(s) to group them. Note– the tester will not, currently, check for margin requirement if you happen to exit, e.g., the long leg of a spread before the short leg.
Note: this feature acts as single entry -> multi exit; thus, if you choose to use “reenter trades upon exit” for one leg group, the entire trade will be reentered.
When testing a strategy, you can set a profit target using three different methods:
Percentage
Let’s say you have a put credit spread you are selling. You want to close the trade when the spread has lost 10% of its value.
Perhaps you have a put debit spread that you bought. You want to close the trade when the spread has gained 10% of its value.
Fixed Profit
If you buy $1 calls and want to make $5 profit, then enter 5 for the profit target. Note that, as in the rest of the tester, this is similar to the way a broker treats the option (x100). So, in this case a $5 PT would be $500.
Closing Order
You want to set a closing order at a certain price and get out when that price is filled.
You can also set a stop loss using the same three methods
Percentage
Let’s say you have a put credit spread you are selling. You want to close the trade when the spread has gained 10% of its value.
Perhaps you have a put debit spread that you bought. You want to close the trade when the spread has lost 10% of its value.
Fixed Profit
If you buy $1 calls and want to lose $4 max, then enter 4 for the stop loss. Note that, as in the rest of the tester, this is similar to the way a broker treats the option (x100). So, in this case a $4 max loss would be $400.
Closing Order
You want to set a closing order at a certain price and get out when that price is filled.
In order for the per-leg stop loss choice to appear, you first need to enter a value into the stop loss field.
Selecting this option will cause the whole spread to be closed based on the stop loss of the individual leg.
Note: This is a niche option, and should only be used if you have a specific use case. It is off by default.
If a stop loss is enabled, the backtester will give the option to trail stops. You can trail immediately, or after a minimum profit target is reached.
There are two different trailing percentage types. If trailing stops are used with a percentage-based stop, then the trail will be recalculated as a percentage of current premium if ‘recalculated’ is selected. If ‘fixed’ is selected, then the trail is instead based upon a percentage of the initial premium.
For SPX and SPY backtests, there is an additional choice to use Intra-Minute Stops (IMSL) for 0 DTE if a stop loss is enabled. If you have a 0 DTE test, the IMSL can be applied to the entire test. If you have a longer DTE backtest, the IMSL will only be available when ALL legs are 0 DTE. For example, a calendarized trade will not have the option of IMSL.
Normally, the backtester uses 1-minute NBBO calculated mids to determine options pricing. IMSL works like this: At every one minute interval, the tester will use the high/low values for each contract to determine whether your stop loss was triggered. High/low values are comprised of both NBBO bid/ask and actual trades within each minute.
You can select NBBO by itself, or NBBO + trades (with trades will result in the most stops) for IMSL.
Profit actions allows you to scale out of a percentage of each trade at certain profit targets, adjust your stop loss, or both!
Any remaining allocation will fall back to the main PT/SL parameters (if specified) and/or remaining exit conditions.
The trade log will show each time a partial profit is taken as well as the quantity closed
This toggle is used for when you want to exit the trade before expiration.
Using DTE (Days to expiry)
Let’s say you have a 45 DTE put spread. You can use this to say you would like to exit at a certain number of days before expiration. Note, here, as in other places, the DTE is calendar days, not trading days.
Using DIT (Days in Trade)
Let’s say you have a 45 DTE put spread. You can use this to say you would like to exit once you have been in the trade a certain number of days.
Using MIT (Minutes in Trade)
Exits a trade after a certain number of minutes in the trade.
Early Exit Time
You can also specify the time you would like to get out.
please note: best practice is to have an early exit date . If you don’t have an early exit date, the tester will default to using the 0DTE (closing date) as the date.
Time actions are a way make adjustments to a trade based upon specific times. You can close a percentage of the trade, adjust the PT, or adjust the SL at certain DTE, DIT, MIT or at a given time. If no action type is specified, the tester uses 0 DTE.
Note: both PT and SL adjustments are based upon the initial premium, not the premium at the time of adjustment, unlike profit actions.
As is with entry conditions, you can also exit the trade when certain technical indicators are set. Please see “Entry Conditions” for more detail.
For example:
If you're using Min RSI 60 as an exit, then the trade will exit when the RSI is below 60.
If you're using Max RSI 70 as an exit, then the trade will exit when the RSI is above 70.
If you're using Below SMA Exit 5, then the trade will exit if the SMA is below 5.
You can also exit when the out of the money short is touched on your trade. Let’s say you are selling a put credit spread. You can choose to exit when the short in that spread is touched. You can also specify how many points before or after it is touched that you want to exit.
Users can use a negative number to denote an exit past the underlying.
Note: This is an exit— it is not a stop loss. Like the default data in Option Omega, it is on a one minute timeframe, meaning that the the level is sampled on the same 1-minute data (i.e. it does not look at OHLC of the minute).
Trades will be closed when the underlying price moves up or down the specified amount- use positive numbers.
Both exit when tested and exit when underlying price moves also have %/point toggles to allow better testing of multi-year strategies
Delta exits are available in position delta and leg delta. Since deltas in OO can use both positive and negative numbers, it is often helpful to visualize using a number scale (i.e. -50 is below -45).
Trades will be close when the delta of the entire position is below/above the specified amount; use positive for long delta and negative for short delta.
You can add leg deltas to exit below or above leg deltas.
Here is an example. This is a 40 delta, 1 /3 Call Calendar. It is set to exit the sold call below leg delta of -75.
We can see in the example, as the market pumped up, above the strike, the backtest exited when the short call (originally 40 delta), was below that leg's delta of -75. A simple way to think about is this: as the calendar in the example pumped (into the money), the SHORT leg that the delta exit is based on would have gotten shorter and shorter delta. So, once it got past (short) the-75 delta, the exit was triggered.
VIX and VIX9D exit conditions are available, supporting either a percentage or point-based exit. You can also exit when the ratio of VIX9D to VIX hits a certain number.
Note, these measurements are based upon the change from the time the trade opened in the backtest.
This section has been affectionately called “The Punisher”– and contains a variety toggles meant to make your tests more robust.
If you know ahead of your time what your per-contract fees and commissions are, you can put them here and we will account for those costs in your test.
Slippage can be optionally added to entry, exit or both. This price affects the chosen parameter by the amount listed. This can be especially useful on nearly all backtests, and certainty on high/low delta and lower liquidity strikes.
Note: Slippage is per position. Thus, if you have an Iron Condor, a .10 slippage would be per all 4 legs
If you enable a stop loss, the option for Stop Loss Slippage will appear, allowing you to customize this for stopped exits. Note, you can have both exit and stop loss slippage. The exits will use exit slippage, and stop loss slippage will only be used for stop losses.
Note: Slippage for fixed premium trades was updated in early 2025. Previously, the strikes considered slippage when selecting premium. As of this change though, the fixed premium slippage now works like other slippages. I.E. If you're selling a $3 fixed premium leg, and have $.05 of entry slippage, the strike will be the same and the slippage will be applied so you would receive $2.95 for the leg.
An additional note about FP entry slippage: if there is entry slippage on a leg groups, it will be applied to each leg. For example, if there is a backtest with 3 leg groups and $.15 entry slippage, $.15 will be applied to each leg. If you want $.15 total, in this example you'd use $.05 entry slippage ($.05 x 3= $.15)
There are times when the market gets wonky (Covid Crash, Volmageddan, Vixzilla, etc). If you toggle this, we will ignore trades where the bid/ask widened over 10k basis points (100%). This is also useful for deep ITM/OTM strikes.
Wide-Bid ask is calculated using a standard formula, where If bid-ask spread on any leg is greater than 10,000 bps, we flag the trade as “wide bid-ask”
Let’s say you sell a 90 DTE put spread every day. This test runs from January 1st to January 31st. Presuming you had enough capital, at the end of January 31st, you might have over 30 trades still on.
Toggling this tells Option Omega to close those trades win, lose, or draw when the test date ends.
We cannot pretend overnight gaps won’t affect your trade (nor should we). But what we can do is assume that the profit you received (besides an overnight gap) was as good as you got.
Cap Non-Opening Losses at Stop Loss
Cap losses ignores the value of the stop loss at the minute/IMSL interval, and artificially "caps" the loss at the user-defined limit.
Note: Markets do not cap losses. This choice (like all choices in the backtester), should only be used with a clear understanding of what it does. Backtesters who use this typically use in conjunction with IMSL and healthy stop loss slippage.
One of the chief ways you can strengthen the rigidity of your tests is to make sure you are getting accurate fills.
When this toggle is on we will only exit trades when the max profit is hit for two consecutive time intervals. The trade still exits at the first time interval and price, however. In general, this will make your backtest less forgiving (more robust).
When this toggle is on we will only exit trades when the stop loss is hit for two consecutive time intervals. The trade still exits at the first time interval and price, however. This is designed to account for a brief moment of illiquidity, typically on a longer dated trade. In the backtest simulation, this will make the backtests more forgiving, and less rigorous.
Filter trades that open for premium between these values. Use positive numbers for both values, regardless of whether the strategy is a credit or a debit.
Filter trades that open short/long ratio between these values. The ratio is the total short premium divided by the total long premium.
Sometimes the strategy you want to create requires uniform pricing upon entry. This toggle allows you to limit new trades to ONLY the credit(debit) you want to receive(pay).
Maybe you have been trading awhile and know that there are certain dates in history that you know you would not have traded.
This allows you to enter a list of dates that will be ignored when the tester attempts to enter new trades.
Please use a list of comma-separated ISO-formatted dates! E.g.: 2022-05-25,2022-04-21
Remember, if you want to whitelist days, that option is available in Specific Days as an entry condition.
This feature will allow you to automatically re-enter a trade after specified exit conditions are triggered (stop loss, short tested, etc). You can optionally add a delay before re-entry, as well as a minimum and maximum time of day (most useful for 0 DTE). * Note: the re-entered trade will use the same entry criteria (deltas, widths, DTEs, entry conditions) as the original trade.
Note: Blackout dates are used only for initial entry of dates, not reentering– i.e. if a multi-day trade is opened, and re-entry is selected (which would be a niche case), the re-entry condition with over-ride the blackout.
If you select the down arrow next to the New Backtest button, you will have the ability to save (and share) a backtest.
Shared tests are read-only for others, but will allow others to re-run or save their own copies of said tests. Shared tests are “live”, so when you update the original test, others will see the changes.
You can create a new backtest, or replace an existing backtest.
Share tests by toggling the option in the “save/edit” backtest slider * The “link” icon will copy the shared URL to your clipboard
If you select the clock next to the share backtest button, you will see the recent test run cards- Useful for those who iterate rapidly! After running a test, you should see a clock icon in the test header that will open a slider with a list of recent test runs. Selecting a test from the slider will load all details from that test, including the trade log. The 25 most-recent test runs per session are stored.
The backtester users calendar days to expiry. This is similar to brokers like tastytrade, IBKR, TOS, Etrade, etc. Here’s a on the subject.
may be helpful regarding the whitelist/blackout days features.
SqueezeMetrics provides open access to end-of-day DIX, GEX, and GXV values. Please see for more information.
Dark Index (percentage). “Relative amount of trade volume marked ‘short’ in off-exchange (dark) trading.”
on Option Omega Academy (free class, requires Academy username/pw).
.
Here’s more detail on the profit targets:
.
if you would like to view the full backtest.
If you would like to watch a video dealing with deltas, .
may be helpful, as many of the features are covered in it.
Here’s a on fees, and you can also .
More details on slippage can be found here:
.
Here’s a on it. In essence, this option functions as a "limit order'" in the backtest. I.E. if your profit target is $7 and at one minute the profit is actually at $7.75, selecting this will cap the profits at $7.
More detail here: . In general, this may make your backtest more forgiving, and like all choices, should only be used with a good understanding of the use cases. Typically, it's used on more complex trades that are longer dated (i.e. 30-60-90 day).
Here’s a video on specific dates.
For a real life example, fall of 2023 saw several auction issues between OPRA and CBOE. The option chains had major issues for short times. Some people choose to blackout these days. Here’s a about it.