| Overall Statistics |
|
Total Trades 686 Average Win 0.43% Average Loss -0.41% Compounding Annual Return 14.687% Drawdown 9.200% Expectancy 0.102 Net Profit 14.696% Sharpe Ratio 1.09 Loss Rate 47% Win Rate 53% Profit-Loss Ratio 1.07 Alpha 0.142 Beta -0.112 Annual Standard Deviation 0.107 Annual Variance 0.011 Information Ratio -0.718 Tracking Error 0.154 Treynor Ratio -1.044 Total Fees $1219.56 |
namespace QuantConnect
{
/*
* QuantConnect University: pairs trading, MACD example
* by Jean-Paul van Brakel
*/
public class PairsTradingAlgorithm : QCAlgorithm
{
decimal _diff;
MovingAverageConvergenceDivergence _macd;
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
//Start and End Date range for the backtest:
SetStartDate(2013, 1, 1);
SetEndDate(2014, 1, 1);
//Cash allocation
SetCash(25000);
//Add as many securities as you like. All the data will be passed into the event handler:
AddSecurity(SecurityType.Equity, "AAPL", Resolution.Minute);
AddSecurity(SecurityType.Equity, "MSFT", Resolution.Minute);
//Initialise MACD
_macd = new MovingAverageConvergenceDivergence(12, 26, 9, MovingAverageType.Simple);
}
//Data Event Handler: All data arrives here in slices.
public override void OnData(Slice slice)
{
if (!slice.ContainsKey("MSFT") || !slice.ContainsKey("AAPL")) return;
//Calculate difference MSFT and AAPL
_diff = slice["MSFT"].Close - slice["AAPL"].Close;
//Update MACD
_macd.Update(slice.Time, _diff);
//Calculate MACD difference
decimal signalDeltaPercent = (_macd - _macd.Signal)/_macd.Fast;
var tolerance = 0.0025m;
//If MACD gives signal and we're not in a position right now
if (!Portfolio.HoldStock && signalDeltaPercent > tolerance)
{
//Calculate quantities of individual positions
int quantityA = (int)Math.Floor(0.5M*Portfolio.Cash/slice["MSFT"].Close);
int quantityB = (int)Math.Floor(0.5M*Portfolio.Cash/slice["AAPL"].Close);
//Go long on first, go short on second
Order("MSFT", quantityA);
Order("AAPL", -quantityB);
} else if (signalDeltaPercent < -tolerance) {
//If MACD gives opposite signal
Liquidate("MSFT");
Liquidate("AAPL");
}
//Plot MACD lines
Plot("MACD", "Difference", _diff);
Plot("MACD", _macd.Fast, _macd.Slow);
}
}
}