Overall Statistics |
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 70.633% Drawdown 28.000% Expectancy 0 Net Profit 34.927% Sharpe Ratio 1.569 Probabilistic Sharpe Ratio 55.658% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.782 Beta -0.378 Annual Standard Deviation 0.473 Annual Variance 0.224 Information Ratio 0.908 Tracking Error 0.705 Treynor Ratio -1.963 Total Fees $0.00 |
from datetime import date, timedelta, datetime class CustomDataYahooAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 1, 1) self.SetCash(100000) # Define the symbol and "type" of our generic data: self.AddData(Yahoo, "AAPL") self.AddData(Yahoo, "MSFT") def OnData(self, data): if 'MSFT' not in data: return close = data["MSFT"].Value if not self.Portfolio.Invested: self.SetHoldings("MSFT", 1) self.Debug(f"Buying MSFT 'Shares': MSFT: {close}") class Yahoo(PythonData): '''Custom Data Type using Yahoo Finance files saved in Dropbox''' def GetSource(self, config, date, isLiveMode): # Use a Dictionary for each file in Dropbox keyed by the ticker sources = { 'MSFT': "https://www.dropbox.com/s/qjfem6mw5cpozdw/MSFT.csv?dl=1", 'AAPL': "https://www.dropbox.com/s/ok4d5hzrkozt41l/AAPL.csv?dl=1" } return SubscriptionDataSource(sources[config.Symbol.Value], SubscriptionTransportMedium.RemoteFile); def Reader(self, config, line, date, isLiveMode): obj = Yahoo() obj.Symbol = config.Symbol # Example Line Format: # Date Open High Low Close Adj Close (BTC) Volume # 2011-09-13 5.8 6.0 5.65 5.97 58.37138238, 346.0973893944 if not (line.strip() and line[0].isdigit()): return None try: data = line.split(',') # If value is zero, return None value = float(data[5]) if value == 0: return None obj.Time = datetime.strptime(data[0], "%Y-%m-%d") obj.EndTime = obj.Time + timedelta(1) obj.Value = value obj["Open"] = float(data[1]) obj["High"] = float(data[2]) obj["Low"] = float(data[3]) obj["Close"] = float(data[4]) obj["AdjClose"] = value obj["Volume"] = float(data[6]) return obj; except: return None