0
from btalib.indicators import sma
import pandas as pd
import backtrader as bt
import os.path #To manage paths
import sys      # to find out the script name
import datetime
import matplotlib as plt
from backtrader import cerebro
from numpy import mod #for datetime object

df = pd.read_csv('C:/Users/User/Desktop/programming/dataset/coin_Bitcoin.csv',parse_dates=True, index_col='Date')

sma14 = btalib.sma(df, period = 14)
sma5 = btalib.sma(df, period=5)

class TestStrategy(bt.Strategy):

    params = (
    ('exitbars', 5),
    )

    def log(self, txt, dt=None):
    #Logging function fot 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
    # To keep track of pending orders
        self.order = None
        self.buyprice = None
        self.buycomm = None

  

    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
    # Buy/Sell order submitted/accepted to/by broker - Nothing to do
            return
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log(
                    'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm: %.2f' %
                    (order.executed.price,
                    order.executed.value,
                    order.executed.comm))
                self.buyprice = order.executed.price
                self.buycomm = order.executed.comm
            else: #sell
                self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f'%
                        (order.executed.price,
                        order.executed.value,
                        order.executed.comm))

            self.bar_executed = len(self)
        
    
        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log('Order Canceled/Margin/Reject')
    # Write down: no pending order
        self.order = None 
    # Check if an order has been completed
    # Attention: broker could reject order if not enough cash
    def notify_trade(self, trade):
        if not trade.isclosed:
            return
        self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
                (trade.pnl, trade.pnlcomm))


         

    def next(self):
    #sma = btalib.sma(df, period=30)
    # Simply log the closing price of the series from the reference
        self.log('Close, %.2f' % self.dataclose[0])
    # Check if an order is pending ... if yes, we cannot send a 2nd one
        if self.order:
            return
    # Check if we are in the market
    #if not self.position:

     # Not yet ... we MIGHT BUY if ...
    
        if  sma5[0] > sma14[0]:


                # BUY, BUY, BUY!!! (with all possible default parameters)
            self.log('BUY CREATE, %.2f' % self.dataclose[0])
                # Keep track of the created order to avoid a 2nd order
            self.order = self.buy()
               
        else:
            # Already in the market ... we might sell
            if sma5[0] < sma14[0]:
            # SELL, SELL, SELL!!! (with all possible default parameters)
                self.log('S[enter image description here][1]ELL CREATE, %.2f' %             self.dataclose[0])

                self.order = self.sell()

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

# Add a strategy
    cerebro.addstrategy(TestStrategy)

    modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
    datapath = os.path.join(modpath, 'C:/programming/AlgoTrading/backtest/BTC-USD-YF.csv')
    data = bt.feeds.YahooFinanceCSVData(

        dataname = datapath,
        fromdate = datetime.datetime(2020,5,1),
        todate = datetime.datetime(2021,6,1),
        reverse = False)

#Add the Data Feed to Cerebro
    cerebro.adddata(data)
    cerebro.broker.setcash(100000.0)
# Add a FixedSize sizer according to the stake
#cerebro.addsizer(bt.sizers.FixedSize, stake=10)
    cerebro.addsizer(bt.sizers.FixedSize)
# Set the commission
    cerebro.broker.setcommission(commission=0.0)

# Print out the starting conditions
    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
# Run over everything
    cerebro.run()
#print(df(data))
# Print out the final result
    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.plot()

我非常努力地在 sma5>sma14 时下单买入并在 sma5<sma14 时卖出,但它不起作用我使用 backtrader 作为回测库并使用 btalib 作为指标 o 在“btalib.sma(df, period)”处生成信号

脑功能是什么回测模块

有时是每天买卖,今天买明天卖


您需要先从 zoho 应用程序授予读取、写入、编辑权限

4

1 回答 1

0

可能你必须颠倒你的df的顺序,这是我用btalib计算RSI时的问题。例子:df = df.iloc[::-1]

于 2021-08-10T19:51:36.443 回答