Created with Highcharts 12.1.2Equity20102011201220132014201520162017201820192020202120222023202420252026020M-50-25000.050.10120500M1,000M025M50M050100
Overall Statistics
Total Orders
109
Average Win
7.79%
Average Loss
-4.17%
Compounding Annual Return
20.269%
Drawdown
30.800%
Expectancy
1.336
Start Equity
1000000
End Equity
16215114.08
Net Profit
1521.511%
Sharpe Ratio
0.803
Sortino Ratio
0.857
Probabilistic Sharpe Ratio
23.398%
Loss Rate
19%
Win Rate
81%
Profit-Loss Ratio
1.87
Alpha
0
Beta
0
Annual Standard Deviation
0.168
Annual Variance
0.028
Information Ratio
0.906
Tracking Error
0.168
Treynor Ratio
0
Total Fees
$8350.09
Estimated Strategy Capacity
$340000000.00
Lowest Capacity Asset
GOOCV VP83T1ZUHROL
Portfolio Turnover
0.50%
import datetime as dt
from random import random, seed
from AlgorithmImports import *
def add_months(current_date, months_to_add):
    year = current_date.year
    month = current_date.month + months_to_add
    while month > 12:
        year += 1
        month -= 12
    new_date = dt.datetime(year, month, 1)
    while new_date.weekday() >= 5:
        new_date += dt.timedelta(days=1)
    return new_date
class MyAlgorithm(QCAlgorithm):
    def initialize(self):
        self.set_brokerage_model(BrokerageName.INTERACTIVE_BROKERS_BROKERAGE, AccountType.CASH)
        self.tickers = ["MSFT", "AAPL", "SPY", "GOOG"]
        self.hold_months = 12
        self.END_YEAR = 2025
        self.set_start_date(2010, 1, 1)
        self.set_end_date(self.END_YEAR, 2, 1)
        self.set_cash(1000000)
        for ticker in self.tickers:
            self.add_equity(ticker, Resolution.DAILY, leverage=1)
        self.next_sell_time = self.Time
        self.next_buy_time = self.Time
        seed(2)
    def on_data(self, data):
        if self.Time.weekday() >= 5:
            return
        if self.Time > dt.datetime(self.END_YEAR, 1, 1):
            self.liquidate()
        elif self.next_sell_time <= self.Time:
            self.liquidate()
            self.next_sell_time = add_months(self.Time, self.hold_months)
            self.next_buy_time = self.Time + dt.timedelta(days=5)
        elif self.next_buy_time <= self.Time:
            random_allocations = {ticker: random() for ticker in self.tickers}
            total = sum(random_allocations.values())
            random_allocations = {ticker: 0.99 * percentage / total for ticker, percentage in random_allocations.items()}
            self.log(f"{sum(random_allocations.values())} {random_allocations}")
            for ticker, percentage in random_allocations.items():
                self.set_holdings(ticker, percentage)
            self.next_buy_time += dt.timedelta(days=100000)  # Never