| Overall Statistics |
|
Total Trades 19 Average Win 9.92% Average Loss -0.66% Compounding Annual Return 10.044% Drawdown 18.500% Expectancy 6.559 Net Profit 95.3% Sharpe Ratio 0.797 Loss Rate 53% Win Rate 47% Profit-Loss Ratio 14.96 Alpha 0.107 Beta -0.026 Annual Standard Deviation 0.131 Annual Variance 0.017 Information Ratio -0.012 Tracking Error 0.266 Treynor Ratio -3.974 Total Fees $55.50 |
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 QCUQuandlFutures : QCAlgorithm
{
string SPY = "SPY";
string ACWI = "ACWI";
string Tbill = "BIL";
string Bonds = "AGG";
Momentum _momSPY;
Momentum _momACWI;
Momentum _momTbill;
DateTime sampledToday = DateTime.Now;
public override void Initialize()
{
SetStartDate(2008, 6, 1);
SetEndDate(DateTime.Now.Date.AddDays(-1));
SetCash(25000);
AddSecurity(SecurityType.Equity, SPY, Resolution.Minute);
Securities[SPY].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);
AddSecurity(SecurityType.Equity, ACWI, Resolution.Minute);
Securities[ACWI].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);
AddSecurity(SecurityType.Equity, Tbill, Resolution.Minute);
Securities[Tbill].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);
AddSecurity(SecurityType.Equity, Bonds, Resolution.Minute);
Securities[Bonds].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);
// define our daily trade bar consolidator. we can access the daily bar
// from the DataConsolidated events
var dailyConsolidator = new TradeBarConsolidator(TimeSpan.FromDays(1));
// attach our event handler. the event handler is a function that will be called each time we produce
// a new consolidated piece of data.
dailyConsolidator.DataConsolidated += OnDataDaily;
// this call adds our daily consolidator to the manager to receive updates from the engine
SubscriptionManager.AddConsolidator(SPY, dailyConsolidator);
SubscriptionManager.AddConsolidator(ACWI, dailyConsolidator);
SubscriptionManager.AddConsolidator(Tbill, dailyConsolidator);
SubscriptionManager.AddConsolidator(Bonds, dailyConsolidator);
_momSPY = MOM(SPY, 252, Resolution.Daily);
_momACWI = MOM(ACWI, 252, Resolution.Daily);
_momTbill = MOM(Tbill, 252, Resolution.Daily);
}
//Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
private void OnDataDaily(object sender, TradeBar consolidated)
{
if (!_momSPY.IsReady) return;
//One data point per m:
//Only take one data point per day (opening price)
decimal holdingPercent = .5m;
string etf;
decimal _momStrong;
if (_momSPY >= _momACWI)
{
etf = SPY;
_momStrong = _momSPY;
} else
{
etf = ACWI;
_momStrong = _momACWI;
}
if (_momStrong > _momTbill)
{
if(Portfolio[etf].Quantity > 0) return;
Liquidate();
SetHoldings(etf, holdingPercent);
Log("Set Holdings to " + Portfolio[etf].Quantity + "of " + etf);
} else
{
if(Portfolio[Bonds].Quantity > 0) return;
Liquidate();
SetHoldings(Bonds, holdingPercent);
Log("Set Holdings to " + Portfolio[Bonds].Quantity + "of " + Bonds);
}
}
}
}