Overall Statistics
Total Trades
34782
Average Win
0.01%
Average Loss
-0.01%
Compounding Annual Return
0.863%
Drawdown
10.100%
Expectancy
0.035
Net Profit
4.595%
Sharpe Ratio
0.168
Probabilistic Sharpe Ratio
1.758%
Loss Rate
60%
Win Rate
40%
Profit-Loss Ratio
1.56
Alpha
0.008
Beta
0.001
Annual Standard Deviation
0.05
Annual Variance
0.002
Information Ratio
-0.739
Tracking Error
0.177
Treynor Ratio
5.938
Total Fees
$36034.21
from Selection.QC500UniverseSelectionModel import QC500UniverseSelectionModel
import random


class HolidaySpecial(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2015, 9, 25)  # Set Start Date
        self.SetEndDate(2020, 12, 25)  # Set Start Date
        starting_mochi_cash = 1000000
        self.SetCash(starting_mochi_cash)  # Set Strategy Cash

        self.SetBrokerageModel(AlphaStreamsBrokerageModel())
        self.SetUniverseSelection(QC500UniverseSelectionModel())
        self.UniverseSettings.Resolution = Resolution.Daily

        self.AddAlpha(MochiAlphaModel(self, starting_mochi_cash))
        self.SetExecution(ImmediateExecutionModel())
        self.SetPortfolioConstruction(InsightWeightingPortfolioConstructionModel(lambda time: None))


class MochiAlphaModel(AlphaModel):

    def __init__(self, algorithm, starting_mochi_cash):
        self.Name = 'MochiPAlphaModel'
        self.mochi_wealth = [starting_mochi_cash]
        self.CreateMochi()

    def Update(self, algorithm, data):
        # Clear counters and insights, return if data slice is empty.
        mochi_insights = []
        if not data.HasData:
            return []

        # Is Mochi feeling like working today?:
        if random.random() > self.mochi_diligence:
            return[]

        things_mochi_likes_now = []
        # What companies does Mochi like?
        for symbol in data.keys():
            if random.random() > self.mochi_grumpyness:
                things_mochi_likes_now.append(symbol)

        maximum_things_mochi_likes = len(things_mochi_likes_now)
        picks_a_few = min(self.mochi_hoardiness, maximum_things_mochi_likes)
        if picks_a_few == 0:
            mochi_is_tired = True
            return []

        for symbol in random.choices(things_mochi_likes_now, k=random.randrange(picks_a_few)):
            is_this_going_up = random.getrandbits(1)
            how_much = random.random()
            mochi_direction = self.mochi_directions[is_this_going_up]
            and_when = timedelta(days=self.mochi_patience)
            how_much_does_mochi_invest = random.random()

            one_mochi_insight = Insight(symbol, and_when,
                                        InsightType.Price,
                                        mochi_direction, how_much, 1,
                                        self.Name, how_much_does_mochi_invest)
            mochi_insights.append(one_mochi_insight)

        self.mochi_wealth.append(algorithm.Portfolio.TotalPortfolioValue)
        is_mochi_winning = self.mochi_wealth[-1] > self.mochi_wealth[0]
        is_mochi_doing_good = self.mochi_wealth[-1] > self.mochi_wealth[-2] and is_mochi_winning
        if not is_mochi_doing_good:
            self.CreateMochi()

        return mochi_insights

    def CreateMochi(self):
        self.mochi_diligence = random.random()
        self.mochi_patience = random.randrange(253)
        self.mochi_grumpyness = random.random()
        self.mochi_directions = [InsightDirection.Down, InsightDirection.Up]
        self.mochi_hoardiness = random.randrange(500)