| Overall Statistics |
|
Total Trades 149 Average Win 1.41% Average Loss -1.90% Compounding Annual Return 7.385% Drawdown 18.400% Expectancy 0.417 Net Profit 93.739% Sharpe Ratio 0.658 Loss Rate 19% Win Rate 81% Profit-Loss Ratio 0.74 Alpha 0.047 Beta 0.275 Annual Standard Deviation 0.096 Annual Variance 0.009 Information Ratio 0.022 Tracking Error 0.158 Treynor Ratio 0.229 Total Fees $555.49 |
using System;
using System.Collections.Concurrent;
namespace QuantConnect
{
public class BasicTemplateAlgorithm : QCAlgorithm
{
SecurityChanges _changes = SecurityChanges.None;
public const int count = 100;
public int CurrentMonth = 0;
private readonly ConcurrentDictionary<Symbol, SelectionData> _symbolsData = new ConcurrentDictionary<Symbol, SelectionData>();
public override void Initialize()
{
UniverseSettings.Leverage = 2.0m;
UniverseSettings.Resolution = Resolution.Daily;
SetStartDate(2008, 1, 1);
SetEndDate(DateTime.Now);
SetCash(100*1000);
AddUniverse( coarse =>
{
return
(
from cf in coarse
let avg = _symbolsData.GetOrAdd(cf.Symbol, sym => new SelectionData())
where cf.Price > 10.0m
where avg.Update(cf.EndTime,cf.Price)
orderby cf.DollarVolume descending
select cf.Symbol
).Take(count);
}
);
}
public void OnData(TradeBars data)
{
if(CurrentMonth != Time.Month)
{ foreach(var symbol in Portfolio.Keys)
{
if(_symbolsData[symbol].Months < 6)
{
_symbolsData[symbol].Months += 1;
}else
{
_symbolsData[symbol].Months = 0;
Liquidate(symbol);
}
}
CurrentMonth = Time.Month;
IEnumerable<Symbol> highVolatile = ( from sym in data.Keys
let info = _symbolsData[sym]
orderby info.volatility
select sym).Take(count/10);
IEnumerable<Symbol> highPerforming = ( from sym in highVolatile
let info = _symbolsData[sym]
orderby info.momentum descending
select sym).Take(1);
// IEnumerable<Symbol> lowPerforming = ( from sym in highVolatile
// let info = _symbolsData[sym]
// orderby info.momentum
// select sym).Take(1);
foreach(var symbol in highPerforming)
{
if(data[symbol].Close > 10.0m)
{
SetHoldings(symbol,(decimal)1/6);
_symbolsData[symbol].Months = 1;
}
}
// foreach(var symbol in lowPerforming)
// {
// SetHoldings(symbol,-(decimal)1/18);
// _symbolsData[symbol].Months = 1;
// }
}
}
public override void OnSecuritiesChanged(SecurityChanges changes)
{
_changes = changes;
}
}
}using System;
using System.Collections.Concurrent;
using System.Linq;
using QuantConnect.Data.Market;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Indicators;
namespace QuantConnect {
public class SelectionData
{
public int numberOfDay = 0;
public struct timePrice
{
public DateTime time;
public decimal price;
public timePrice(DateTime _time, decimal _price)
{
time = _time;
price = _price;
}
}
public Queue<timePrice> weeksPrices = new Queue<timePrice>();
public StandardDeviation volatility;
public readonly Momentum momentum;
private int months;
public int Months
{
get{ return months;}
set{ months = value;}
}
public bool Update(DateTime time, decimal price)
{
weeksPrices.Enqueue(new timePrice(time,price));
if(numberOfDay >= 7)
{
timePrice previousDay = weeksPrices.Dequeue();
return momentum.Update(previousDay.time,previousDay.price) &&
volatility.Update(previousDay.time,previousDay.price);
}else
{
numberOfDay++;
return false;
}
}
public SelectionData()
{
volatility = new StandardDeviation(180);
momentum = new Momentum(180);
}
}
}