CIP is the no-arbitrage law connecting spot, forward and two money-market rates. Take S quoted as units of currency Y per one unit of X, rates r_X and r_Y, and day-count fractions τ_X and τ_Y on each currency's own convention. Start with one unit of X. Route 1: invest in X, sell the proceeds forward, end with F · (1 + r_X · τ_X) units of Y. Route 2: convert to Y now at S, invest in Y, end with S · (1 + r_Y · τ_Y). Both are riskless and use the same capital, so:
F · (1 + r_X · τ_X) = S · (1 + r_Y · τ_Y)
⇒ F = S · (1 + r_Y · τ_Y) / (1 + r_X · τ_X)
That is all of covered interest parity. DV1.01's cost-of-carry with "carry" being the interest differential. Two disciplines make it survive a real desk. Day counts are not decoration: USD and EUR money markets are ACT/360, GBP and INR are ACT/365; a 91-day period is 0.2527778 of a USD year and 0.2493151 of an INR year, and using the wrong one on a ₹1,000 crore position is a bookable error. And the sign convention: the higher-rate currency trades at a forward discount. Since INR rates exceed USD rates, USD/INR always trades at a forward premium; since JPY rates have generally been below USD rates, USD/JPY trades at a discount.
Advertisement
What is the cross-currency basis?
The basis. In a frictionless world CIP holds exactly. It does not. The deviation is the cross-currency basis, conventionally quoted as a spread x added to the non-dollar leg:
F · (1 + (r_nonUSD + x) · τ) = S · (1 + r_USD · τ)
A negative basis (the normal state since 2008 for EUR, JPY, CHF and most others) means borrowing dollars synthetically through the FX swap market costs more than the dollar money-market rate. Negative basis = dollars are scarce and expensive relative to the benchmark; it is a real-time price of global dollar funding stress and one of the cleanest single indicators in macro finance.
Worked Example 2 computes the whole chain: CIP forward, deviation in pips, basis in basis points, implied synthetic dollar rate, and the dollars it costs on a billion, and the answer there is that a −20.43 bp basis prices dollars 20.56 bp above OIS, worth $519,614 on $1 billion for 91 days. That is the difference between a hedged foreign bond position being accretive and being a slow loss.
Why doesn't arbitrage close the basis?
Why doesn't arbitrage close it? Because the arbitrage is not free. Pre-2008 a dealer could borrow dollars unsecured, buy euros, lend euros, sell forward and pocket the basis with negligible capital. Three things changed, each with a price. (a) Leverage-ratio and balance-sheet constraints: the trade requires gross balance sheet on both sides, and the Basel III leverage ratio charges capital against gross exposure regardless of risk, making balance sheet a scarce priced input. (b) Counterparty and funding costs: CVA, FVA and the capital-valuation adjustment put a real price on the position's credit and funding. (c) Quarter- and year-end reporting: banks that report leverage exposure on the last day of the period compress balance sheets into that date, and the basis reliably spikes over turn-of-period dates before snapping back, an anomaly existing purely because of a reporting convention. The foundational empirical treatment is Du, Tepper and Verdelhan, Deviations from Covered Interest Rate Parity (Journal of Finance, 2018); the BIS's own framing appears in The dollar-based financial system through the window of the FX swaps market (BIS speech, 24 March 2023).
How does covered interest parity work for the rupee?
The India instance (R6). The USD/INR forward premium is the same equation with capital controls on top, and Worked Example 3 computes it. Two features are specific to the rupee. First, the implied rate differential is not the annualised forward premium, they differ because the premium is a ratio of a price difference to spot while the differential compares two rates on different day-count bases, and a desk that treats them as interchangeable is out by ~8 basis points before it starts. Second, India has a genuine onshore–offshore wedge: a non-deliverable forward (NDF) market in Singapore, Hong Kong, London and Dubai prices the same rupee forward without any rupee being delivered, cash-settling in dollars against a fixing. Because capital-account restrictions prevent free arbitrage, the two can diverge: 61 basis points in the worked example, worth ₹1.30 crore on a $100 million position. The RBI narrowed the gap structurally by permitting banks in India with IFSC Banking Units to participate in the NDF market from 1 June 2020, linking the two pools without abolishing the boundary.
How do you compute the basis in Python?
Modern Data Analysis, the Python way. The basis is not a number you look up; it is a number you build. Pull spot and forward points into a
pandasDataFrame indexed by date, pull the two OIS curves onto the same index, and compute vectorised:tau_usd = days/360,tau_loc = days/(365 if ccy in ACT365 else 360),F_cip = S*(1 + r_loc*tau_loc)/(1 + r_usd*tau_usd), thenx = (S*(1 + r_usd*tau_usd)/F_mkt - 1)/tau_loc - r_loc, times 1e4 for basis points. Four traps, each of which has produced a published chart that was simply wrong. (1) Day counts by currency, adictmapping currency to basis is the only defensible way to write this, because a hard-coded/360silently mis-states every ACT/365 pair. (2) Quote direction: some pairs quote foreign-per-dollar (USD/INR, USD/JPY) and some dollars-per-unit (EUR/USD, GBP/USD); one sign convention applied to both inverts half your series and the chart still looks plausible. (3) Forward-point scale factors (1e-4 for most pairs, 1e-2 for yen-quoted pairs) move the basis by two orders of magnitude when wrong. (4) Value-date calendars: "3-month" is not 91 days on every date, and a constant day count introduces a sawtooth artefact people have mistaken for a funding signal. Then plot and mark quarter- and year-ends: if your spikes do not land there you have a bug; if they do, you have reproduced one of the best-documented facts in market microstructure. The quant-code region (DA/QD) builds the production pipeline; this node's job is that you can state, before running anything, what the answer should look like.