Backtrader no comprende la tabla de iteración de estrategias y no puede comprender completamente las operaciones de múltiples hebras

Tutorial técnico "Sweeper Backtrader Powerful Tutorial Series 1: Stock Quantitative Backtest Core"

El documento backtrader en sí mismo no propone el concepto de "tabla de iteración de estrategias", que es el concepto que presentamos en nuestro tutorial autoeditado. En la operación de múltiples hebras, debe comprender la alineación de los datos en la tabla de iteración de estrategias que involucran múltiples hebras; de lo contrario, no podrá comprender algunos fenómenos operativos. Por ejemplo, la siguiente pregunta se debe a que no se comprende este concepto.

 

Alguien hizo una pregunta en el foro de backtrader , mira aquí , escribió un código de prueba simple, como sigue. Se agregan dos datos de mercado a la estrategia, data0 es el índice (Shanghai y Shenzhen 300) y data1 es la acción 000001.SZ. En la siguiente iteración a una barra, genere la fecha de data0, el precio de cierre de data1, etc.

class TestStrategy(bt.Strategy):

    def log(self, txt, dt=None):
        ''' Logging function for this strategy'''
        dt = dt or self.datas[0].datetime.date(0)
        print('%s, %s' % (dt.isoformat(), txt))

    def __init__(self):
        # Keep a reference to the "close" line in the data[0] dataseries
        self.dataclose = self.datas[0].close

    def next(self):
        # Simply log the closing price of the series from the reference
        self.log('Close, %.2f, open, %.2f, cash, %.2f' % (self.datas[1].close[0],self.datas[1].open[0],cerebro.broker.getcash()))
        self.buy(self.datas[1])


# if __name__ == '__main__':
    # Create a cerebro entity
cerebro = bt.Cerebro()

# Add a strategy


# Datas are in a subfolder of the samples. Need to find where the script is
# because it could have been called from anywhere
# modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
# datapath = os.path.join(modpath, '../../datas/orcl-1995-2014.txt')
idxpath = ('data2/idx300.csv')
fromdate=datetime(2013, 1, 4)
todate=datetime(2013, 12, 31)
top_buyers=10
keep_buyers=50
universe_size=100

idx = bt.feeds.GenericCSVData(
            dataname=idxpath,
            name="idx300",
            dtformat ="%Y-%m-%d",
            # Do not pass values before this date
            fromdate=fromdate,
            todate=todate,
            openinterest=-1)
# spy = bt.feeds.YahooFinanceData(dataname='SPY',
#                                  fromdate=datetime(2012,2,28),
#                                  todate=datetime(2018,2,28),
#                                  plot=False)
cerebro.adddata(idx,timeframe=bt.TimeFrame.Days)  # add 沪深300 Index
ticker="000001.SZ"

df = pd.read_csv(f"data2/{ticker}.csv",
             parse_dates=True,
             usecols=[1,2,3,4,5],
             index_col=0).dropna(axis=0)
df[~df.index.duplicated()]
df=df.iloc[::-1]
df=df.loc[fromdate:todate]
cerebro.adddata(bt.feeds.PandasData(dataname=df,name=ticker, plot=False),timeframe=bt.TimeFrame.Days)

cerebro.addstrategy(TestStrategy)

# Set our desired cash start
cerebro.broker.setcash(100000.0)

# Print out the starting conditions
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())

# Run over everything
cerebro.run()

# Print out the final result
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

Resultado de salida

Starting Portfolio Value: 100000.00
2013-01-04, Close, 5.21, open, 5.32, cash, 100000.00
2013-01-04, Close, 5.31, open, 5.21, cash, 99994.79
2013-01-07, Close, 5.31, open, 5.21, cash, 99994.79
2013-01-07, Close, 5.21, open, 5.31, cash, 99984.18
2013-01-08, Close, 5.21, open, 5.31, cash, 99984.18
2013-01-08, Close, 5.17, open, 5.20, cash, 99973.78
2013-01-09, Close, 5.17, open, 5.20, cash, 99973.78
2013-01-09, Close, 5.17, open, 5.17, cash, 99963.45
2013-01-10, Close, 5.17, open, 5.17, cash, 99963.45
2013-01-10, Close, 5.06, open, 5.17, cash, 99953.11

Su pregunta es por qué la fecha en el resultado de salida se repite dos veces el mismo día. Esperaba un récord por día.

Para esta pregunta, consulte las dos secciones siguientes de nuestro tutorial. 1.2 es una tabla de iteración de estrategia simple que involucra una sola acción, y 11.2 es una tabla de iteración de estrategia compleja que involucra múltiples acciones.

Supongo que te gusta

Origin blog.csdn.net/qtbgo/article/details/109611777
Recomendado
Clasificación