| Overall Statistics |
|
Total Trades 9 Average Win 28.59% Average Loss 0% Compounding Annual Return 879.220% Drawdown 16.000% Expectancy 0 Net Profit 169.964% Sharpe Ratio 3.905 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 1.802 Beta 1.302 Annual Standard Deviation 0.516 Annual Variance 0.266 Information Ratio 3.747 Tracking Error 0.494 Treynor Ratio 1.548 Total Fees $9.00 |
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// This example demonstrates how to add options for a given underlying equity security.
/// It also shows how you can prefilter contracts easily based on strikes and expirations, and how you
/// can inspect the option chain to pick a specific option contract to trade.
/// </summary>
public class BasicTemplateOptionsAlgorithm : QCAlgorithm
{
private const string UnderlyingTicker = "SPY";
public readonly Symbol Underlying = QuantConnect.Symbol.Create(UnderlyingTicker, SecurityType.Equity, Market.USA);
public readonly Symbol OptionSymbol = QuantConnect.Symbol.Create(UnderlyingTicker, SecurityType.Option, Market.USA);
public DateTime Expiry;
public string sym;
public override void Initialize()
{
SetStartDate(2017, 10, 1);
SetEndDate(DateTime.Now);
SetCash(2800);
var equity = AddEquity(UnderlyingTicker);
var option = AddOption(UnderlyingTicker);
// set our strike/expiry filter for this option chain
option.SetFilter(u => u.Strikes(-2, +2)
.Expiration(TimeSpan.FromDays(20), TimeSpan.FromDays(40)));
// use the underlying equity as the benchmark
SetBenchmark(equity.Symbol);
}
/// <summary>
/// Event - v3.0 DATA EVENT HANDLER: (Pattern) Basic template for user to override for receiving all subscription data in a single event
/// </summary>
/// <param name="slice">The current slice of data keyed by symbol string</param>
public override void OnData(Slice slice)
{
if (!Portfolio.Invested && IsMarketOpen(OptionSymbol))
{
OptionChain chain;
if (slice.OptionChains.TryGetValue(OptionSymbol, out chain))
{
// we find at the money (ATM) put contract with farthest expiration
var atmContract = chain
.OrderByDescending(x => x.Expiry)
.ThenBy(x => Math.Abs(chain.Underlying.Price - x.Strike))
.ThenByDescending(x => x.Right)
.FirstOrDefault();
if (atmContract != null)
{
// if found, trade it
SetHoldings(atmContract.Symbol, -.4m);
Expiry = atmContract.Expiry;
sym = atmContract.Symbol;
Log("Expiry " + Expiry);
}
}
}
if (Portfolio.Invested && Expiry-Time <= TimeSpan.FromDays(2))
{
SetHoldings(sym, 0);
}
}
}
}