新手入门,最近在自学backtrader的时候遇到一个问题,查了很多AI都找不到原因。
想请各位帮忙解惑一下,感激不尽!!
按照我的买入逻辑,收盘价大于SMA20的时候就买,但是问题在于之后打印出来的现金和资产和我算的有误。
我的价格分别是
2024-1-29:HIGH:103.23,CLOSE:103.21,OPEN:103.03,LOW:103.025
2024-1-30:HIGH:103.505,CLOSE:103.45,OPEN:103.35,LOW:103.325
2024-1-31:HIGH:103.66,CLOSE:103.57,OPEN:103.655,LOW:103.46
2024-1-29挂买单,2024-1-30成交
我是期货交易,初始资金10W。
按理2024-1-30打印出来的现金余额应该是
100,000 -(103.35*10000)0.03 = 68,995 元
资产价值是
68995+(103.4510000)=1,103,495元
但是python打印出来的结果
“
2024-01-30, 买入已执行,103.350
持仓:1
2024-01-30, 收盘价:103.450,当前现金:69995.00,当前资产:101030.00
”
我实在不知道是哪里有问题,,有能帮忙吗
以下是我完整代码
import backtrader as bt
from backtrader import *
from datetime import datetime, timedelta
import pandas as pd
#设置期货佣金
class FT(bt.CommInfoBase):
params = (
('stocklike',False),#表示期货交易
# ('commtype',0),#固定金额佣金
# ('commission',0.0),#期货交易不适用百分比佣金
('margin',0.03),#保证金比例
('mult',10000)#合约乘数
)
# def getcommission(self, size, price):
# return abs(size)*self.params.commission
def get_margin(self, price):
return price*self.params.mult*self.params.margin
class ST(bt.Strategy):
params=(
('exitbars',5),
('myperiod',20),
)
def log(self,txt):
dt=self.datas[0].datetime.date(0)
print(f'{dt},{txt}')
#设置初始化
def __init__(self):
self.dataclose=self.data.close
self.bar=0
self.sma = bt.indicators.MovingAverageSimple(self.datas[0], period=self.params.myperiod)
def notify_order(self, order):
if order.status in [order.Completed]:
if order.isbuy():
self.log(f'买入已执行,{order.executed.price:.3f}')
print(f'持仓:{self.position.size}')
elif order.issell():
self.log(f'卖出已执行,{order.executed.price:.3f}')
print(f'持仓:{self.position.size}')
def next(self):
self.log(f'收盘价:{self.dataclose[0]:.3f},当前现金:{self.broker.getcash():.2f},当前资产:{self.broker.getvalue():.2f}')
dt = self.datas[0].datetime.date(0)
if self.dataclose[0]>self.sma[0]:
self.log(f'设置买单,{self.dataclose[0]}')
self.buy()
cerebro=bt.Cerebro()
#添加策略
cerebro.broker.addcommissioninfo(FT())
cerebro.addstrategy(ST)
#导入数据
path= (r'C:\Users\Administrator\Desktop\2024国债期货日K.xlsx')
df=pd.read_excel(path,index_col='datetime',parse_dates=True)
start_date=datetime(2024,1,2)
end_time=datetime(2024,12,23)
data=bt.feeds.PandasData(dataname=df,fromdate=start_date,todate=end_time)
#添加数据源
cerebro.adddata(data)
#设置金额
cerebro.broker.setcash(100000)
cash1=cerebro.broker.getvalue()
print(f'初始资金:{cash1:.2f}')
cerebro.run()
cash2=cerebro.broker.getvalue()
print(f'最终资产:{cash2:.2f}')
cerebro.plot(volume=False)