| Overall Statistics |
|
Total Orders 4 Average Win 0% Average Loss 0% Compounding Annual Return 1687224.131% Drawdown 2.600% Expectancy 0 Start Equity 100000 End Equity 107400 Net Profit 7.400% Sharpe Ratio 21293.56 Sortino Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 16442.571 Beta -3.647 Annual Standard Deviation 0.772 Annual Variance 0.597 Information Ratio 16712.132 Tracking Error 0.984 Treynor Ratio -4509.618 Total Fees $0.00 Estimated Strategy Capacity $110000.00 Lowest Capacity Asset SPXW XUXKECCC3AJ2|SPX 31 Portfolio Turnover 4.98% |
#region imports
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Util;
using QuantConnect.Data;
using QuantConnect.Orders;
using QuantConnect.Orders.Fees;
using QuantConnect.Orders.Fills;
using QuantConnect.Securities;
using QuantConnect.Securities.Option;
#endregion
namespace QuantConnect.Algorithm.CSharp
{
class MySecurityInitializer : BrokerageModelSecurityInitializer
{
public MySecurityInitializer(Brokerages.IBrokerageModel brokerageModel, ISecuritySeeder securitySeeder)
: base(brokerageModel, securitySeeder) { }
public override void Initialize(Security security)
{
base.Initialize(security);
if (security.Type is SecurityType.IndexOption)
{
// Uncomment next line to fix
//(security as Option).SetOptionAssignmentModel(new NullOptionAssignmentModel());
}
}
}
public class LogicalBlueLemur : QCAlgorithm
{
private Symbol _spxw;
private bool _done;
private bool _doSpread1 = true;
private bool _doSpread2 = true;
public override void Initialize()
{
SetSecurityInitializer(new MySecurityInitializer(BrokerageModel, new FuncSecuritySeeder(GetLastKnownPrices)));
SetStartDate(2022, 1, 3);
SetEndDate(2022, 1, 5);
SetCash(100000);
var index = AddIndex("SPX", Resolution.Minute).Symbol;
var option = AddIndexOption(index, "SPXW", Resolution.Minute);
option.SetFilter(x => x.IncludeWeeklys().Strikes(-20, 20).Expiration(1, 4));
_spxw = option.Symbol;
}
public override void OnData(Slice slice)
{
if (Time.Date == new DateTime(2022, 1, 3) && _doSpread1)
{
if (!slice.OptionChains.TryGetValue(_spxw, out var chain)) return;
Debug($"{Time}: remaining margin before spread 1: {Portfolio.MarginRemaining}");
var spread = OptionStrategies.BearCallSpread(_spxw, 4730, 4780, new DateTime(2022, 1, 5));
Buy(spread, 1);
Debug($"{Time}: remaining margin after spread 1: {Portfolio.MarginRemaining}");
_doSpread1 = false;
}
if (Time.Date == new DateTime(2022, 1, 4) && _doSpread2)
{
if (!slice.OptionChains.TryGetValue(_spxw, out var chain)) return;
Debug($"{Time}: remaining margin before spread 2: {Portfolio.MarginRemaining}");
var spread = OptionStrategies.BearCallSpread(_spxw, 4760, 4810, new DateTime(2022, 1, 5));
Buy(spread, 1);
Debug($"{Time}: remaining margin after spread 2: {Portfolio.MarginRemaining}");
_doSpread2 = false;
}
}
public override void OnEndOfAlgorithm()
{
Debug($"{Time}: remaining margin final: {Portfolio.MarginRemaining}");
}
}
}