Created with Highcharts 12.1.2Equity20102011201220132014201520162017201820192020202120222023202420252026010M20M-50-25000.050.10120500M1,000M025M50M050100
Overall Statistics
Total Orders
108
Average Win
7.47%
Average Loss
-4.24%
Compounding Annual Return
19.708%
Drawdown
32.800%
Expectancy
1.294
Start Equity
1000000
End Equity
15109866.50
Net Profit
1410.987%
Sharpe Ratio
0.773
Sortino Ratio
0.831
Probabilistic Sharpe Ratio
19.731%
Loss Rate
17%
Win Rate
83%
Profit-Loss Ratio
1.76
Alpha
0
Beta
0
Annual Standard Deviation
0.17
Annual Variance
0.029
Information Ratio
0.876
Tracking Error
0.17
Treynor Ratio
0
Total Fees
$8324.64
Estimated Strategy Capacity
$570000000.00
Lowest Capacity Asset
GOOCV VP83T1ZUHROL
Portfolio Turnover
0.51%
from AlgorithmImports import *
from random import random

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 = datetime(year,month,1)
    while new_date.weekday() >= 5: # Adjust for weekdays
        new_date += timedelta(days=1)
    return new_date

class MyAlgorithm(QCAlgorithm):

    def change(self, before, after):
        diff = after-before
        return diff/before

    def OnEndOfAlgorithm(self):
        self.Liquidate()

    def Initialize(self):
        self.set_brokerage_model(BrokerageName.INTERACTIVE_BROKERS_BROKERAGE, AccountType.Cash)
        self.tickers = ["MSFT", "AAPL", "SPY", "GOOG"]

        self.holdMonths = 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.AddEquity(ticker, Resolution.DAILY, leverage=1)

        # Get Data for 6 years before the start of calculations
        self.nextSellTime = self.Time
        self.nextBuyTime = self.Time

    def on_data(self, data: Slice):
        if self.Time.weekday() >= 5: return # During the weekend
        if self.Time > DateTime(self.END_YEAR,1,1): # One month before the "end" of the algorithm
            self.Liquidate()
        elif self.nextSellTime <= self.Time:
            self.Liquidate()
            self.nextSellTime = add_months(self.Time, self.holdMonths)
            self.nextBuyTime = self.Time + timedelta(days=5)
        elif self.nextBuyTime <= self.Time: # Should buy again
            randomAllocations = dict()
            for ticker in self.tickers:
                randomAllocations[ticker] = random()

            randomAllocations = dict([(ticker, percentage/sum(randomAllocations.values()) * 0.99) for ticker, percentage in randomAllocations.items()])

            self.log(str(sum(randomAllocations.values())) + " " + str(randomAllocations))

            holdings = [PortfolioTarget(ticker, percentage) for ticker, percentage in randomAllocations.items()]
            self.set_holdings(holdings)
            self.nextBuyTime += timedelta(days=100000) #never