| Overall Statistics |
|
Total Trades 10 Average Win 0.84% Average Loss -1.01% Compounding Annual Return -16.138% Drawdown 0.800% Expectancy -0.084 Net Profit -0.385% Sharpe Ratio -3.561 Loss Rate 50% Win Rate 50% Profit-Loss Ratio 0.83 Alpha 0.01 Beta 0.068 Annual Standard Deviation 0.039 Annual Variance 0.002 Information Ratio 13.738 Tracking Error 0.148 Treynor Ratio -2.019 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, 01, 01);
SetEndDate(2016, 01, 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(5);
}
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(3);
}
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);
Debug(string.Format("{0} straddle orders submitted", symbol.Underlying));
}
}
}
public override void OnSecuritiesChanged(SecurityChanges changes)
{
foreach (var security in changes.RemovedSecurities)
{
if (security.Invested)
{
Liquidate(security.Symbol);
Debug("Sold back: " + 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;
Debug("Bought: " + security.Symbol);
var option = AddOption(security.Symbol.Value);
option.SetFilter(-2, 2, TimeSpan.FromDays(30), TimeSpan.FromDays(45));
}
}
}
}