Investing · 2026.09.11 · 6 min · Updated 2026.10.26
How Long Should You Lend on Bitfinex? Backtesting 2-, 30-, and 120-Day Lending and the Lock-Up Risk
Long-tenor Bitfinex funding quotes far higher rates, but most 30-day loans repay within an hour. After fixing two inflating backtest bugs, only one 30-day lane survived, its gains are concentrated, and 120 days means lock-up risk.
Reading
On Bitfinex, fixed-rate 30-day funding fills at about 14.4%, while 2-day fills at about 7%. Lending longer still doesn't necessarily earn more.
Most 30-day loans are repaid within 40 minutes. The real extra earnings come from the few loans that borrowers keep for many days.
After I fixed two errors that inflated the backtest, only one form was worth trying. When the 2-day quote is high enough but still below the current FRR (Bitfinex's Flash Return Rate, a market-average funding rate), post the same price as a 30-day offer instead.
It was positive in all three years and added a few dozen bp, but the gains were concentrated in about twenty events, so I wrote down the stop-loss line before starting the trial. I also added a lane that takes 120-day bids, off by default.
In my research into Bitfinex's 20-minute batch auction, I switched 2-day quoting to the batch top yardstick with a fixed 2-day tenor. That's because the batch auction structure lives mostly in 2-day.
The vast majority of 2-day fills land in batches, under half of 7-day fills do, and only a little over a tenth of 30-day fills.
The old strategy would switch to 7 or 30 days when the 2-day quote was high enough, and batch_top dropped that. What I wanted to know: if I add a long-tenor lane on top of batch_top and give it part of the capital, does overall annualized return go up?
High 30-day rates, mostly out of reach
Before writing any code, I wrote down the bar. Backtest three years (2023-10 to 2026-09) and pair it against pure batch_top with the same seed.
Only consider building it if it's still positive after stacking pessimistic assumptions: stricter fill rules, some offers never filling, and borrowers keeping the money for the full term whenever rates rise.
With FRR orders filtered out, the VWAP of fixed-rate fills looks like this. On those numbers alone, long tenors look like free money.
| Tenor | Fixed-rate fill VWAP | Share of fills inside batches |
|---|---|---|
| 2-day | about 7% | the vast majority |
| 7-day | about 11.5% | under half |
| 30-day | about 14.4% | a little over a tenth |
But 70% of 30-day volume is FRR orders, and my bot posts fixed-rate offers, so that part is out of reach.
Loan duration matters just as much. The fill model was calibrated on 30-day and 7-day offers the bot had posted itself, with recall above 90% for both.
Durations were sampled from the bot's own credits (funds lent out and in use) of the same tenor. The median 30-day loan was repaid after 40 minutes, and only 9% ran the full term.
I checked whether those full-term loans showed adverse selection. Market rates during their lifetime were all below the locked-in rate, which is good news for the lender.
Two ways the backtest inflated returns
I had a subagent review this round twice.
The first review caught a bug. The backtest booked the entire interest at the moment of the fill, including days after the window ended, and that inflated the August 30-day lane by 4 to 5 times.
The longer the tenor, the larger the share of interest that falls outside the window, and the easier it is to make this mistake.
The second was the devil's-advocate pass, and it caught two things. Loans at spike prices are repaid faster than average: high-rate 2-day fills were borrowed for only about a third as long as ordinary ones. And there was no calibration data for 30-day fills above FRR, so the model was guessing in that range.
After the fixes, the estimated gains were cut by 40 to 50%, and a new condition came with it: only repost as 30-day when the quote is below the current FRR.
Backtest interest has to accrue period by period instead of being booked all at once at fill time. The longer the tenor, the more it inflates.
Only spikes get reposted as 30-day
In the end I kept only "repost spikes as 30-day," using at most a portion of the capital. The 7-day version, a standing 30-day offer at a fixed price, and a version that quotes at market percentiles are all out.
After the fixes, 35 of 37 months were positive, and about 60% of the gain survived with every pessimistic assumption stacked.
But the gain is fragile. It depends almost entirely on the few 30-day loans that were kept for many days, and that slice comes from about 20 independent events.
With half as many events, the edge drops to about 40% of the original. With a quarter, it roughly breaks even.

The backtest can't give more confidence than that. Only live testing can.
So before the trial I defined the primary metric: for 30-day credits opened by the lane, weighted by amount, how long the portion beyond the first day lasts on average.
Above a certain value, continue. Below a certain value, shut it off. The trial runs at least 3 months. The stop-loss line was written before launch, so later I just read off the table instead of talking myself into something on the spot.
When gains are concentrated in a few events, write the stop-loss line before the trial.
The 120-day lock-up risk
The research turned up one more observation. Starting in mid-August, the fUSD 120-day best bid sat around 10% annualized for a long time. With passive offers only, that capital would just keep rolling slowly through 2-day loans.
So I added a bid-take lane that hits this bid directly as a taker. It has three conditions: the bid is above a minimum annualized threshold, the config allows 120 days, and the capital already locked in 120-day loans is under its cap.
The lane's cap defaults to 0, which means it's off by default, and behavior is byte-identical to before the change.
Once it's enabled, capital can be locked for weeks to months, so the cap is the only gate. I wanted to see the behavior before deciding how large to make it. After launch I set a modest cap.
Early on, one claim was very reassuring: of the 24 120-day credits already repaid, not one had lasted to maturity.
That's survivorship bias, because it only counted the ones already repaid.
Recomputed properly, 21% of the repaid ones lasted more than 7 days, and two more had been locked for 35 and 57 days and still hadn't been repaid. The lock-up risk is real.

The bid-take fills later set off a chain of accounting problems, covered in missed and double-counted interest when Bitfinex positions switch sides.
The 30-day and 120-day lanes have separate caps, and in the worst case they stack. Both caps can be adjusted instantly with SQL and the amounts are still small, so I haven't closed that gap yet.

Investing
Bitfinex Lending's Hidden Clock: A Batch Auction Every 20 Minutes
Bitfinex 2-day funding is really a batch auction clearing every 20 minutes; here's how I found it in the data, where my new quoting strategy earns in backtests, and the pitfalls of a three-step rollout.
Letters
Loading comments…