| Overall Statistics |
|
Total Orders 1073 Average Win 0.15% Average Loss -0.14% Compounding Annual Return -6.638% Drawdown 24.500% Expectancy -0.184 Start Equity 100000 End Equity 86402.83 Net Profit -13.597% Sharpe Ratio -0.489 Sortino Ratio -0.386 Probabilistic Sharpe Ratio 1.414% Loss Rate 62% Win Rate 38% Profit-Loss Ratio 1.12 Alpha -0.073 Beta 0.122 Annual Standard Deviation 0.148 Annual Variance 0.022 Information Ratio -0.374 Tracking Error 0.202 Treynor Ratio -0.593 Total Fees $1671.14 Estimated Strategy Capacity $920000.00 Lowest Capacity Asset TLH TP8J6Z7L419H Portfolio Turnover 12.12% |
# region imports
from AlgorithmImports import *
# endregion
class AdaptableBlueSnake(QCAlgorithm):
def initialize(self) -> None:
self.set_start_date(2022, 1, 1)
self.set_cash(100000)
self.set_benchmark("SPY")
self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())
self.set_execution(ImmediateExecutionModel())
self.assets = ["IEF", "SHY", "TLT", "IEI", "SHV", "TLH", "EDV", "BIL",
"SPTL", "TBT", "TMF", "TMV", "TBF", "VGSH", "VGIT",
"VGLT", "SCHO", "SCHR", "SPTS", "GOVT"]
self.symbols = {}
# Add Equity ------------------------------------------------
for i in range(len(self.assets)):
self.symbols[self.assets[i]] = self.add_equity(self.assets[i], Resolution.MINUTE).symbol
# Set the Scheduled Event method
self.schedule.on(self.date_rules.every(DayOfWeek.MONDAY), self.time_rules.after_market_open("IEF", 1), self.every_day_after_market_open)
for i, symbol in enumerate(self.symbols.values()):
chart = Chart(symbol)
chart.add_series(CandlestickSeries(symbol, 0, "$"))
self.add_chart(chart)
def OnData(self, data: Slice):
return
def on_end_of_day(self, symbol: Symbol) -> None:
self.Plot(symbol, symbol, self.securities[symbol].get_last_data())
def every_day_after_market_open(self):
# Fetch history on our universe
df = self.history(self.securities.keys(), 5, Resolution.DAILY)
# Make all of them into a single time index.
df = df.close.unstack(level=0)
# Calculate the truth value of the most recent price being less than 1 std away from the mean
classifier = df.le(df.mean().subtract(df.std())).tail(1)
# Get indexes of the True values
classifier_indexes = np.where(classifier)[1]
# Get the Symbols for the True values
classifier = classifier.transpose().iloc[classifier_indexes].index.values
# Get the std values for the True values (used for magnitude)
magnitude = df.std().transpose()[classifier_indexes].values
# Zip together to iterate over later
selected = zip(classifier, magnitude)
# ==============================
insights = []
for symbol, magnitude in selected:
insights.append(Insight.price(symbol, timedelta(days=5), InsightDirection.UP, magnitude))
self.emit_insights(insights)