微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

问题,使用 backtrader 和 btalib 进行回测,这不是我尝试过的操作,如果 sma5> sma10 并在 sma5<sma14 时卖出,我想作为订单操作

如何解决问题,使用 backtrader 和 btalib 进行回测,这不是我尝试过的操作,如果 sma5> sma10 并在 sma5<sma14 时卖出,我想作为订单操作

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,Comm %.2f'%
                        (order.executed.price,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,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

cerebro 功能是什么回测模块

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

解决方法

可能您必须反转 df 的顺序,这是我在使用 btalib 计算 RSI 时遇到的问题。 示例:df = df.iloc[::-1]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。