| Overall Statistics |
|
Total Trades 948 Average Win 1.34% Average Loss -0.74% Compounding Annual Return 17.019% Drawdown 13.000% Expectancy 0.364 Net Profit 1054.401% Sharpe Ratio 1.448 Loss Rate 51% Win Rate 49% Profit-Loss Ratio 1.80 Alpha 0.158 Beta 0.003 Annual Standard Deviation 0.109 Annual Variance 0.012 Information Ratio 0.397 Tracking Error 0.229 Treynor Ratio 47.988 |
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Globalization;
namespace QuantConnect {
public class DollarRupee : BaseData
{
public decimal Open = 0;
public decimal High = 0;
public decimal Low = 0;
public decimal Close = 0;
public DollarRupee()
{
this.Symbol = "USDCLP";
}
public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
{
return "https://www.dropbox.com/s/it25fk3fe3s10de/USDCLP.csv?dl=1";
}
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
{
DollarRupee currency = new DollarRupee();
try
{
string[] data = line.Split(',');
currency.Time = DateTime.ParseExact(data[0], "dd-MM-yyyy", CultureInfo.InvariantCulture);
currency.Close = Convert.ToDecimal(data[3]);
currency.Open = Convert.ToDecimal(data[3]);
currency.Symbol = "USDCLP";
currency.Value = currency.Close;
}
catch {
}
return currency;
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Linq;
using MathNet.Numerics.Statistics;
namespace QuantConnect
{
public partial class CustomDataSourceAlgorithm : QCAlgorithm
{
CorrelationPair today = new CorrelationPair();
List<CorrelationPair> prices = new List<CorrelationPair>();
int minimumCorrelationHistory = 3;
public override void Initialize()
{
SetStartDate(1999, 1, 4);
SetEndDate(2014, 7, 25);
//Set the cash for the strategy:
SetCash(100000);
//Define the symbol and "type" of our generic data:
AddData<Currency>("USDCLP");
AddData<Index>("IPSA");
}
public void OnData(Currency data)
{
today = new CorrelationPair(data.Time);
today.Add("USDCLP", data.Open);
}
public void OnData(Index data)
{
try
{
today.Add("IPSA", data.Close);
if (today.Date == data.Time)
{
prices.Add(today);
if(prices.Count > minimumCorrelationHistory)
{
prices.RemoveAt(0);
}
}
if (prices.Count < 2)
{
return;
}
string maxAsset = "";
double maxGain = -9999;
foreach(string i in today.Prices.Keys)
{
double last = (from pair in prices select pair.Prices[i]).Last();
double first = (from pair in prices select pair.Prices[i]).First();
double gain = (last - first) / first;
if (gain > maxGain)
{
maxAsset = i;
maxGain = gain;
}
}
//Strategy
if (maxAsset != "")
{
CustomSetHoldings(maxAsset, 1, true);
}
}
catch(Exception err)
{
Debug( "Error: " + err.Message );
}
}
//Plot Index
public override void OnEndOfDay()
{
if (today.Prices.ContainsKey("IPSA"))
{
if(today.Prices["IPSA"] != 0 && today.Date.DayOfWeek == DayOfWeek.Wednesday)
{
Plot("IPSA", today.Prices["IPSA"]);
}
if(today.Prices["USDCLP"] != 0 && today.Date.DayOfWeek == DayOfWeek.Wednesday)
{
Plot("USDCLP", today.Prices["USDCLP"]);
}
}
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Linq;
using MathNet.Numerics.Statistics;
namespace QuantConnect {
public class CorrelationPair
{
public DateTime Date = new DateTime();
public Dictionary<string, double> Prices = new Dictionary<string, double>();
public CorrelationPair()
{
Prices = new Dictionary<string, double>();
Date = new DateTime();
}
public void Add(string symbol, decimal price)
{
Prices.Add(symbol, Convert.ToDouble(price));
}
public CorrelationPair(DateTime date)
{
Date = date.Date;
Prices = new Dictionary<string, double>();
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Globalization;
namespace QuantConnect {
public class Currency : BaseData
{
public decimal Open = 0;
public decimal High = 0;
public decimal Low = 0;
public decimal Close = 0;
public Currency()
{
this.Symbol = "USDCLP";
}
public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
{
return "https://www.dropbox.com/s/it25fk3fe3s10de/USDCLP.csv?dl=1";
}
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
{
Currency currency = new Currency();
try
{
string[] data = line.Split(',');
currency.Time = DateTime.ParseExact(data[0], "dd-MM-yyyy", CultureInfo.InvariantCulture);
currency.Close = Convert.ToDecimal(data[3]);
currency.Open = Convert.ToDecimal(data[3]);
currency.Symbol = "USDCLP";
currency.Value = currency.Close;
}
catch {
}
return currency;
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Globalization;
namespace QuantConnect {
public class Index : BaseData
{
public decimal Close = 0;
public Index()
{
this.Symbol = "IPSA";
}
public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
{
return "https://www.dropbox.com/s/k2yixqaw7cmt57b/IPSA.csv?dl=1";
}
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
{
Index index = new Index();
try
{
string[] data = line.Split(',');
index.Time = DateTime.ParseExact(data[0], "dd-MM-yyyy", CultureInfo.InvariantCulture);
index.Close = Convert.ToDecimal(data[1]);
index.Symbol = "IPSA";
index.Value = index.Close;
}
catch {
}
return index;
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect {
/// <summary>
/// vvvvvv UPDATE TO YOUR CORE ALGORITHM CLASS NAME HERE: vvvv "QCUMartingalePositionSizing" ==> "MyAlgorithm"
/// </summary>
public partial class CustomDataSourceAlgorithm : QCAlgorithm
{
public void CustomSetHoldings(string symbol, decimal percentage, bool liquidateExistingHoldings = false) {
decimal cash = Portfolio.Cash;
decimal currentHoldingQuantity = Portfolio[symbol].Quantity;
//Range check values:
if (percentage > 1) percentage = 1;
if (percentage < -1) percentage = -1;
//If they triggered a liquidate
if (liquidateExistingHoldings) {
foreach (string holdingSymbol in Portfolio.Keys) {
if (holdingSymbol != symbol) {
//Go through all existing holdings, market order the inverse quantity
Order(holdingSymbol, -Portfolio[holdingSymbol].Quantity);
}
}
}
//Now rebalance the symbol requested:
decimal targetHoldingQuantity = Math.Floor((percentage * Portfolio.TotalPortfolioValue) / Securities[symbol].Price);
decimal netHoldingQuantity = targetHoldingQuantity - currentHoldingQuantity;
if (Math.Abs(netHoldingQuantity) > 0) {
Order(symbol, (int)netHoldingQuantity);
}
return;
}
}
}