| Overall Statistics |
|
Total Trades 3 Average Win 0.61% Average Loss 0% Compounding Annual Return 31.031% Drawdown 10.100% Expectancy 0 Net Profit 13.916% Sharpe Ratio 1.19 Probabilistic Sharpe Ratio 51.477% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.282 Beta 0.007 Annual Standard Deviation 0.239 Annual Variance 0.057 Information Ratio -0.039 Tracking Error 0.544 Treynor Ratio 43.072 Total Fees $16.83 |
from load_grid import *
from QuantConnect.Data.Custom.USTreasury import *
import pandas as pd
def get_change(current, previous):
if current == previous:
return 0
try:
return round((abs(current - previous) / previous) * 100.0,2)
except ZeroDivisionError:
return float('inf')
class CalibratedMultidimensionalAutosequencers(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 2, 12) # Set Start Date
self.SetEndDate( 2020, 8, 5) #Set End Date
self.SetCash(100000) # Set Strategy Cash
#Add the data in here
self.ABC =self.AddEquity("ABC", Resolution.Daily).Symbol
self.SetBenchmark("ABC")
self.grid = self.AddData(GetGrid, "grid", Resolution.Daily).Symbol
#This is where the retrace stuff goes
self.HIGH_HIST = []
self.LOW_HIST = []
self.retrace = 0
#This is the trade logic gates
self.POINT_B = False
self.SHORT_TRADE_ENTER = False
self.already_shorted = False
self.LONG_TRADE_ENTER = False
self.LONG_A = False
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
if not data.ContainsKey(self.grid):
return
if not data.ContainsKey(self.ABC):
return
self.Debug(f"Time: {self.Time}, green_pos1: {data['grid'].GetProperty('green_pos1')}")
#This gets the data from our file - should use the offical OLHCV instead
# self.HIGH_HIST.append(data['grid'].GetProperty('High'))
# self.LOW_HIST.append( data['grid'].GetProperty('Low'))
self.HIGH_HIST.append(data['ABC'].High)
self.LOW_HIST.append( data['ABC'].Low)
self.CHART_HIGH = max(self.HIGH_HIST)
self.CHART_LOW = min(self.LOW_HIST)
OP_DIFF = self.CHART_HIGH - self.CHART_LOW
POINT_N_DIFF = self.CHART_HIGH - data['ABC'].Low
# self.Debug(f"Chart High {self.CHART_HIGH}")
# self.Debug(f"Chart Low {self.CHART_LOW}")
# self.Debug(f"OP_DIFF: {OP_DIFF}")
# self.Debug(f"POINT_N_DIFF: {POINT_N_DIFF}")
self.retrace = round(100 - get_change(POINT_N_DIFF, OP_DIFF),2)
# self.Debug(f"retrace: {self.retrace}")
if not self.Portfolio.Invested:
if self.retrace >= 30 and data['grid'].GetProperty('green_pos1') >= data['ABC'].Low and self.POINT_B == False:
self.Debug("retrace greater than 30% passed throguh green pos 1")
self.Debug(f"Low: {data['ABC'].Low}")
self.Debug("FOUND SHORT B!")
self.POINT_B = True
if self.POINT_B == True:
self.Debug("look for SHORT trade entry")
if data['grid'].GetProperty('green_0') < data['ABC'].High:
self.POINT_B = False
self.SHORT_TRADE_ENTER = True
self.already_shorted = True
self.Debug("________________Found point C________________")
self.Debug("High is higer than green_0")
self.Debug(f" green_0: {data['grid'].GetProperty('green_0')}")
self.Debug(f" high: {data['ABC'].High}")
self.Debug("Enter short trade")
self.SetHoldings("ABC", -1)
else:
if data['grid'].GetProperty('green_pos1') >= data['ABC'].Low and self.SHORT_TRADE_ENTER:
self.Debug("________________Close Trade__________________")
self.Debug("Low is lower than green pos 1")
self.Debug(f" green_pos1: {data['grid'].GetProperty('green_pos1')}")
self.Debug(f" Low: {data['ABC'].Low}")
self.SetHoldings("ABC", 0)
self.POINT_B = False
self.SHORT_TRADE_ENTER = False
if self.Portfolio.Invested and self.already_shorted and data['ABC'].Low > data['grid'].GetProperty('green_0') and self.LONG_TRADE_ENTER==False:
self.Debug("________________close open short trades here________________")
# self.LONG_A = True
self.SHORT_TRADE_ENTER = False
self.SetHoldings("ABC", 0)
if not self.Portfolio.Invested and self.already_shorted and data['ABC'].Low > data['grid'].GetProperty('green_0'):
self.LONG_A = True
if self.LONG_A:
self.Debug("look for LONG trade entry ")
if data['ABC'].Low >= data['grid'].GetProperty('green_0'):
self.LONG_A = False
self.LONG_TRADE_ENTER = True
self.Debug("________________Found green_0 LONG point C________________")
self.Debug("Low is greater than green_0")
self.Debug("Enter LONG trade next candle Open")
self.SetHoldings("ABC", 1)class GetGrid(PythonData):
def GetSource(self, config, date, isLive):
# source = "https://www.dropbox.com/s/kpupx39fka61gfg/2020-02-11_to_2020-08-07_AAL_1d_COMBINED.csv?dl=1"
source = "https://www.dropbox.com/s/55e6hu6iwggskzo/2020-02-11_to_2020-08-07_ABC_1d_COMBINED.csv?dl=1"
return SubscriptionDataSource(source, SubscriptionTransportMedium.RemoteFile);
def Reader(self, config, line, date, isLive):
if not (line.strip() and line[0].isdigit()): return None
data = line.split(',')
yld = GetGrid()
value = data[4]
if value == 0: return None
yld.Symbol = config.Symbol
yld.Time = datetime.strptime(data[0], '%Y-%m-%d')
yld["Open"] = float(data[1])
yld["High"] = float(data[2])
yld["Low"] = float(data[3])
yld["Close"] = float(data[4])
yld["Adj_Close"] = float(data[5])
yld["Volume"] = float(data[6])
yld["blue_0"] = float(data[7])
yld["blue_neg1"] = float(data[8])
yld["blue_neg10"] = float(data[9])
yld["blue_neg11"] = float(data[10])
yld["blue_neg12"] = float(data[11])
yld["blue_neg13"] = float(data[12])
yld["blue_neg14"] = float(data[13])
yld["blue_neg15"] = float(data[14])
yld["blue_neg2"] = float(data[15])
yld["blue_neg3"] = float(data[16])
yld["blue_neg4"] = float(data[17])
yld["blue_neg5"] = float(data[18])
yld["blue_neg6"] = float(data[19])
yld["blue_neg7"] = float(data[20])
yld["blue_neg8"] = float(data[21])
yld["blue_neg9"] = float(data[22])
yld["blue_pos1"] = float(data[23])
yld["blue_pos10"] = float(data[24])
yld["blue_pos11"] = float(data[25])
yld["blue_pos12"] = float(data[26])
yld["blue_pos13"] = float(data[27])
yld["blue_pos14"] = float(data[28])
yld["blue_pos15"] = float(data[29])
yld["blue_pos2"] = float(data[30])
yld["blue_pos3"] = float(data[31])
yld["blue_pos4"] = float(data[32])
yld["blue_pos5"] = float(data[33])
yld["blue_pos6"] = float(data[34])
yld["blue_pos7"] = float(data[35])
yld["blue_pos8"] = float(data[36])
yld["blue_pos9"] = float(data[37])
yld["green_0"] = float(data[38])
yld["green_neg1"] = float(data[39])
yld["green_neg10"] = float(data[40])
yld["green_neg11"] = float(data[41])
yld["green_neg12"] = float(data[42])
yld["green_neg13"] = float(data[43])
yld["green_neg14"] = float(data[44])
yld["green_neg15"] = float(data[45])
yld["green_neg2"] = float(data[46])
yld["green_neg3"] = float(data[47])
yld["green_neg4"] = float(data[48])
yld["green_neg5"] = float(data[49])
yld["green_neg6"] = float(data[50])
yld["green_neg7"] = float(data[51])
yld["green_neg8"] = float(data[52])
yld["green_neg9"] = float(data[53])
yld["green_pos1"] = float(data[54])
yld["green_pos10"] = float(data[55])
yld["green_pos11"] = float(data[56])
yld["green_pos12"] = float(data[57])
yld["green_pos13"] = float(data[58])
yld["green_pos14"] = float(data[59])
yld["green_pos15"] = float(data[60])
yld["green_pos2"] = float(data[61])
yld["green_pos3"] = float(data[62])
yld["green_pos4"] = float(data[63])
yld["green_pos5"] = float(data[64])
yld["green_pos6"] = float(data[65])
yld["green_pos7"] = float(data[66])
yld["green_pos8"] = float(data[67])
yld["green_pos9"] = float(data[68])
return yldimport pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from Risk.MaximumDrawdownPercentPerSecurity import MaximumDrawdownPercentPerSecurity
class GRID(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2006, 9, 23) # Set Start Date
# self.SetEndDate(2020, 8, 7) # Set End Date
self.SetCash(100000) # Set Strategy Cash
self.SetRiskManagement(MaximumDrawdownPercentPerSecurity(0.01))
self.gold = self.AddCfd("XAUUSD", Resolution.Minute, Market.Oanda).Symbol
self.yld = self.AddData(TenYrYield, "yld", Resolution.Daily).Symbol
self.model = LinearRegression()
self.fit_model()
self.Schedule.On(self.DateRules.MonthStart("XAUUSD"), \
self.TimeRules.At(0,0), \
self.fit_model)
def fit_model(self):
history = self.History([self.gold, self.yld], timedelta(365 * 1))
gold_prices = history.loc[self.gold].unstack(level=1)["close"].apply(np.log)
bond_yield = history.loc[self.yld].unstack(level=1)["value"]
data = pd.DataFrame()
data["gold"] = gold_prices
data["yield"] = bond_yield
data.dropna(inplace=True)
y = data['gold'].values.reshape((-1, 1))
x = data['yield'].values.reshape((-1, 1))
self.model.fit(x, y)
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
if self.yld in data.Keys and self.gold in data.Keys:
gold_price = data[self.gold].Value
bond_yield = data[self.yld].Value
predicted_price = np.exp(self.model.predict([[bond_yield]]))
if predicted_price > gold_price:
self.SetHoldings(self.gold, 1)
else:
self.SetHoldings(self.gold, 0)
class TenYrYield(PythonData):
def GetSource(self, config, date, isLive):
source = "https://www.dropbox.com/s/qops20awe8wzsf0/DFII10.csv?dl=1"
return SubscriptionDataSource(source, SubscriptionTransportMedium.RemoteFile);
def Reader(self, config, line, date, isLive):
if not (line.strip() and line[0].isdigit()): return None
data = line.split(',')
yld = TenYrYield()
yld.Symbol = config.Symbol
yld.Time = datetime.strptime(data[0], '%Y-%m-%d')
yld.Value = data[1]
return yld
# Your New Python File