| Overall Statistics |
|
Total Trades 217 Average Win 0.62% Average Loss -0.58% Compounding Annual Return 4.319% Drawdown 14.200% Expectancy 0.333 Net Profit 20.900% Sharpe Ratio 0.642 Loss Rate 36% Win Rate 64% Profit-Loss Ratio 1.07 Alpha 0.036 Beta 0.002 Annual Standard Deviation 0.057 Annual Variance 0.003 Information Ratio -0.535 Tracking Error 0.147 Treynor Ratio 23.44 Total Fees $299.08 |
namespace QuantConnect
{
/*
* QuantConnect University: Full Basic Template:
*
* The underlying QCAlgorithm class is full of helper methods which enable you to use QuantConnect.
* We have explained some of these here, but the full algorithm can be found at:
* https://github.com/QuantConnect/QCAlgorithm/blob/master/QuantConnect.Algorithm/QCAlgorithm.cs
*/
public class PsySignalAlgorithm : QCAlgorithm
{
decimal noiseLevel = 0.1m;
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
//Start and End Date range for the backtest:
SetStartDate(2011, 1, 18);
SetEndDate(2015, 07, 13);
//Cash allocation
SetCash(100000);
//Add as many securities as you like. All the data will be passed into the event handler:
AddSecurity(SecurityType.Equity, "SPY", Resolution.Daily);
AddData<Mix>("MIX", Resolution.Daily);
}
//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)
{ }
public void OnData(Mix data)
{
if (Time.DayOfWeek == DayOfWeek.Wednesday)
{
var fraction = data.OscillatorStocktwitsTwitter;
if (Math.Abs(fraction) > 1.8m) fraction = 1.8m;
if (data.OscillatorStocktwitsTwitter > noiseLevel) {
SetHoldings("SPY", fraction);
} else if (data.OscillatorStocktwitsTwitter < -noiseLevel) {
SetHoldings("SPY", -fraction);
} else {
Liquidate();
}
}
}
}
public class Mix : BaseData
{
public decimal OscillatorTwitter = 0;
public decimal OscillatorStocktwits = 0;
public decimal OscillatorStocktwitsTwitter = 0;
public Mix()
{
this.Symbol = "MIX";
}
public override SubscriptionDataSource GetSource(SubscriptionDataConfig config, DateTime date, bool isLive)
{
return new SubscriptionDataSource("http://secure.psychsignal.com/data/mood-index", SubscriptionTransportMedium.RemoteFile);
}
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, bool isLive)
{
Mix mix = new Mix();
try
{
string[] data = line.Split(',');
//Required.
mix.Symbol = config.Symbol;
mix.Time = DateTime.ParseExact(data[0], "yyyy-MM-dd", CultureInfo.InvariantCulture);
mix.OscillatorStocktwitsTwitter = Convert.ToDecimal(data[1]);
mix.OscillatorTwitter = Convert.ToDecimal(data[2]);
mix.OscillatorStocktwits = Convert.ToDecimal(data[3]);
mix.Value = mix.OscillatorStocktwitsTwitter;
}
catch {
}
return mix;
}
}
}