币安现货利润计算工具与实际交易数据不符问题排查
币安现货交易利润计算偏差问题解决
我编写的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

问题根源
原代码忽略了币安交易的两个关键规则:
- 资产数量精度截断:币安会对交易后的资产数量按交易对指定的小数位数进行截断(而非四舍五入),浮点数直接计算会保留多余小数位,导致后续利润偏差。
- 浮点数自带的精度误差:直接用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=2700order_type_buy='LIMIT',order_type_sell='LIMIT'
计算过程:
- 未扣手续费的ETH数量:
57.609 / 2595 = 0.02220000 - 扣买入手续费后:
0.02220000 * 0.999 = 0.02217780(截断到8位后仍为0.02217780) - 卖出后净到账USDT:
0.02217780 * 2700 * 0.999 = 59.82018 - 最终利润:
59.82018 - 57.609 = 2.21118,该结果会和币安交易历史一致。
额外注意事项
- 确保使用的手续费率和你的账户实际费率一致(币安VIP等级不同费率有差异)
- 若需要更高精度,可改用
decimal模块替代float,避免浮点数计算误差
内容的提问来源于stack exchange,提问作者Furqan Hashim
相关产品推荐
相关产品推荐

