Biu_SH 2025-01-13 10:58 采纳率: 0%
浏览 71
已结题

backtrader对于期货交易的现金和资产计算的问题

新手入门,最近在自学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.45
10000)=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)
  • 写回答

38条回答 默认 最新

  • 阿里嘎多学长 2025-01-13 11:07
    关注
    获得0.30元问题酬金

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    回答

    Backtrader是一个功能强大的 Python 交易平台,可以用来模拟和执行交易策略。对于期货交易的现金和资产计算问题,Backtrader提供了一个名为Broker的类来管理账户的现金和资产。

    在你的情况下,问题可能是由于你没有正确地设置Broker对象或没有正确地计算账户的现金和资产。

    以下是一些可能的解决方案:

    1. 检查Broker对象的设置:确保你已经设置了Broker对象,并且设置了正确的初始现金和资产。
    cerebro = bt.Cerebro()
    cerebro.broker.setcash(10000.0)  # 设置初始现金为10000.0
    
    1. 检查策略中的现金和资产计算:确保你的策略中正确地计算账户的现金和资产。可以使用Broker对象的getcash()getvalue()方法来获取账户的现金和资产。
    def my_strategy(data):
        # ...
        cash = cerebro.broker.getcash()
        value = cerebro.broker.getvalue()
        print(f'现金:{cash:.2f},资产:{value:.2f}')
        # ...
    
    1. 检查策略中的交易逻辑:确保你的策略中正确地执行交易逻辑。可以使用Order对象来创建和执行交易。
    def my_strategy(data):
        # ...
        if data.close > data.sma20:
            order = cerebro.broker.order('Buy', 100)  # 创建买入订单
        # ...
    

    如果你仍然无法解决问题,可以提供更多的代码和详细信息,我将尽力帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 修改了问题 1月13日
  • 修改了问题 1月13日
  • 创建了问题 1月13日