| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 12.416% Drawdown 33.700% Expectancy 0 Net Profit 101.892% Sharpe Ratio 0.7 Probabilistic Sharpe Ratio 18.583% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.134 Beta -0.15 Annual Standard Deviation 0.166 Annual Variance 0.028 Information Ratio -0.003 Tracking Error 0.252 Treynor Ratio -0.775 Total Fees $2.72 |
from typing import List
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Algorithm.Framework.Alphas import AlphaModel, Insight
from QuantConnect.Algorithm.Framework.Execution import ImmediateExecutionModel
from QuantConnect.Algorithm.Framework.Portfolio import InsightWeightingPortfolioConstructionModel
from QuantConnect.Algorithm.Framework.Risk import NullRiskManagementModel
from QuantConnect.Algorithm.Framework.Selection import NullUniverseSelectionModel
from QuantConnect.Data import Slice
from QuantConnect.Data.UniverseSelection import SecurityChanges
from benchmark import InitBenchmark
class MyAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2015, 1, 1)
self.SetCash(100_000)
InitBenchmark(self, "SPY")
self.AddUniverseSelection(NullUniverseSelectionModel())
self.AddAlpha(MyAlphaModel())
self.SetPortfolioConstruction(InsightWeightingPortfolioConstructionModel())
self.SetExecution(ImmediateExecutionModel())
self.SetRiskManagement(NullRiskManagementModel())
class MyAlphaModel(AlphaModel):
def Update(self, algorithm: QCAlgorithm, data: Slice) -> List[Insight]:
insights = []
return insights
def OnSecuritiesChanged(self, algorithm: QCAlgorithm, changes: SecurityChanges) -> None:
for security in changes.AddedSecurities:
continue
for security in changes.RemovedSecurities:
continuefrom QuantConnect import Resolution
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Data import Slice
from benchmark import InitBenchmark
class MyAlgorithm(QCAlgorithm):
def Initialize(self) -> None:
self.SetStartDate(2015, 1, 1)
self.SetCash(100_000)
InitBenchmark(self, "SPY")
self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol
def OnData(self, data: Slice) -> None:
if not self.Portfolio.Invested:
self.SetHoldings(self.spy, 1)from typing import Union
from QuantConnect import Series, Chart, SeriesType, SecurityType
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Benchmarks import SecurityBenchmark
from System import DayOfWeek
from System.Drawing import Color
BENCHMARK_CHART_NAME = "Strategy Equity"
class BenchmarkContext:
benchmark_series_name: str
benchmark_starting_price: float
benchmark_starting_cash: float
def InitBenchmark(algorithm: Union[QCAlgorithm, BenchmarkContext],
symbol: str,
security_type: SecurityType = SecurityType.Equity) -> None:
algorithm.SetBenchmark(security_type, symbol)
InitBenchmarkPlotting(algorithm)
def InitBenchmarkPlotting(algorithm: Union[QCAlgorithm, BenchmarkContext]) -> None:
algorithm.benchmark_series_name = None
algorithm.benchmark_starting_price = None
algorithm.benchmark_starting_cash = algorithm.Portfolio.Cash
# Only plot once a week to avoid hitting the limit of 4000 data points
algorithm.Schedule.On(algorithm.DateRules.Every(DayOfWeek.Monday),
algorithm.TimeRules.Midnight,
lambda: PlotBenchmark(algorithm))
def InitBenchmarkSeries(algorithm: Union[QCAlgorithm, BenchmarkContext]) -> None:
benchmark = algorithm.Benchmark
if isinstance(benchmark, SecurityBenchmark):
algorithm.benchmark_series_name = f"Benchmark ({benchmark.Security.Symbol.Value})"
else:
algorithm.benchmark_series_name = "Benchmark"
chart = Chart(BENCHMARK_CHART_NAME)
chart.AddSeries(Series(algorithm.benchmark_series_name, SeriesType.Line, "$", Color.Black))
algorithm.AddChart(chart)
def PlotBenchmark(algorithm: Union[QCAlgorithm, BenchmarkContext]) -> None:
if algorithm.benchmark_series_name is None:
InitBenchmarkSeries(algorithm)
if algorithm.benchmark_starting_price is None or algorithm.benchmark_starting_price == 0:
algorithm.benchmark_starting_price = algorithm.Benchmark.Evaluate(algorithm.Time)
if algorithm.benchmark_starting_price == 0:
algorithm.Plot(BENCHMARK_CHART_NAME, algorithm.benchmark_series_name, algorithm.benchmark_starting_cash)
return
benchmark_price = algorithm.Benchmark.Evaluate(algorithm.Time)
benchmark_value = (benchmark_price / algorithm.benchmark_starting_price) * algorithm.benchmark_starting_cash
algorithm.Plot(BENCHMARK_CHART_NAME, algorithm.benchmark_series_name, benchmark_value)from typing import List
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Algorithm.Framework.Alphas import AlphaModel, Insight
from QuantConnect.Algorithm.Framework.Execution import ImmediateExecutionModel
from QuantConnect.Algorithm.Framework.Portfolio import InsightWeightingPortfolioConstructionModel
from QuantConnect.Algorithm.Framework.Selection import NullUniverseSelectionModel
from QuantConnect.Brokerages import AlphaStreamsBrokerageModel
from QuantConnect.Data import Slice
from QuantConnect.Data.UniverseSelection import SecurityChanges
from benchmark import InitBenchmarkPlotting
class MyAlgorithm(QCAlgorithm):
def Initialize(self):
# @formatter:off
# The blocked section of code below is to remain UNCHANGED for the weekly competitions.
#
# Insight-weighting portfolio construction model:
# - You can change the rebalancing date rules or portfolio bias
# - For more info see https://github.com/QuantConnect/Lean/blob/master/Algorithm.Framework/Portfolio/InsightWeightingPortfolioConstructionModel.py
#
# Use the Alpha Streams Brokerage Model:
# - Developed in conjunction with funds to model their actual fees, costs, etc. Please do not modify other models.
###############################################################################################################################
self.SetStartDate(2015, 3, 1) # 5 years up to the submission date
self.SetCash(1000000) # Set $1m Strategy Cash to trade significant AUM
self.SetBenchmark('SPY') # SPY Benchmark
self.SetBrokerageModel(AlphaStreamsBrokerageModel())
self.SetExecution(ImmediateExecutionModel())
self.SetPortfolioConstruction(InsightWeightingPortfolioConstructionModel())
###############################################################################################################################
# Do not change the code above
# @formatter:on
InitBenchmarkPlotting(self)
self.AddUniverseSelection(NullUniverseSelectionModel())
self.AddAlpha(MyAlphaModel())
class MyAlphaModel(AlphaModel):
def Update(self, algorithm: QCAlgorithm, data: Slice) -> List[Insight]:
insights = []
return insights
def OnSecuritiesChanged(self, algorithm: QCAlgorithm, changes: SecurityChanges) -> None:
for security in changes.AddedSecurities:
continue
for security in changes.RemovedSecurities:
continue