Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 32 additions & 36 deletions Algorithm.CSharp/CustomDataPropertiesRegressionAlgorithm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using Newtonsoft.Json;
using QuantConnect.Data;
using QuantConnect.Interfaces;
Expand All @@ -40,8 +41,8 @@ public class CustomDataPropertiesRegressionAlgorithm : QCAlgorithm, IRegressionA
/// </summary>
public override void Initialize()
{
SetStartDate(2020, 01, 05);
SetEndDate(2020, 01, 10);
SetStartDate(2018, 04, 05);
SetEndDate(2018, 04, 10);

//Set the cash for the strategy:
SetCash(100000);
Expand Down Expand Up @@ -109,7 +110,7 @@ public override void OnEndOfAlgorithm()
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 57;
public long DataPoints => 50;

/// <summary>
/// Data Points count of the algorithm history
Expand All @@ -129,31 +130,31 @@ public override void OnEndOfAlgorithm()
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "34781.071%"},
{"Drawdown", "4.300%"},
{"Compounding Annual Return", "-45.767%"},
{"Drawdown", "4.000%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "110102.2"},
{"Net Profit", "10.102%"},
{"Sharpe Ratio", "283.719"},
{"Sortino Ratio", "1123.876"},
{"Probabilistic Sharpe Ratio", "81.716%"},
{"End Equity", "98999.21"},
{"Net Profit", "-1.001%"},
{"Sharpe Ratio", "0.907"},
{"Sortino Ratio", "3.722"},
{"Probabilistic Sharpe Ratio", "48.891%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "184.11"},
{"Beta", "-6.241"},
{"Annual Standard Deviation", "0.635"},
{"Annual Variance", "0.403"},
{"Information Ratio", "260.511"},
{"Tracking Error", "0.689"},
{"Treynor Ratio", "-28.849"},
{"Alpha", "0.514"},
{"Beta", "0.649"},
{"Annual Standard Deviation", "0.5"},
{"Annual Variance", "0.25"},
{"Information Ratio", "1.127"},
{"Tracking Error", "0.485"},
{"Treynor Ratio", "0.699"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "BTC.Bitcoin 2S"},
{"Portfolio Turnover", "16.73%"},
{"Portfolio Turnover", "16.93%"},
{"Drawdown Recovery", "2"},
{"OrderListHash", "b890a8e73bf118e943ad2f2e712f12d0"}
{"OrderListHash", "b9aecea6ebe672324d20a389ac004b1e"}
};

/// <summary>
Expand Down Expand Up @@ -216,12 +217,9 @@ public override SubscriptionDataSource GetSource(SubscriptionDataConfig config,
return new SubscriptionDataSource("https://www.bitstamp.net/api/ticker/", SubscriptionTransportMedium.Rest);
}

//return "http://my-ftp-server.com/futures-data-" + date.ToString("Ymd") + ".zip";
// OR simply return a fixed small data file. Large files will slow down your backtest
return new SubscriptionDataSource("https://www.quantconnect.com/api/v2/proxy/nasdaq/api/v3/datatables/QDL/BITFINEX.csv?code=BTCUSD&api_key=WyAazVXnq7ATy_fefTqm")
{
Sort = true
};
// Read from a local data file so the test is deterministic instead of depending on a remote source
var source = Path.Combine(Globals.DataFolder, "crypto", "coinbase", "daily", "btcusd_trade.zip");
return new SubscriptionDataSource(source, SubscriptionTransportMedium.LocalFile, FileFormat.Csv);
}

/// <summary>
Expand Down Expand Up @@ -251,24 +249,22 @@ public override BaseData Reader(SubscriptionDataConfig config, string line, Date
return coin;
}

