Overall Statistics |
Total Orders 9 Average Win 0% Average Loss -0.01% Compounding Annual Return -1.125% Drawdown 0.200% Expectancy -1 Start Equity 10000000 End Equity 9990076 Net Profit -0.099% Sharpe Ratio -2.204 Sortino Ratio -1.988 Probabilistic Sharpe Ratio 16.122% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.012 Beta 0.03 Annual Standard Deviation 0.005 Annual Variance 0 Information Ratio -0.514 Tracking Error 0.132 Treynor Ratio -0.347 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset SPX 31 Portfolio Turnover 0.42% |
#region imports using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Globalization; using System.Drawing; using QuantConnect; using QuantConnect.Algorithm.Framework; using QuantConnect.Algorithm.Framework.Selection; using QuantConnect.Algorithm.Framework.Alphas; using QuantConnect.Algorithm.Framework.Portfolio; using QuantConnect.Algorithm.Framework.Portfolio.SignalExports; using QuantConnect.Algorithm.Framework.Execution; using QuantConnect.Algorithm.Framework.Risk; using QuantConnect.Algorithm.Selection; using QuantConnect.Api; using QuantConnect.Parameters; using QuantConnect.Benchmarks; using QuantConnect.Brokerages; using QuantConnect.Configuration; using QuantConnect.Util; using QuantConnect.Interfaces; using QuantConnect.Algorithm; using QuantConnect.Indicators; using QuantConnect.Data; using QuantConnect.Data.Auxiliary; using QuantConnect.Data.Consolidators; using QuantConnect.Data.Custom; using QuantConnect.Data.Custom.IconicTypes; using QuantConnect.DataSource; using QuantConnect.Data.Fundamental; using QuantConnect.Data.Market; using QuantConnect.Data.Shortable; using QuantConnect.Data.UniverseSelection; using QuantConnect.Notifications; using QuantConnect.Orders; using QuantConnect.Orders.Fees; using QuantConnect.Orders.Fills; using QuantConnect.Orders.OptionExercise; using QuantConnect.Orders.Slippage; using QuantConnect.Orders.TimeInForces; using QuantConnect.Python; using QuantConnect.Scheduling; using QuantConnect.Securities; using QuantConnect.Securities.Index; using QuantConnect.Securities.Future; using QuantConnect.Securities.Option; using QuantConnect.Securities.Positions; using QuantConnect.Securities.Forex; using QuantConnect.Securities.Crypto; using QuantConnect.Securities.CryptoFuture; using QuantConnect.Securities.Interfaces; using QuantConnect.Securities.Volatility; using QuantConnect.Storage; using QuantConnect.Statistics; using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm; using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm; #endregion namespace QuantConnect { public class IndexOptionsUniverseAlgorithm : QCAlgorithm { private Symbol _index, _optionSymbol, _hedge; public override void Initialize() { SetStartDate(2021, 1, 1); SetEndDate(2021, 2, 1); SetCash(10000000); // Asynchronous can use computational resources efficiently UniverseSettings.Asynchronous = true; // Subscribe to the underlying for the underlying position // Set the data normalization mode to raw for strike price comparability _index = AddIndex("SPX").Symbol; // Requesting option data and filter for the hedge candidates var option = AddIndexOption(_index); _optionSymbol = option.Symbol; option.SetFilter(OptionFilter); // Set scheduled event to buy a hedge option contract at market open to eliminate the intra-day movement Schedule.On( DateRules.EveryDay(_index), TimeRules.AfterMarketOpen(_index, 1), BuyHedgeContract ); // Set a scheduled event to sell the hedge contract before market close, since we want to earn from inter-day movement // Leave 2 minutes contingency to fill Schedule.On( DateRules.EveryDay(_index), TimeRules.BeforeMarketClose(_index, 2), SellHedgeContract ); } private OptionFilterUniverse OptionFilter(OptionFilterUniverse universe) { // Select the contracts with delta very close to -1 and high open interest // This can effectively hedge most of the price change of the underlying and ensure the liquidity // Make sure the contract is expiring close for its tradbility return universe .IncludeWeeklys() .PutsOnly() .Expiration(2, 7) .Delta(-1m, -0.95m) .OpenInterest(10, 1000); } private void BuyHedgeContract() { if (CurrentSlice.OptionChains.TryGetValue(_optionSymbol, out var chain)) { // Order the underlying if not hold, the order size should match the option contract // Order only if option chain data ready for hedging if (!Portfolio[_index].Invested) { MarketOrder(_index, Securities[_optionSymbol].SymbolProperties.ContractMultiplier); } // Get the contract with delta closest to -1 (lowest possible delta) var contract = chain.MinBy(x => x.Greeks.Delta); _hedge = contract.Symbol; // Buy 1 deep ITM put with delta close to -1 to eliminate the intraday movement MarketOrder(_hedge, 1); } } private void SellHedgeContract() { // Check if any hedge contract position, if so, liquidate before market close to expose to underlying overnight movement if (_hedge != null) { Liquidate(_hedge); _hedge = null; } } } }