| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Sortino Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -1.768 Tracking Error 0.1 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset Portfolio Turnover 0% |
# region imports
from AlgorithmImports import *
# endregion
import math, numpy as np
from datetime import timedelta
from math import floor
from decimal import Decimal
from datetime import timedelta
from QuantConnect.DataSource import *
class ChainedUniverseAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2023, 8, 2)
self.SetCash(100000)
self.UniverseSettings.Asynchronous = True
self.UniverseSettings.DataNormalizationMode = DataNormalizationMode.Raw
universe1 = self.AddUniverse(self.FundamentalFunction)
self.AddUniverseOptions(universe1, self.OptionFilterFunction)
universe2 = self.AddUniverse(self.FundamentalFunction2)
self.AddUniverseOptions(universe2, self.OptionFilterFunction)
def FundamentalFunction(self, fundamental: List[Fundamental]) -> List[Symbol]:
filtered = (f for f in fundamental if not np.isnan(f.ValuationRatios.PERatio))
sorted_by_pe_ratio = sorted(filtered, key=lambda f: f.ValuationRatios.PERatio)
return [f.Symbol for f in sorted_by_pe_ratio[:10]]
def FundamentalFunction2(self, fundamental: List[Fundamental]) -> List[Symbol]:
filtered = (f for f in fundamental if not np.isnan(f.ValuationRatios.PERatio))
sorted_by_pe_ratio = sorted(filtered, key=lambda f: f.ValuationRatios.PERatio, reverse=True)
return [f.Symbol for f in sorted_by_pe_ratio[:10]]
def OptionFilterFunction(self, option_filter_universe: OptionFilterUniverse) -> OptionFilterUniverse:
return option_filter_universe.Strikes(-2, +2).Expiration(30, 60)
def OnData(self, data: Slice) -> None:
if self.Time.weekday() == 5:
if self.Time.hour == 10 and self.Time.minute == 30:
for symbol, chain in data.OptionChains.items():
if self.Portfolio[chain.Underlying.Symbol].Invested:
self.Liquidate(chain.Underlying.Symbol)
spot = chain.Underlying.Price
atm_strike = sorted(chain, key=lambda x: abs(x.Strike - chain.Underlying.Price))[0].Strike
calls = [i for i in chain if i.Strike == atm_strike and i.Right == OptionRight.Call]
puts = [i for i in chain if i.Strike == atm_strike and i.Right == OptionRight.Put]
if chain.Underlying.Symbol in universe1:
symbol1 = calls[0].Symbol
self.MarketOrder(symbol1, 1)
symbol2 = puts[0].Symbol
self.MarketOrder(symbol2, 1)
if chain.Underlying.Symbol in universe2:
symbol1 = calls[0].Symbol
self.MarketOrder(symbol1, -1)
symbol2 = puts[0].Symbol
self.MarketOrder(symbol2, -1)