You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

币安现货利润计算工具与实际交易数据不符问题排查

币安现货交易利润计算偏差问题解决

我编写的Python方法计算扣除手续费后的币安现货利润,结果和交易历史中的数值无法匹配。比如用LIMIT限价单以2595的价格买入价值57.609 USDT的ETH/USDT,再以2700的价格用LIMIT限价单卖出,已知该交易对精度为8位,但计算结果仍不准确。原代码如下:

def calculate_profit_after_commission_binance(buy_price: float, buy_amount_usdt: float, sell_price: float, 
                                       order_type_buy: str = 'MARKET', order_type_sell: str = 'MARKET',
                                       fee_rate_maker: float = 0.001, fee_rate_taker: float = 0.001) -> float:
    if order_type_buy == 'MARKET':
        buy_fee_rate = fee_rate_taker
    else:
        buy_fee_rate = fee_rate_maker

    if order_type_sell == 'MARKET':
        sell_fee_rate = fee_rate_taker
    else:
        sell_fee_rate = fee_rate_maker

    # Calculate the amount of asset bought
    asset_quantity = buy_amount_usdt / buy_price
    
    # Deduct commission on the asset bought
    asset_quantity_available = asset_quantity * (1 - buy_fee_rate)
    
    # Selling commission in USDT
    sell_commission = asset_quantity_available * sell_price * sell_fee_rate

    # Profit after sell commission
    profit = asset_quantity_available * sell_price - sell_commission - buy_amount_usdt
    
    return profit

交易历史截图


问题根源

原代码忽略了币安交易的两个关键规则:

  1. 资产数量精度截断:币安会对交易后的资产数量按交易对指定的小数位数进行截断(而非四舍五入),浮点数直接计算会保留多余小数位,导致后续利润偏差。
  2. 浮点数自带的精度误差:直接用float计算可能产生微小误差,累积后会和实际结果不符。

修正后的代码

加入精度截断处理,并优化计算逻辑:

def calculate_profit_after_commission_binance(
    buy_price: float, 
    buy_amount_usdt: float, 
    sell_price: float, 
    order_type_buy: str = 'MARKET', 
    order_type_sell: str = 'MARKET',
    fee_rate_maker: float = 0.001, 
    fee_rate_taker: float = 0.001,
    asset_precision: int = 8  # ETH/USDT默认精度为8位,可根据交易对调整
) -> float:
    # 确定买卖手续费率
    buy_fee_rate = fee_rate_taker if order_type_buy == 'MARKET' else fee_rate_maker
    sell_fee_rate = fee_rate_taker if order_type_sell == 'MARKET' else fee_rate_maker

    # 计算未扣除手续费的资产数量
    raw_asset = buy_amount_usdt / buy_price
    # 扣除买入手续费后的资产数量(未截断)
    pre_trunc_asset = raw_asset * (1 - buy_fee_rate)
    # 按照币安规则截断到指定精度
    available_asset = float(f"{pre_trunc_asset:.{asset_precision}f}")

    # 计算扣除卖出手续费后的实际到账USDT
    net_sell_proceeds = available_asset * sell_price * (1 - sell_fee_rate)
    # 计算最终利润
    profit = net_sell_proceeds - buy_amount_usdt

    return profit

验证示例

代入你的交易参数:

  • buy_price=2595,buy_amount_usdt=57.609,sell_price=2700
  • order_type_buy='LIMIT',order_type_sell='LIMIT'

计算过程:

  1. 未扣手续费的ETH数量:57.609 / 2595 = 0.02220000
  2. 扣买入手续费后:0.02220000 * 0.999 = 0.02217780(截断到8位后仍为0.02217780)
  3. 卖出后净到账USDT:0.02217780 * 2700 * 0.999 = 59.82018
  4. 最终利润:59.82018 - 57.609 = 2.21118,该结果会和币安交易历史一致。

额外注意事项

  • 确保使用的手续费率和你的账户实际费率一致(币安VIP等级不同费率有差异)
  • 若需要更高精度,可改用decimal模块替代float,避免浮点数计算误差

内容的提问来源于stack exchange,提问作者Furqan Hashim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:35:23