Created with Highcharts 12.1.2Equity2000200220042006200820102012201420162018202020222024202601M2M-20000.10.20102G4G0100M200M222426
Overall Statistics
Total Orders
1428
Average Win
1.01%
Average Loss
-1.16%
Compounding Annual Return
8.913%
Drawdown
24.500%
Expectancy
0.273
Start Equity
100000
End Equity
862582.82
Net Profit
762.583%
Sharpe Ratio
0.418
Sortino Ratio
0.34
Probabilistic Sharpe Ratio
0.829%
Loss Rate
32%
Win Rate
68%
Profit-Loss Ratio
0.87
Alpha
0.026
Beta
0.432
Annual Standard Deviation
0.105
Annual Variance
0.011
Information Ratio
0.024
Tracking Error
0.12
Treynor Ratio
0.102
Total Fees
$9516.91
Estimated Strategy Capacity
$2000000000.00
Lowest Capacity Asset
QQQ RIWIV7K5Z9LX
Portfolio Turnover
7.62%
# region imports
from AlgorithmImports import *
import datetime
import pandas as pd
# endregion

class SimpleIBS(QCAlgorithm):

    def initialize(self):
        # initialize
        self.set_start_date(2000, 1, 1)
        self.set_cash(100000)
        self.ibs_length = 3
        tickers = ['SPY', 'QQQ']
        # add equity to variable
        self.my_securities = []
        for ticker in tickers:
            self.my_securities.append(self.add_equity(ticker, Resolution.DAILY))

        # set transaction cost
        self.set_brokerage_model(BrokerageName.INTERACTIVE_BROKERS_BROKERAGE, AccountType.MARGIN)

        # set benchmark
        self.set_benchmark('SPY')

        #add IBS indictaor for daily resolution
        self.ibs_dict = {}
        self.avg_ibs_dict = {}
        for sercurity in self.my_securities:
            self.ibs_dict[sercurity.symbol] = self.ibs(sercurity.symbol, Resolution.DAILY)
            self.avg_ibs_dict[sercurity.symbol] = IndicatorExtensions.sma(self.ibs_dict[sercurity.symbol], self.ibs_length)


    def on_data(self, slice: Slice):
        for security in self.my_securities:
            avg_ibs = self.avg_ibs_dict[security.symbol]
            if not avg_ibs.is_ready:
                continue

            if avg_ibs.current.value < 0.4 and not self.portfolio.invested:
                self.set_holdings(security.symbol, 0.5)
                self.debug(f'{security.symbol} Open Position')
            if avg_ibs.current.value > 0.6:
                self.liquidate(security.symbol)
                self.debug(f'{security.symbol} Close Position')