| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return -0.044% Drawdown 6.400% Expectancy 0 Net Profit -0.471% Sharpe Ratio -0.01 Probabilistic Sharpe Ratio 0.003% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.004 Beta 0.041 Annual Standard Deviation 0.017 Annual Variance 0 Information Ratio -0.723 Tracking Error 0.136 Treynor Ratio -0.004 Total Fees $1.00 Estimated Strategy Capacity $3700000000.00 Lowest Capacity Asset AAPL R735QTJ8XC9X |
# region imports
import numpy as np
import pandas as pd
from AlgorithmImports import *
# endregion
class SwimmingSkyBlueFish(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2012, 1, 1) # Set Start Date
self.SetEndDate(2022,12,31)
self.SetCash(100000) # Set Strategy Cash
self.stocks = ["SPY", "AMD", "AAPL"]
for stock in self.stocks:
self.AddEquity(stock, Resolution.Daily)
self.rsi = self.RSI(stock, 14)
self.back_1 = None
self.back_2 = None
self.current = None
self.entry_price = None
self.long_list=[]
self.short_list=[]
self.stop=False
self.__macd = self.MACD(stock, 12, 26, 9, MovingAverageType.Exponential, Resolution.Daily)
self.__previous = datetime.min
self.PlotIndicator("MACD", True, self.__macd, self.__macd.Signal)
self.PlotIndicator(stock, self.__macd.Fast, self.__macd.Slow)
self.sto = self.STO(stock, 5, 3, 3, Resolution.Daily)
def OnData(self, data: Slice):
'''OnData even 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.stop:
return
for item in self.stocks[1:]:
if not data.ContainsKey(item) or not data[item]:
self.Debug(f"{self.Time.date()} has no data for {item}")
return
self.back_2 = self.back_1
self.back_1 = self.current
self.current = data[item].Close
stockPrice = self.History([item], 30, Resolution.Daily)
MA21_Pre = stockPrice.close[8:29].mean()
MA5_Pre = stockPrice.close[24:29].mean()
MA21_Current = stockPrice.close[9:30].mean()
MA5_Current = stockPrice.close[25:30].mean()
# if self.rsi.IsReady:
# self.Debug("RSI Ready")
if self.back_2 == None or self.back_1 == None or self.current == None:
return
#trading conditions, only when we are not invested in the specific Stock
if self.rsi.Current.Value > 40 and self.back_1 > self.back_2 and self.current > self.back_1 and MA5_Pre < MA21_Pre and MA5_Current > MA21_Current:
if not self.Portfolio[item].Invested:
self.SetHoldings(item,0.2) #invest 20% of our capital
self.entry_price = self.current
self.Debug("Bought" + item + " at $" + str(self.entry_price))
# exit conditions, only if we are invested in the specific Stock
if self.Portfolio[item].Invested and self.back_1 < self.back_2 and self.current < self.back_1 and MA5_Pre > MA21_Pre and MA5_Current < MA21_Current and self.rsi.Current.Value < 60:
if self.current <= self.entry_price - 0.0005:
self.Liquidate(item, "stop-loss")
self.Debug(item + "Sold via Stop-Loss at $" + str(self.entry_price))
if self.current >= self.entry_price + 0.0010:
self.Liquidate(item,"take-profit")
self.Debug(item + "Sold via Take-Profit $" + str(self.entry_price))
if self.Portfolio.Cash < 0.6*100000:
self.stop=True
self.Liquidate()
def OnEndOfAlgorithm(self):
history_spy = self.History(self.Symbol("SPY"), 30, Resolution.Daily)
history_spy = history_spy["close"].tolist()
spy_abs_return = (history_spy[-1]-history_spy[0]/history_spy[0])
self.Debug('abs return of SPY is ' + str(spy_abs_return))
df = pd.DataFrame()
df["SPY_Price"]= history_spy
df["SPY_returns"] = df["SPY_Price"].pct_change()
spy_daily_returns = df["SPY_returns"].mean()
spy_var = df["SPY_returns"].var()
spy_std = df["SPY_returns"].std()
for item in self.stocks[1:]:
history = self.History(self.Symbol(item), 30, Resolution.Daily)
history = history["close"].tolist()
abs_return = (history[-1]- history[0]/history[0])
self.Debug('abs return of {} is '.format(item) + str(abs_return))
df[f"{item} Price"] = history
specificStockPrice = df[f"{item} Price"]
df[f"{item} returns"] = df[f"{item} Price"].pct_change()
specificStockReturns = df[f"{item} returns"]
daily_returns = specificStockReturns.mean()
#self.Debug('SPY mean returns = {}'.format(spy_daily_returns))
#self.Debug('{} mean returns = {}'.format(item, daily_returns))
#variance
var = specificStockReturns.var()
# covariance
covariance = df["SPY_returns"].cov(specificStockReturns)
self.Debug('Covariance between SPY and {} is {} '.format(item, covariance))
# correlation
correlation = df["SPY_returns"].corr(specificStockReturns)
self.Debug('Correlation between SPY and {} is {} '.format(item, correlation))
# Standard Deviation
std = specificStockReturns.std()
self.Debug('Standard Deviation of {} is {} '.format(item, std))
# TSLA Beta
beta = covariance / spy_var
self.Debug('Beta of {} is {}'.format(item, beta))
alpha = abs_return - beta * spy_abs_return
self.Debug('Alpha of {} is {}'.format(item, alpha))
SR = daily_returns/ std * (252**0.5)
self.Debug('Sharpe Ratio of {} is {}'.format(item, SR))
self.Debug('------------------------------------------------')
#self.Debug('Beta: {} | Alpha: {} | Sharpe Ratio: {} '.format(beta,alpha,SR))
self.Debug(df)
# ------------------------------------
# region imports
# import numpy as np
# import pandas as pd
# from AlgorithmImports import *
# # endregion
# class GeekyYellowGreenCaterpillar(QCAlgorithm):
# # Entry Rules
# # 1. MACD fast line cross above slow line
# # 2. MACD above 70%
# # 3. Stochastics fast cross above slow
# # 4. Stochastics around 20% (No trades are done when this is implemented)
# # 5. Sell when Opposite is True
# def Initialize(self):
# self.SetStartDate(2012, 1, 1) #Set Start Date
# self.SetEndDate(2022, 1, 1) #Set End Date
# self.SetCash(10000) #Set Strategy Cash
# self.spy = self.AddEquity("AAPL", Resolution.Daily)
# # define our daily macd(12,26) with a 9 day signal
# self.__macd = self.MACD("AAPL", 12, 26, 9, MovingAverageType.Exponential, Resolution.Daily)
# self.__previous = datetime.min
# self.PlotIndicator("MACD", True, self.__macd, self.__macd.Signal)
# self.PlotIndicator("AAPL", self.__macd.Fast, self.__macd.Slow)
# self.sto = self.STO("AAPL", 5, 3, 3, Resolution.Daily)
# def OnData(self, data):
# if not self.__macd.IsReady: return
# if not self.sto.IsReady: return
# # only once per day
# if self.__previous.date() == self.Time.date(): return
# # Stochastics variables
# fast_stoch = self.sto.FastStoch.Current.Value
# stoch_k = self.sto.StochK.Current.Value
# stoch_d = self.sto.StochD.Current.Value
# current = self.sto.Current.Value
# # MACD tolerance
# tolerance = 0.007
# holdings = self.Portfolio["AAPL"].Quantity
# signalDeltaPercent = (self.__macd.Current.Value - self.__macd.Signal.Current.Value)/self.__macd.Fast.Current.Value
# # Go long when MACD in on uptrend
# if holdings <= 0 and signalDeltaPercent > tolerance and stoch_k>stoch_d:
# self.SetHoldings("AAPL", 1.0)
# self.Debug(f"Buy at {self.Portfolio['AAPL'].Price}")
# self.Debug(f"stoch_k: {stoch_k}")
# self.Debug("--------------")
# # Liquidate when MACD is on downtrend
# elif holdings >= 0 and signalDeltaPercent < -tolerance and stoch_k<stoch_d:
# self.Liquidate("AAPL")
# self.Debug(f"Sell at {self.Portfolio['AAPL'].Price}")
# self.Debug(f"stoch_k: {stoch_k}")
# self.Debug("--------------")
# self.__previous = self.Time