| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio NaN Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio NaN Tracking Error NaN Treynor Ratio NaN Total Fees $0.00 |
namespace QuantConnect
{
/*
* QuantConnect University: Futures Example
*
* QuantConnect allows importing generic data sources! This example demonstrates importing a futures
* data from the popular open data source Quandl.
*
* QuantConnect has a special deal with Quandl giving you access to Stevens Continuous Futurs (SCF) for free.
* If you'd like to download SCF for local backtesting, you can download it through Quandl.com.
*/
public class DualMomentumSectorRotation : QCAlgorithm
{
// we'll use this to tell us when the month has ended
DateTime LastRotationTime = DateTime.MinValue;
TimeSpan RotationInterval = TimeSpan.FromDays(30);
List<string> GEMSymbols = new List<string>
{
"SPY",
"ACWI",
"BIL",
"AGG"
};
// these are the growth symbols we'll rotate through
List<string> SectorSymbols = new List<string>
{
"XLV", //healthcare
"XLK", //technology
"XLI", //industrial
"XLU", //utilities
"XLF", //financials
"XLY", //consumerdisc
"XLP", //consumerstap
"XLB", //basic materials
"XLE", // energy
"PSR", //real estate
"IYZ" // communications
};
// we'll hold some computed data in these guys
List<SymbolData> SectorSymbolData = new List<SymbolData>();
List<SymbolData> GEMSymbolData = new List<SymbolData>();
List<SymbolData> strongSectors = new List<SymbolData>();
// Indicators
//Momentum _momSPY;
//Momentum _momACWI;
//Momentum _momTbill;
//DateTime sampledToday = DateTime.Now;
public override void Initialize()
{
SetStartDate(2004, 1, 1);
SetEndDate(DateTime.Now.Date.AddDays(-1));
SetCash(25000);
foreach (var symbol in SectorSymbols)
{
AddSecurity(SecurityType.Equity, symbol, Resolution.Minute);
Securities[symbol].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);
var momentum = MOM(symbol, 252, Resolution.Daily);
SectorSymbolData.Add(new SymbolData
{
Symbol = symbol,
MomScore = momentum
});
}
foreach (var symbol in GEMSymbols)
{
AddSecurity(SecurityType.Equity, symbol, Resolution.Minute);
Securities[symbol].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);
var momentum = MOM(symbol, 252, Resolution.Daily);
GEMSymbolData.Add(new SymbolData
{
Symbol = symbol,
MomScore = momentum
});
}
}
private bool first = true;
//Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
public void OnData(TradeBars data)
{
if (first)
{
first = false;
LastRotationTime = data.Time;
return;
}
var delta = data.Time.Subtract(LastRotationTime);
var _momSPY = GEMSymbolData[1].MomScore;
var _momTbill = GEMSymbolData[3].MomScore;
var Bonds = GEMSymbolData[2].Symbol;
if (delta > RotationInterval)
{
LastRotationTime = data.Time;
var orderedMomScores = SectorSymbolData.OrderByDescending(x => x.MomScore).ToList();
strongSectors = orderedMomScores.Where(val => val.MomScore >= GEMSymbolData[1].MomScore).ToList();
foreach (var x in orderedMomScores)
{
Log(">>SCORE>>" + x.Symbol + ">>" + x.MomScore);
}
foreach (var y in strongSectors)
{
Log(">>STRONG SCORE>>" + y.Symbol + ">>" + y.MomScore);
}
}
if (!_momSPY.IsReady) return;
decimal holdingPercent = .5m;
if (_momSPY >= 0 && _momSPY > _momTbill)
{
Liquidate();
foreach (var etf in strongSectors)
{
SetHoldings(etf.Symbol, .1m);
Log("Count of stronSectors is "+ strongSectors.Count);
}
} else
{
if(Portfolio[Bonds].Quantity > 0) return;
Liquidate();
SetHoldings(Bonds, holdingPercent);
Log("Set Holdings to " + Portfolio[Bonds].Quantity + "of " + Bonds);
}
}
}
class SymbolData
{
public string Symbol;
public Momentum MomScore { get; set; }
}
}