如何解决问题,使用 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 有时是每天买卖,今天买明天卖
解决方法
可能您必须反转 df 的顺序,这是我在使用 btalib 计算 RSI 时遇到的问题。
示例:df = df.iloc[::-1]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。