| Overall Statistics |
|
Total Trades 88 Average Win 0.23% Average Loss -0.09% Annual Return 6.123% Drawdown 5.700% Expectancy 1.582 Net Profit 12.708% Sharpe Ratio 1.5 Loss Rate 31% Win Rate 69% Profit-Loss Ratio 2.73 Trade Frequency Weekly trades |
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect {
public partial class QCUWeatherBasedRebalancing : QCAlgorithm
{
//Initialize: Storage for our custom data:
//Source: http://www.wunderground.com/history/
//Make sure to link to the actual file download URL if using dropbox.
//private string url = "https://www.dropbox.com/s/txgqzv2vp5lzpqc/10065.csv";
private Weather yesterday;
private int rebalanceFrequency = 2, tradingDayCount = 0;
///<summary>
/// Initialize our algorithm:
///</summary>
public override void Initialize()
{
SetStartDate(2013, 1, 1);
SetEndDate(2014, 5, 31);
SetCash(25000);
AddSecurity(SecurityType.Equity, "SPY", Resolution.Minute);
SetRunMode(RunMode.Series);
AddData<Weather>("NYCTEMP", Resolution.Minute);
}
//Save the instance of the weather.
public void OnData(Weather data)
{
yesterday = data;
}
///<summary>
/// When we have a new event trigger, buy some stock:
///</summary>
public void OnData(TradeBars data)
{
//Rebalance every 10 days:
if (tradingDayCount >= rebalanceFrequency)
{
//Scale from -5C to +25C :: -5C == 0, +25C = 100% invested.
if (yesterday != null) {
decimal fraction = (yesterday.MinC + 5m) / 30m;
SetHoldings("SPY", fraction);
tradingDayCount = 0;
}
}
}
///<summary>
/// After each trading day
///</summary>
public override void OnEndOfDay() {
tradingDayCount++;
}
}
/// <summary>
/// Weather based rebalancing
/// </summary>
public class Weather : BaseData
{
public decimal MaxC = 0;
public decimal MeanC = 0;
public decimal MinC = 0;
public string errString = "";
public Weather()
{
this.Symbol = "NYCTEMP";
}
public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
{
return "https://www.dropbox.com/s/txgqzv2vp5lzpqc/10065.csv?dl=1";
}
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
{
Weather weather = new Weather();
try {
string[] data = line.Split(',');
weather.Time = DateTime.Parse(data[0]).AddHours(20); // Make sure we only get this data AFTER trading day - don't want forward bias.
weather.MaxC = Convert.ToDecimal(data[1]);
weather.MeanC = Convert.ToDecimal(data[2]);
weather.MinC = Convert.ToDecimal(data[3]);
} catch (Exception err)
{
return null;
}
return weather;
}
}
}