| Overall Statistics |
|
Total Trades 126 Average Win 14.76% Average Loss -4.55% Compounding Annual Return 17.139% Drawdown 40.700% Expectancy 0.685 Net Profit 364.791% Sharpe Ratio 0.703 Probabilistic Sharpe Ratio 9.069% Loss Rate 60% Win Rate 40% Profit-Loss Ratio 3.25 Alpha 0.104 Beta 0.321 Annual Standard Deviation 0.194 Annual Variance 0.037 Information Ratio 0.171 Tracking Error 0.212 Treynor Ratio 0.424 Total Fees $4858.95 Estimated Strategy Capacity $770000000.00 Lowest Capacity Asset TSLA UNU3P8Y3WFAD |
# region imports
from AlgorithmImports import *
# endregion
# Imports
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras.utils.generic_utils import serialize_keras_object
import json
import numpy as np
class PensiveYellowGreenBison(QCAlgorithm):
def Initialize(self):
# # # # # User input area # # # # #
# Set Start Date
self.SetStartDate(2013, 1, 1)
# Set Strategy Cash
self.SetCash(100000)
# Stop loss percent
self.stop_loss_percent = 2
# Stock to trade
stock_to_trade = "TSLA"
# # # # # End user input area # # # # #
# Add stock
self.stock_symbol = self.AddEquity(stock_to_trade, Resolution.Daily).Symbol
# SMA
self.symbol_SMA = self.SMA(self.stock_symbol, 10, Resolution.Daily)
# EMA
self.symbol_EMA = self.EMA(self.stock_symbol, 10, Resolution.Daily)
# RSI
self.symbol_RSI = self.RSI(self.stock_symbol, 14, Resolution.Daily)
# Storage
self.storage = {"sum_OHLC":[],"SMA":[], "EMA":[], "RSI":[], "close":[]}
# Read serialized model
model_serialized = self.ObjectStore.Read("model_key")
# Config
model_serialized_config = json.loads(model_serialized)['config']
# Convert back to model
self.trained_model = Sequential.from_config(model_serialized_config)
# Saved average of values at entry
self.saved_average = 0
# Set warmup
self.SetWarmup(200)
def OnData(self, data: Slice):
# If SMA, EMA and RSI ready
if self.symbol_RSI.IsReady:
# Open
open_price = self.Securities[self.stock_symbol].Open
# High
high = self.Securities[self.stock_symbol].High
# Low
low = self.Securities[self.stock_symbol].Low
# Close
close = self.Securities[self.stock_symbol].Close
# Store values
self.storage["sum_OHLC"].append(open_price + high + low + close)
self.storage["SMA"].append(self.symbol_SMA.Current.Value)
self.storage["EMA"].append(self.symbol_EMA.Current.Value)
self.storage["RSI"].append(self.symbol_RSI.Current.Value)
self.storage["close"].append(close)
# Cut length
if len(self.storage["sum_OHLC"]) > 100:
self.storage["sum_OHLC"] = self.storage["sum_OHLC"][-100:]
self.storage["SMA"] = self.storage["SMA"][-100:]
self.storage["EMA"] = self.storage["EMA"][-100:]
self.storage["RSI"] = self.storage["RSI"][-100:]
self.storage["close"] = self.storage["close"][-100:]
# If not warming up
if not self.IsWarmingUp:
# If not invested
if not self.Portfolio.Invested:
# Normalize storage values
sum_OHLC_normalized = [i/max(self.storage["sum_OHLC"]) for i in self.storage["sum_OHLC"]]
EMA_normalized = [i/max(self.storage["EMA"]) for i in self.storage["EMA"]]
SMA_normalized = [i/max(self.storage["SMA"]) for i in self.storage["SMA"]]
RSI_normalized = [i/max(self.storage["RSI"]) for i in self.storage["RSI"]]
close_normalized = [i/max(self.storage["close"]) for i in self.storage["close"]]
# Reshape
sum_OHLC_normalized_reshaped = np.array(sum_OHLC_normalized).reshape(len(sum_OHLC_normalized),1)
EMA_normalized_reshaped = np.array(EMA_normalized).reshape(len(EMA_normalized),1)
SMA_normalized_reshaped = np.array(SMA_normalized).reshape(len(SMA_normalized),1)
RSI_normalized_reshaped = np.array(RSI_normalized).reshape(len(RSI_normalized),1)
# Predict
sum_OHLC_predict = self.trained_model.predict(sum_OHLC_normalized_reshaped)
EMA_predict = self.trained_model.predict(EMA_normalized_reshaped)
SMA_predict = self.trained_model.predict(SMA_normalized_reshaped)
RSI_predict = self.trained_model.predict(RSI_normalized_reshaped)
# Get most recent values
predicted_current_close_from_sum_OHLC = sum_OHLC_predict[-1][0][0]
predicted_current_close_from_EMA = EMA_predict[-1][0][0]
predicted_current_close_from_SMA = SMA_predict[-1][0][0]
predicted_current_close_from_RSI = RSI_predict[-1][0][0]
current_close = close_normalized[-1]
# If current close lower than all predicted values
if (
current_close < predicted_current_close_from_sum_OHLC and
current_close < predicted_current_close_from_EMA and
current_close < predicted_current_close_from_SMA and
current_close < predicted_current_close_from_RSI
):
# Buy with 100% portfolio cash
self.SetHoldings(self.stock_symbol, 1)
# Save average
self.saved_average = (predicted_current_close_from_sum_OHLC + predicted_current_close_from_EMA + predicted_current_close_from_SMA + predicted_current_close_from_RSI) / 4
# Else
else:
# Get normalized close prices
close_normalized = [i/max(self.storage["close"]) for i in self.storage["close"]]
# If current price under saved average
if close_normalized[-1] > self.saved_average:
# Sell
self.Liquidate(tag = "Normalized value exceeded predicted average at entry")
# Else
else:
# If current price lower than average price by stop loss percent
if close < self.Portfolio[self.stock_symbol].AveragePrice * (1 - (0.01 * self.stop_loss_percent)):
# Sell
self.Liquidate(tag = "Stop loss")