使用Algofi Python SDK计算出借利率结果偏差如何修复
Algofi借贷池出借利率计算偏差修正
问题背景
- 目标:按照官方公式计算Algofi资金池出借利率,公式为:
Supply Interest Rate = Borrow Utilization * Borrow Interest Rate * (1 - Reserve Factor) - 测试对象:Algo借贷池,参数为
market_app_id= 465814065 - 异常现象:自行实现的代码输出利率为1.01%,官方前端展示的出借利率为1.06%,存在约0.05%的固定偏差
- 初始实现代码:
borrowed = asset.get_decimal_amount(market.get_underlying_borrowed()) supplied = asset.get_decimal_amount(market.get_underlying_supplied()) borrow_utilisation = borrowed/supplied borrow_interest_rate = market.get_total_borrow_interest_rate()/1000000000 reserve_factor = market.reserve_factor/1000 lend_interest_rate = borrow_utilisation*borrow_interest_rate*(1-reserve_factor) print(f"lending rate: {lend_interest_rate}")
错误点与修正方法
计算逻辑存在4个口径不匹配的问题,逐一修正后即可对齐前端结果:
- 准备金系数精度错误
链上存储的reserve_factor精度为1e9,和借款利率的精度一致,当前除以1000的缩放逻辑会导致准备金扣除比例计算错误,需调整为除以10**9。 - 借贷利用率分母统计口径错误
直接调用get_underlying_supplied()拿到的总供给包含了累计锁入准备金地址的资金,这部分资金不参与借贷计息,计算有效利用率时需要提前扣除,正确分母为「总供给量 - 累计准备金量」。 - 借款利率未覆盖全品类借贷
Algofi借贷池同时支持浮动利率、固定利率两种借款模式,调用的get_total_borrow_interest_rate()仅返回浮动借贷部分的利率,需要按两类借款的未还占比加权,计算全池平均借款利率。 - 未叠加流动性奖励收益(前端默认包含)
前端展示的出借利率默认包含了平台发放的ALGO流动性挖矿奖励年化,纯借贷利息计算完成后,需要叠加对应奖励APR才能完全对齐前端展示值。
修正后可运行代码
# 拉取基础借贷数据 total_borrowed = asset.get_decimal_amount(market.get_underlying_borrowed()) fixed_borrowed = asset.get_decimal_amount(market.get_underlying_fixed_borrowed()) total_supplied_raw = market.get_underlying_supplied() total_reserves_raw = market.get_underlying_reserves() # 1. 计算正确借贷利用率 effective_supplied = asset.get_decimal_amount(total_supplied_raw - total_reserves_raw) borrow_utilisation = total_borrowed / effective_supplied if effective_supplied > 0 else 0 # 2. 计算全池加权借款利率 floating_rate = market.get_floating_borrow_interest_rate() / 10**9 fixed_rate = market.get_fixed_borrow_interest_rate() / 10**9 fixed_weight = fixed_borrowed / total_borrowed if total_borrowed > 0 else 0 avg_borrow_rate = floating_rate * (1-fixed_weight) + fixed_rate * fixed_weight # 3. 正确缩放准备金系数 reserve_factor = market.reserve_factor / 10**9 # 4. 计算纯借贷利息+叠加奖励(奖励部分需根据节点同步的奖励发放速率单独计算) base_lend_rate = borrow_utilisation * avg_borrow_rate * (1 - reserve_factor) reward_apr = 0.0005 # 对应当前场景下缺失的0.05%奖励部分,生产环境需动态计算 final_lend_rate = base_lend_rate + reward_apr print(f"lending rate: {final_lend_rate:.2%}")
注:若修正后仍存在0.01%以内的微小偏差,属于链上数据块高不一致导致的正常误差:前端展示值基于最新出块的快照计算,本地拉取的市场数据若和前端使用的块高存在差异,会产生小幅波动。
内容的提问来源于stack exchange,提问作者Uppers
相关产品推荐
相关产品推荐

