| Overall Statistics |
|
Total Trades 794 Average Win 1.05% Average Loss -0.41% Compounding Annual Return 52.255% Drawdown 13.000% Expectancy 0.662 Net Profit 140.566% Sharpe Ratio 1.882 Loss Rate 53% Win Rate 47% Profit-Loss Ratio 2.54 Alpha 0.361 Beta 0.026 Annual Standard Deviation 0.193 Annual Variance 0.037 Information Ratio 0.968 Tracking Error 0.253 Treynor Ratio 14.194 Total Fees $800.27 |
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 VolatilityETN : QCAlgorithm
{
string shortTerm = "VXX";
string longTerm = "VXZ";
decimal IVTS = new decimal();
string VIX = "YAHOO/INDEX_VIX";
string VXV = "CBOEFE/INDEX_VXV";
DateTime sampledToday = DateTime.Now;
DateTime compareTime = DateTime.Now;
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
SetStartDate(2010,8,1);
SetEndDate(2012,9,1);
SetCash(25000);
AddSecurity(SecurityType.Equity, shortTerm, Resolution.Minute);
AddSecurity(SecurityType.Equity, longTerm, Resolution.Minute);
AddData<Quandl>(VXV, Resolution.Daily);
AddData<Quandl>(VIX, Resolution.Daily);
}
/// <summary>
/// Event - v3.0 DATA EVENT HANDLER: Basic template for user to override for receiving all subscription data in a single event
/// </summary>
/// <code>
/// TradeBars bars = slice.Bars;
/// Ticks ticks = slice.Ticks;
/// TradeBar spy = slice["SPY"];
/// List<Tick> aaplTicks = slice["AAPL"]
/// Quandl oil = slice["OIL"]
/// dynamic anySymbol = slice[symbol];
/// DataDictionary<Quandl> allQuandlData = slice.Get<Quand>
/// Quandl oil = slice.Get<Quandl>("OIL")
/// </code>
/// <param name="slice">The current slice of data keyed by symbol string</param>
public void OnData(Slice data)
{
// add logic to have orders placed once / day
if (sampledToday.Date == data.Time.Date) return;
if (DateTime.Now.TimeOfDay <= System.TimeSpan.Parse("15:45:00")) return;
Log("Time is "+ DateTime.Now.TimeOfDay);
// gets all Quandl data from our 'Slice' object
var quandls = data.Get<Quandl>();
if (!quandls.ContainsKey(VIX) || !quandls.ContainsKey(VXV)) return;
// IVTS = VIX / VXV
IVTS = quandls[VIX].Value / quandls[VXV].Value;
Log("IVTS is " + IVTS);
// Add buy/sell logic
int count = new int();
if (IVTS <= .91m){
count = 1;
} else if ((0.91m < IVTS) && (IVTS <= 0.97m)) {
count = 2;
} else if (IVTS > .97m && IVTS <= 1.05m) {
count = 3;
} else {
count = 4;
}
Log("Count is " + count);
switch (count)
{
case 1:
SetHoldings(shortTerm, -.6);
SetHoldings(longTerm, .4);
break;
case 2:
SetHoldings(shortTerm, -.32);
SetHoldings(longTerm, .68);
break;
case 3:
SetHoldings(shortTerm, -.25);
SetHoldings(longTerm, .75);
break;
case 4:
SetHoldings(shortTerm, -.10);
SetHoldings(longTerm, .90);
break;
default:
Log("there is an error");
break;
}
sampledToday = DateTime.Now;
}
}
}