Overall Statistics
Total Orders
2537
Average Win
0.52%
Average Loss
-0.48%
Compounding Annual Return
-12.803%
Drawdown
55.300%
Expectancy
-0.054
Start Equity
100000
End Equity
62038.95
Net Profit
-37.961%
Sharpe Ratio
-0.378
Sortino Ratio
-0.512
Probabilistic Sharpe Ratio
0.220%
Loss Rate
55%
Win Rate
45%
Profit-Loss Ratio
1.10
Alpha
-0.17
Beta
1.116
Annual Standard Deviation
0.243
Annual Variance
0.059
Information Ratio
-0.868
Tracking Error
0.187
Treynor Ratio
-0.082
Total Fees
$3987.82
Estimated Strategy Capacity
$2000.00
Lowest Capacity Asset
FUSN XFO1EI476739
Portfolio Turnover
6.15%
from AlgorithmImports import *
from datetime import datetime, timedelta


class FocusedYellowLemur(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2021, 1, 1)  # Set Start Date
        self.SetCash(100000)  # Set Strategy Cash

        self.add_equity("SPY")

        # Set the risk-free interest rate model
        self.set_risk_free_interest_rate_model(InterestRateProvider())

        # Now that the model is set, get the interest rate
        self.interest_rate = self.risk_free_interest_rate_model.get_interest_rate(self.time)
        
        self.universe_settings.asynchronous = True
        self.add_universe_selection(FundamentalUniverseSelectionModel(self.fundamental_filter_function))

        self.schedule.on(self.date_rules.month_start("SPY"),
                 self.time_rules.after_market_open("SPY"),
                 self.rebalancing_code)
        

    def fundamental_filter_function(self, coarse: List[CoarseFundamental]) -> List[Symbol]:
        if self.interest_rate < 0.0025:
            amount = 50
        else:
            amount = 10
        
        selected = [c for c in coarse if c.has_fundamental_data]
        sorted_by_dollar_volume = sorted(selected, key=lambda c: c.dollar_volume, reverse=True)
        filtered = [f for f in sorted_by_dollar_volume if f.has_fundamental_data and f.price > 10 and not np.isnan(f.valuation_ratios.pe_ratio)]
        sorted_by_pe_ratio = sorted(filtered, key=lambda f: f.valuation_ratios.pe_ratio)
        fundamental_symbols = [f.symbol for f in sorted_by_pe_ratio[:amount]]
        return fundamental_symbols


    def rebalancing_code(self):
        self.interest_rate = self.risk_free_interest_rate_model.get_interest_rate(self.time)

        self.liquidate()

        for security in self.ActiveSecurities.Values:
            self.SetHoldings(security.Symbol, 1 / len(self.ActiveSecurities))

        self.Plot("interest rate", "value", self.interest_rate)