Overall Statistics
Total Orders
10
Average Win
2.60%
Average Loss
-0.56%
Compounding Annual Return
5754.633%
Drawdown
1.000%
Expectancy
3.049
Start Equity
200000.00
End Equity
225678.42
Net Profit
12.839%
Sharpe Ratio
323.258
Sortino Ratio
0
Probabilistic Sharpe Ratio
99.963%
Loss Rate
29%
Win Rate
71%
Profit-Loss Ratio
4.67
Alpha
86.168
Beta
0.4
Annual Standard Deviation
0.266
Annual Variance
0.071
Information Ratio
280.854
Tracking Error
0.308
Treynor Ratio
215.046
Total Fees
$1164.40
Estimated Strategy Capacity
$170000000.00
Lowest Capacity Asset
BTCBUSD 18R
Portfolio Turnover
136.16%
from AlgorithmImports import *

class BinanceCryptoFutureDataAlgorithm(QCAlgorithm):

    def initialize(self) -> None:
        self.set_start_date(2022, 10, 1)
        self.set_end_date(2022, 10, 10)
        self.set_cash("BUSD", 100000)

        self.set_brokerage_model(BrokerageName.BINANCE_FUTURES, AccountType.MARGIN)

        self.universe_settings.resolution = Resolution.DAILY
        self.universe_settings.leverage = 2
        symbols = Symbol.create("BTCBUSD", SecurityType.CRYPTO_FUTURE, Market.BINANCE)
        self.add_universe_selection(ManualUniverseSelectionModel(symbols))

        self.add_alpha(CryptoFutureAlphaModel())
        self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())
        self.set_execution(ImmediateExecutionModel())

class CryptoFutureAlphaModel(AlphaModel):

    def __init__(self) -> None:
        self.symbols = []

    def update(self, algorithm: QCAlgorithm, slice: Slice) -> List[Insight]:
        insights = []

        for symbol in self.symbols:
            if symbol in slice.margin_interest_rates:
                interest_rate = slice.margin_interest_rates[symbol].interest_rate
                algorithm.log(f"{symbol} close at {slice.time}: {interest_rate}")      

            if not slice.bars.contains_key(symbol) or not slice.quote_bars.contains_key(symbol):
                continue

            quote = slice.quote_bars[symbol]
            price = slice.bars[symbol].price
            
            if price - quote.bid.close > quote.ask.close - price:
                insights.append(Insight.price(symbol, timedelta(1), InsightDirection.DOWN))
            else:
                insights.append(Insight.price(symbol, timedelta(1), InsightDirection.UP))
            
        return insights

    def on_securities_changed(self, algorithm: QCAlgorithm, changes: SecurityChanges) -> None:
        for security in changes.added_securities:
            symbol = security.symbol
            self.symbols.append(symbol)

            # Historical data
            history = algorithm.history(symbol, 10, Resolution.DAILY)
            algorithm.debug(f"We got {len(history)} from our history request for {symbol}")

        for security in changes.removed_securities:
            symbol = security.symbol
            if symbol in self.symbols:
                self.symbols.remove(symbol)