Overall Statistics
Total Orders
781
Average Win
0.42%
Average Loss
-0.37%
Compounding Annual Return
18.320%
Drawdown
6.000%
Expectancy
0.129
Start Equity
100000
End Equity
118247.49
Net Profit
18.247%
Sharpe Ratio
1.055
Sortino Ratio
1.46
Probabilistic Sharpe Ratio
57.612%
Loss Rate
47%
Win Rate
53%
Profit-Loss Ratio
1.11
Alpha
0.129
Beta
0.14
Annual Standard Deviation
0.105
Annual Variance
0.011
Information Ratio
1.204
Tracking Error
0.201
Treynor Ratio
0.794
Total Fees
$819.25
Estimated Strategy Capacity
$7000000.00
Lowest Capacity Asset
ATH S9AP9FK1TBHH
Portfolio Turnover
22.12%
from AlgorithmImports import *

class ShortingYesterdayTopDailyGainers(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2022, 1, 1)
        self.set_end_date(2022, 12, 31)
        self.universe_settings.schedule.on(self.date_rules.week_start())
        self._universe = self.add_universe(self.selection)
        self.schedule.on(self.date_rules.week_start(), self.time_rules.at(9, 31), self.rebalance)
        self.last_prices = None
        self.short = []
        self.long = []

    def selection(self, fundamental):
        selected = []
        prices = pd.DataFrame([[f.symbol, f.adjusted_price, f.market_cap] for f in fundamental], columns=["Symbol", "Price", "Cap"]).set_index("Symbol")
        prices = prices[(prices["Cap"] >= 1e11) & (prices["Price"] >= 5)]
        if isinstance(self.last_prices, pd.DataFrame) and not self.last_prices.empty:
            pct_chg = (prices - self.last_prices).dropna()
            self.short = list(pct_chg.nlargest(5, 'Price').index)
            self.long = list(pct_chg.nsmallest(5, 'Price').index)
        self.last_prices = prices
        return self.short + self.long

    def rebalance(self):
        self.set_holdings([PortfolioTarget(symbol, -0.1) for symbol in self.short] \
            + [PortfolioTarget(symbol, 0.1) for symbol in self.long] \
            + [PortfolioTarget(symbol, 0.) for symbol in self.securities.keys() if symbol not in self.short + self.long])