Framework Template for Selecting and Trading Weekly Put Options
Summary
This QuantConnect example shows how framework components can be assembled into an options algorithm. Its universe model filters for weekly puts near the money with expirations within a short date window, and calls a user-provided selector daily to choose the underlying option chain. The example changes its selected underlying across its brief sample dates.
A constant alpha model emits upward price insights only for option contracts. Portfolio construction maps each insight’s direction to a target quantity of one or negative one, execution is immediate, and risk management is left to a null model. The code demonstrates component wiring and option filtering rather than a tested trading thesis: it does not provide evidence of profitability, explain why the selected puts should rise, or define protective risk controls. The tiny illustrative date range and fixed contract targets also limit what can be inferred about production behavior; contract pricing, liquidity, sizing, and risk handling would need further design.
Key ideas
- The option universe filters for weekly put contracts near the money and with near-term expirations.
- A daily selector function determines which underlying option chain is considered.
- The alpha component emits upward price insights for option contracts only.
- Portfolio construction converts insight direction to a target of one contract in magnitude, while execution is immediate and risk management is null.
- The example demonstrates framework structure, not evidence for a profitable options strategy.
Tags
Full text
# BasicTemplateOptionsFrameworkAlgorithm
# BasicTemplateOptionsFrameworkAlgorithm
Creates option chain universes that select only the earliest expiry ATM weekly put contract
and runs a user defined option_chain_symbol_selector every day to enable choosing different option chains
Basic template options framework algorithm uses framework components to define an algorithm that trades options.
## Source (Apache-2.0)
```python
# QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
# Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from AlgorithmImports import *
from Alphas.ConstantAlphaModel import ConstantAlphaModel
from Selection.OptionUniverseSelectionModel import OptionUniverseSelectionModel
from Execution.ImmediateExecutionModel import ImmediateExecutionModel
from Risk.NullRiskManagementModel import NullRiskManagementModel
### <summary>
### Basic template options framework algorithm uses framework components
### to define an algorithm that trades options.
### </summary>
class BasicTemplateOptionsFrameworkAlgorithm(QCAlgorithm):
def initialize(self):
self.universe_settings.resolution = Resolution.MINUTE
self.set_start_date(2014, 6, 5)
self.set_end_date(2014, 6, 9)
self.set_cash(100000)
# set framework models
self.set_universe_selection(EarliestExpiringWeeklyAtTheMoneyPutOptionUniverseSelectionModel(self.select_option_chain_symbols))
self.set_alpha(ConstantOptionContractAlphaModel(InsightType.PRICE, InsightDirection.UP, timedelta(hours = 0.5)))
self.set_portfolio_construction(SingleSharePortfolioConstructionModel())
self.set_execution(ImmediateExecutionModel())
self.set_risk_management(NullRiskManagementModel())
def select_option_chain_symbols(self, utc_time):
new_york_time = Extensions.convert_from_utc(utc_time, TimeZones.NEW_YORK)
ticker = "TWX" if new_york_time.date() < date(2014, 6, 6) else "AAPL"
return [ Symbol.create(ticker, SecurityType.OPTION, Market.USA, f"?{ticker}") ]
class EarliestExpiringWeeklyAtTheMoneyPutOptionUniverseSelectionModel(OptionUniverseSelectionModel):
'''Creates option chain universes that select only the earliest expiry ATM weekly put contract
and runs a user defined option_chain_symbol_selector every day to enable choosing different option chains'''
def __init__(self, select_option_chain_symbols):
super().__init__(timedelta(1), select_option_chain_symbols)
def filter(self, filter):
'''Defines the option chain universe filter'''
return (filter.strikes(+1, +1)
# Expiration method accepts timedelta objects or integer for days.
# The following statements yield the same filtering criteria
.expiration(0, 7)
# .expiration(timedelta(0), timedelta(7))
.weeklys_only()
.puts_only()
.only_apply_filter_at_market_open())
class ConstantOptionContractAlphaModel(ConstantAlphaModel):
'''Implementation of a constant alpha model that only emits insights for option symbols'''
def __init__(self, type, direction, period):
super().__init__(type, direction, period)
def should_emit_insight(self, utc_time, symbol):
# only emit alpha for option symbols and not underlying equity symbols
if symbol.security_type != SecurityType.OPTION:
return False
return super().should_emit_insight(utc_time, symbol)
class SingleSharePortfolioConstructionModel(PortfolioConstructionModel):
'''Portfolio construction model that sets target quantities to 1 for up insights and -1 for down insights'''
def create_targets(self, algorithm, insights):
targets = []
for insight in insights:
targets.append(PortfolioTarget(insight.symbol, insight.direction))
return targets
```Shown in full with attribution under the source's licence. Licence: Apache-2.0
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.