| Overall Statistics |
|
Total Trades 10 Average Win 0% Average Loss 0% Compounding Annual Return -68.915% Drawdown 2.900% Expectancy 0 Net Profit 0% Sharpe Ratio -4.573 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha -1.166 Beta 0.436 Annual Standard Deviation 0.173 Annual Variance 0.03 Information Ratio -9.119 Tracking Error 0.181 Treynor Ratio -1.816 Total Fees $2.50 |
using QuantConnect.Securities.Option;
namespace QuantConnect
{
public class StraddleFundamentalAlgorithm : QCAlgorithm
{
private List<Symbol> _symbols = new List<Symbol>();
public override void Initialize()
{
UniverseSettings.Resolution = Resolution.Daily;
SetStartDate(2016, 03, 01);
SetEndDate(2016, 03, 09);
SetCash(10000);
AddUniverse(CoarseSelectionFunction, FineSelectionFunction);
}
public IEnumerable<Symbol> CoarseSelectionFunction(IEnumerable<CoarseFundamental> coarse) {
return coarse
.Where(x => x.HasFundamentalData)
.OrderByDescending(x => x.DollarVolume)
.Select(x => x.Symbol).Take(15);
}
public IEnumerable<Symbol> FineSelectionFunction(IEnumerable<FineFundamental> fine) {
return fine
.Where(x =>
// More than 7 days after earnings report
Time >= x.EarningReports.FileDate.AddDays(-7) &&
Time >= x.EarningReports.FileDate.AddDays(0) &&
// Invalid FileDate
x.EarningReports.FileDate != new DateTime())
.Select(x => x.Symbol).Take(5);
}
public override void OnData(Slice data) {
foreach (var kvp in data.OptionChains) {
var chain = kvp.Value;
var symbol = kvp.Key;
if (_symbols.Contains(symbol.Underlying)) return;
var atmStraddle = chain
.OrderBy(x => Math.Abs(chain.Underlying.Price - x.Strike))
.ThenByDescending(x => x.Expiry)
.FirstOrDefault();
if (atmStraddle != null)
{
_symbols.Add(symbol.Underlying);
Buy(OptionStrategies.Straddle(symbol, atmStraddle.Strike, atmStraddle.Expiry), 1);
Log(string.Format("{0} straddle orders submitted", symbol.Underlying));
}
}
}
public override void OnSecuritiesChanged(SecurityChanges changes)
{
foreach (var security in changes.RemovedSecurities)
{
if (security is Option) continue;
Log(security.Symbol);
}
// Add option for every added security
foreach (var security in changes.AddedSecurities)
{
if (security is Option) continue;
if (security.Symbol.Equals("SPY")) continue;
var option = AddOption(security.Symbol.Value);
option.SetFilter(-2, 2, TimeSpan.Zero, TimeSpan.FromDays(45));
}
}
}
}