在使用backtrader进行回测外汇数据时,烧脑的是在保证金杠杆的设置。

例如:如何EURUSD下单1手时,100倍杠杆的情况下,

buy: 1.12888,close: 1.13162

占用保证金:1128.88

其中赚取0.00274即274个点,按17的点差,单边收取8.5个点。

毛利:274

净利 = 毛利 – 点差 = 274 – 17 = 257

如以下运行结果:

经过测试,可以使用多种方式实现,这里介绍两种简单的方式,我个人觉得在特定的情况下行数越少运行越高效。

核心:设置参数使保证金 = automargin * margin * size * price

第一种:cerebro.broker.setcommission

cerebro.broker.setcommission(commission=SYMBOL_COMM[symbol_name] * 1000.0 * 100.0 / 2, # SYMBOL_COMM[symbol_name]为货币对的点差,/2 :变成单边点差
                             margin=1, # 必须为1
                             automargin=1000,# 不同货币的保证金可以使用公式计算得出
                             mult=1000.0*100.0, # 100是杠杆的倍数,1000固定
                             name=symbol_name) # 设定此方案分配给那个货币对使用

第二种:cerebro.broker.addcommissioninfo

comm_customize_symbol = bt.CommissionInfo(
    commission=SYMBOL_COMM[symbol_name] * 1000.0 * 100.0 / 2, # SYMBOL_COMM[symbol_name]为货币对的点差,/2 :变成单边点差
    margin=1, # 必须为1
    automargin=1000, # 不同货币的保证金可以使用公式计算得出
    mult=1000.0 * 100.0, # 100是杠杆的倍数,1000固定
    )#
cerebro.broker.addcommissioninfo(comm_customize_symbol, symbol_name)

上面两种方式,都要记得设置和修改SYMBOL_COMM[symbol_name],这里存的是货币对的点差。当然您也可以另外设置参数,让点差自动浮动起来。这是另外的话题了。

下面是完整的代码:

import backtrader as bt

# 佣金点差
SYMBOL_COMM = {
    'EURUSD': 0.00017,
}
cerebro = bt.Cerebro()
cerebro.broker.setcommission(commission=sett.SYMBOL_COMM[symbol_name] * 1000.0 * 100.0 / 2, # SYMBOL_COMM[symbol_name]为货币对的点差,/2 :变成单边点差
                             margin=1, # 必须为1,原因不说了,
                             automargin=1000, # 不同货币的保证金可以使用公式计算得出
                             mult=1000.0*100.0, # 100是杠杆的倍数,1000固定
                             name=symbol_name) # 设定此方案分配给那个货币对使用