//Example Line Format:
// code date high low mid last bid ask volume
// BTCUSD 2024-10-08 63248.0 61940.0 62246.5 62245.0 62246.0 62247.0 5.929230648356
// Example Line Format:
// date open high low close volume
// 20180405 00:00 6791.68 6933.11 6568.64 6785.85 13832.668772
try
{
string[] data = line.Split(',');
coin.Time = DateTime.Parse(data[1], CultureInfo.InvariantCulture);
var data = line.Split(',');
coin.Time = DateTime.ParseExact(data[0], "yyyyMMdd HH:mm", CultureInfo.InvariantCulture);
coin.EndTime = coin.Time.AddDays(1);
coin.Open = Convert.ToDecimal(data[1], CultureInfo.InvariantCulture);
coin.High = Convert.ToDecimal(data[2], CultureInfo.InvariantCulture);
coin.Low = Convert.ToDecimal(data[3], CultureInfo.InvariantCulture);
coin.Mid = Convert.ToDecimal(data[4], CultureInfo.InvariantCulture);
coin.Close = Convert.ToDecimal(data[5], CultureInfo.InvariantCulture);
coin.Bid = Convert.ToDecimal(data[6], CultureInfo.InvariantCulture);
coin.Ask = Convert.ToDecimal(data[7], CultureInfo.InvariantCulture);
coin.VolumeBTC = Convert.ToDecimal(data[8], CultureInfo.InvariantCulture);
coin.Close = Convert.ToDecimal(data[4], CultureInfo.InvariantCulture);
coin.VolumeBTC = Convert.ToDecimal(data[5], CultureInfo.InvariantCulture);
coin.Value = coin.Close;
}
catch { /* Do nothing, skip first title row */ }
catch { /* Do nothing, skip malformed rows */ }

return coin;
}
Expand Down
32 changes: 13 additions & 19 deletions Algorithm.Python/CustomDataPropertiesRegressionAlgorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
class CustomDataPropertiesRegressionAlgorithm(QCAlgorithm):

def initialize(self) -> None:
self.set_start_date(2020, 1, 5) # Set Start Date
self.set_end_date(2020, 1, 10) # Set End Date
self.set_start_date(2018, 4, 5) # Set Start Date
self.set_end_date(2018, 4, 10) # Set End Date
self.set_cash(100000) # Set Strategy Cash

# Define our custom data properties and exchange hours
Expand Down Expand Up @@ -67,11 +67,9 @@ def get_source(self, config: SubscriptionDataConfig, date: datetime, is_live_mod
if is_live_mode:
return SubscriptionDataSource("https://www.bitstamp.net/api/ticker/", SubscriptionTransportMedium.REST)

#return "http://my-ftp-server.com/futures-data-" + date.to_string("Ymd") + ".zip"
# OR simply return a fixed small data file. Large files will slow down your backtest
subscription = SubscriptionDataSource("https://www.quantconnect.com/api/v2/proxy/nasdaq/api/v3/datatables/QDL/BITFINEX.csv?code=BTCUSD&api_key=WyAazVXnq7ATy_fefTqm")
subscription.sort = True
return subscription
# Read from a local data file so the test is deterministic instead of depending on a remote source
source = f"{Globals.data_folder}/crypto/coinbase/daily/btcusd_trade.zip"
return SubscriptionDataSource(source, SubscriptionTransportMedium.LOCAL_FILE, FileFormat.CSV)

def reader(self, config: SubscriptionDataConfig, line: str, date: datetime, is_live_mode: bool) -> DynamicData:
coin = Bitcoin()
Expand Down Expand Up @@ -103,24 +101,20 @@ def reader(self, config: SubscriptionDataConfig, line: str, date: datetime, is_l
return coin

# Example Line Format:
#code date high low mid last bid ask volume
#BTCUSD 2024-10-08 63248.0 61940.0 62246.5 62245.0 62246.0 62247.0 5.929230648356
if not (line.strip() and line[7].isdigit()): return coin

# date open high low close volume
# 20180405 00:00 6791.68 6933.11 6568.64 6785.85 13832.668772
try:
data = line.split(',')
coin.time = datetime.strptime(data[1], "%Y-%m-%d")
coin.time = datetime.strptime(data[0], "%Y%m%d %H:%M")
coin.end_time = coin.time + timedelta(1)
coin.value = float(data[5])
coin.value = float(data[4])
coin["Open"] = float(data[1])
coin["High"] = float(data[2])
coin["Low"] = float(data[3])
coin["Mid"] = float(data[4])
coin["Close"] = float(data[5])
coin["Bid"] = float(data[6])
coin["Ask"] = float(data[7])
coin["VolumeBTC"] = float(data[8])
coin["Close"] = float(data[4])
coin["VolumeBTC"] = float(data[5])
return coin

except ValueError:
# Do nothing, possible error in json decoding
# Do nothing, skip malformed rows
return coin
Loading