Triangular Arbitrage
Thu May 07, 2020 10:15 am
Triangular arbitrage involves placing offsetting transactions in three forex currencies to exploit a market inefficiency for a theoretical riskfree trade. In practice, there is substantial execution risk in employing a triangular arbitrage or tri arb strategy which may make it difficult to profit for retail traders. However, a knowledge of triangular arbitrage mechanics can enable forex traders to understand better how market prices selfregulate. In addition, this understanding may lead to strategy development that may be exploited by the retail trader, peeking into the realm of statistical arbitrage. The concept of triangular arbitrage is related to but distinct from stat arb or pairs trading, which may deal with two or more currency pairs.
Currency Pairs
On a retail forex level, currency prices are quoted in currency pairs. This is significant because a single forex transaction actually includes two currencies at one rate. A retail forex trader doesn't actually buy or sell any physical currency, but rather buys or sells a cross rate which is supposed to represent the cost to buy or sell from one currency to another. In practice, because no physical currency changes hands, trading a currency pair is similar to trading a stock or any other financial instrument where the quoted price is executable and profit or loss is determined by an appreciation of the instrument after purchase or depreciation of the instrument aftersale minus transaction and carry costs.
Tri Arb Ring Example
An example of a triangular arbitrage ring is the U.S. dollar (USD), British pound (GBP), and Euro (EUR). The currency pairs involved in such an arbitrage opportunity are EUR/USD, GBP/USD, and EUR/GBP. Note that these pairs can be thought of as an algebraic formula with a numerator and a denominator. The numerator in EUR/USD is the Euro or EUR, while the denominator in that pair is the U.S. dollar (USD). This equation works out to EUR divided by USD. These three currency pairs make up a tri arb ring.
[You must be registered and logged in to see this image.]
Synthetic Pairs
Using the triangular arbitrage formula it is possible to create synthetic currency pairs from the other two pairs in a ring. For example EUR/USD = GBP/USD * EUR/GBP. Recall from basic algebra that when two fractions are multiplied, identical diagonal values can be crossed out or eliminated. In this case, GBP is in the numerator of the GBP/USD pair, and GBP is in the denominator of the EUR/GBP pair. When these two pairs are multiplied, the GBP in the numerator cancels out the GBP in the denominator and EUR/USD is left, so the equation resolves to EUR/USD = (GBP)/USD * EUR/(GBP) = EUR/USD. (The GBP in parentheses cancel out).
To finish out this particular ring, synthetic pairs can also be created for GBP/USD and for EUR/GBP. GBP/USD = GBP/EUR * EUR/USD. There is no pair for GBP/EUR so the pair EUR/GBP is mathematically inverted by dividing 1 by the pair as so: GBP/EUR = 1/(EUR/GBP). In this example, the EUR in the denominator and in the numerators cancel each other out and the formula leaves GBP/USD = GBP/(EUR) * (EUR)/USD = GBP/USD.
The third formula is EUR/GBP = EUR/USD * USD/GBP. Again, there is no USD/GBP so GBP/USD is inverted by taking 1 and dividing it by the pair as EUR/GBP = EUR/(USD) * 1/[GBP/(USD)]. Fractions in the denominator are inverted and multiplied, leaving EUR/(USD) * (USD)/GBP = EUR/GBP.
In this way, it is possible to create a synthetic pair out of a valid triangle or ring for each of the underlying pairs. To recap the synthetic pairs:
To create the formula for triangular arbitrage with a meancentered at zero, it is merely necessary to get all the terms on the correct side of the equation.
alternatively, this can be written as follows:
See the graphics below to illustrate that both formulas written above produce identical results.
[You must be registered and logged in to see this image.]
[You must be registered and logged in to see this image.]
Practical Triangular Arbitrage
If this formula is plotted you will note that it roughly centers around zero but at times has serious excursions from this value. Playing the deviations for reversion is a game of the quickest of the quick and really isn't an achievable aim for retail forex traders who trade through a forex dealer (also known as a market maker or bucket shop). Attempting this type of triangular arbitrage on retail forex brokers is generally discouraged in customer agreements and will typically lead to the broker implementing countermeasures of increased slippage, slow fill times, and sometimes no fill at all. Because this type of "riskfree" tri arb is extremely time sensitive, even a small delay in order placement is enough to nullify any potential profit. Profits from a triangular arbitrage strategy are small but consistent to those who are quickest to spot and act on the imbalance.
But it is worth noting that inherent in practical Triangular Arbitrage is a significant execution risk, a glaring problem with the practical implementation of this "riskfree" strategy. There may be some opportunities available on forex ECNs, however, this remains a game of the quickest so latency and colocation play a large part in determining who profits from triangular arbitrage opportunities.
Triangular Arbitrage Calculation Example
An example of using three prices follows:
Using the formula above (EUR/USD EUR/GBP * GBP/USD = 0) we have:
Clearly a small discrepancy exists between the theoretical equilibrium price of zero and the actual price of 0.00024 (rounded). However, because three pairs are involved the 2.4 pips discrepancy may not be able to be overcome if all three pairs are transacted for a supposed riskfree transaction. As buyers come into one market and bid and take offers, that currency pair is pushed out of balance with the others. The currency pair may come back into balance in one of two basic ways. Either the currency pair that is out of balance can be arbitraged back into balance, or one or both of the other two pairs can be arbitraged to bring balance back to the triad.
Which Pair is Out of Balance?
A common question is to wonder how to tell which pair is out of balance in a triangular arbitrage situation? One possible solution is to consider the synthetic pairs that make up the tri arb.
We know that EUR/USD = EUR/GBP * GBP/USD. When the numbers are worked out, we conclude that:
or that the EUR/USD (1.4169) is priced lower than the synthetic EUR/USD (1.417138). This may indicate that EUR/USD is underpriced relative to the other two pairs. Note that out of balance does not automatically mean that future rebalancing will lead to EUR/USD price rising though it may lead to EUR/USD being bought by arbitrageurs. It is also possible if there is sufficient supply of EUR/USD for prices to continue to drop relative to the others or to not rise as quickly (in an uptrend), but that the other two pairs catch up with the undervalued EUR/USD to keep the triangle in balance. Working out the other two synthetic currency pairs we see that
In this case, GBP/USD is higher priced than its synthetic. And finally:
Triangular Arbitrage Strategy Summary
In summary, it is apparent that EUR/USD is lower priced than its synthetic currency pair, while both GBP/USD and EUR/GBP are higher priced than their synthetic currency pairs. Making the assumption that the synthetic currency pairs represent true or actual value, it would then be apparent that:
Thus if a triangular arbitrage trade were initiated to revert to the zero mean, EUR/USD would be bought, while GBP/USD and EUR/GBP would be sold. After inspecting the magnitude of the discrepancy, it is clear that GBPUSD is more out of balance than the other two pairs (though only slightly more than EURUSD is out of balance), so it may be that GBP/USD will be first to be armed back into line. Or it may be that GBP/USD is most vulnerable to a mean reversion to bring the triad back into line. It must be remembered that the prices in the above illustration are not bid/ask prices and as such the perceived opportunity may be much smaller (or nonexistent) than described. The next question to answer relates to the size of each currency pair to trade. The initial instinct might indicate that equal sizes would balance out against each other, but that is not correct. In the next part, I'll show you why.
Calculating the triangular arbitrage lot size for a "perfectly" hedged triangular arbitrage ring is straightforward once you understand the simple math behind the prices. To get started you need three related pairs that form a ring or triangle and simultaneous prices from those three pairs. An easy way to record simultaneous prices in a dynamic market is to take a screenshot.
[You must be registered and logged in to see this image.]
In the text above the triangular arbitrage, an example was designed using three currency pairs and their simultaneous prices. It is possible to calculate Triangular Arbitrage with BidAsk Quotes. In this article we will use the following ring and prices to work a series of examples showing how to compute the fully hedged lot size for a triangular arbitrage ring:
It was shown that when you have the prices for three currency pairs (as the above), it is trivial to determine which pair is out of balance, or in other words, which pairs are overvalued and which are undervalued relative to the triangular arbitrage ring. Knowing which pair is relatively high and which is relatively low is important if you wish to execute a triangular arbitrage ring in the proper direction to capture the inefficiency, as shown in the picture to the upper left. The picture shows an example view of a triangular arbitrage inefficiency in EURJPY  USDJPY * EURUSD over 1000 bidask price changes (a very short period of time). It is apparent that there is persistent but very small inefficiency apparent between the markets  only about 1 scaled pip or 0.0001 at the 3 standard deviation level. In a general sense, you can determine which pair is out of balance by the following three formulas computed from the EURUSD, GBPUSD, and EURGBP data previously stated:
[You must be registered and logged in to see this image.]
The picture shows what a 6.9 sigma jump looks like with EURUSD  GBPUSD*EURGBP. The absolute move is only 6 pips away from parity and is only identifiable with bid / ask data. Can you execute the arb quickly enough to capture the 6 pips less trading costs and spread? The example shown may be marginal in this regard.
But what do you do if you want to size your positions to form a perfect hedge? How do you calculate the correct lot size for a fully hedged triangular arbitrage ring? First, you need to select a pair from the ring and select an initial lot size. I'll select EURUSD and a lot size of 10,000 units.
To break down the exposure of the EUR/USD pair when you buy 10,000 EUR/USD you own 10,000 EUR and in order to finance the purchase of EUR, you must borrow an equivalent amount of USD. To work out the quantity of USD, simply multiply by the exchange rate.
Buy 10,000 EUR/USD = +10,000 EUR 14,169 USD (10,000 * 1.4169).
The sign for USD is negative because when you go long EUR you are short USD as in EUR/USD. Likewise, when you go short EUR, you are long USD.
finally:
There may be some fractional residuals that are not accounted in this analysis but for practical purposes, small residuals can be ignored as they are too small to affect a trader's equity much due to the very small size.
Also, from a practical standpoint, many forex brokers enforce a minimum size that makes much of the discussion on size moot. Sizes on mini lot brokers that offer 0.01 lot sizing are a minimum of 100 units so rounding of lot sizes would need to be done at that level. Standard lot brokers offering 0.01 lotsizing would round to the nearest 1000 units.
So there you have it, three ways to compute the hedged lot size to use for triangular arbitrage. You can start with any of the three currency pairs within the triangular arbitrage ring with the desired size and then by following the pattern in the examples above, you can calculate the other correct lot sizes for the entire triangular arbitrage ring. Work through the examples above on your own (or some of your own choosing) to make sure you understand how to work the math. You need the current prices for all three pairs so the easiest way to record the prices before they change is to take a screenshot.
Triangular arbitrage opportunities can be easily identified using bid and ask quotes. In this article, I describe formulas for computing triangular arbitrage using bid and ask quotes. It is worth noting that the triangular arbitrage computation using bid and ask prices is a bit more complex than simply using close prices. But once the basic triangular arbitrage concept is understood at the currency level, you should be able to compute your own triangular arbitrage inefficiencies based on bid and ask quotes. I will describe the method of computing triangular arbitrage with bid and ask quotes via simple rules and three examples.
Getting Started
You will need a simultaneous bid and ask quotes. I suggest taking a screenshot of your quote window because bid and ask prices are in constant flux and identifying an inefficiency requires accurate immediate and simultaneous prices.
Recall that at the heart of the triangular arbitrage formula is a conversion to the underlying currencies that make up a currency pair. Suppose we have simultaneous bid and ask quotes for three currency pairs that form a triangle or ring:
Triangular Arbitrage Equations
You can visualize the ring via canceling fractions following the form A * B * C = 1 as either:
Or the same equation can be worked out via subtraction for each pair as previously stated where the first term is the pair and the second complex term is the synthetic pair, so the following list is EURUSD, GBPUSD and EURGBP subtracting their respective synthetics to equal approximately zero.
[You must be registered and logged in to see this image.]
Note how in the picture, the two series are virtually identical except the first formula has a mean of one while the second formula has a mean of zero. The most appropriate method to use to calculate the triangular arbitrage formula is a matter of the objective. As can be seen from the pictures, all the formulas show approximately the same triangular arbitrage dynamic in a generalized way.
Bid and Ask Quotes
With bid and ask quotes, the situation is slightly more complex. Just as was shown in Triangular Arbitrage Lot Size to determine the proper lot size, a calculation must be made to the underlying currency representing each pair. The EURUSD currency pair is made up of the underlying currencies EUR and USD. A long position in EURUSD represents being long EUR and short USD. Likewise, a short position in EURUSD is actually a short position in EUR and a long position in USD. Because forex traders trade currency pairs and not the underlying currencies, this principle of one currency long and one currency short applies to any FX transaction with a currency pair.
Getting back to the example mentioned earlier:
When you post a bid, you are attempting to buy, and when you post the ask price, you are attempting to sell. Bid and ask prices generally represent the prices at which your market maker or counterparty is willing to transact where the counterparty wishes to buy or sell respectively. If you place a buy limit order for EURUSD at 1.38705, your price is the same as the posted bid. If price moves down your order may be filled and you will belong EURUSD. In this case, you will be long EUR and short USD. If you buy 10,000 units of EURUSD, you are long 10,000 EUR and short 13,870.5 USD (10,000 * 1.38705). Keep this in mind when you attempt to convert bid and ask prices for three pairs into a triangular arbitrage relationship in an effort to spot temporary market inefficiencies.
Four BidAsk Rules
Four general rules for bid and ask prices can be stated
Example 1: EURUSD synthetic bid and ask prices
[You must be registered and logged in to see this image.]
For the purposes of this first example, assume the goal is to identify bid / ask price anomalies on EURUSD. The effective formula is EURUSD  EURGBP*GBPUSD = 0 or otherwise stated EURUSD = EURGBP*GBPUSD. Because the bid price of EURUSD should equal EURGBP*GBPUSD it is important to figure the actual currencies involved in the synthetic. As stated in rules BN and BD above, a posted bid to EURUSD is a willingness to buy EUR and to sell USD respectively. Through cancellation the formula for the synthetic reverts to EURUSD = EURGBP*GBPUSD. To buy EUR with EURGBP you use the bid price because EUR is in the numerator (just as with EURUSD in rule BN). To sell USD with GBPUSD, you also use the bid price, because USD is in the denominator, just as the USD in EURUSD represents a short position according to rule BD.
Likewise in calculating ask prices for EURUSD by applying rules AN and AD to EURUSD's synthetic EURGBP*GBPUSD, we use ask prices for EURGBP according to rule AN to create a short position in EUR. To create a long position in USD according to rule AD, ask prices for GBPUSD should be used. Thus to summarize:
The bid price of synthetic EURUSD = bid price of EURGBP * bid price of GBPUSD.
Ask prices of synthetic EURUSD = ask price of EURGBP * ask price of GBPUSD.
[You must be registered and logged in to see this image.]
The result of these calculations is shown in the first picture (above) where the EURUSD bid is shown in red and compared against a green synthetic ask price. Note how there are a few small excursions of the synthetic ask price below the red bid line representing a little opportunity for arbitrage. The magnitude of these small excursions would likely not pay for transaction costs as well as the times when price moves between identification and execution, eliminating the opportunity. Likewise, there are many times when the synthetic bid in the second picture is equal to or greater than the ask prices, but just once when a single pip of profit could theoretically be captured. These pictures generally show that the markets over this 1000 bid/ask price change period are efficiently priced with not much opportunity for fleeting arbitrage opportunities of a pip or less.
It is now possible to easily compute the synthetic bid and ask prices for EURUSD using the following prices:
Also, note the formula:
Actual vs. Synthetic Calculation and Comparison
EURUSD synthetic bid = EURGBP bid * GBPUSD bid = 0.86975 * 1.59440 = 1.3867294 which rounds to 1.38673. Compare this synthetic price to the actual bid price for EURUSD which is 3.2 pips higher indicating no opportunity from the synthetic bid. This is understandable considering the underlying spread is 1/2 pip!
EURUSD synthetic ask = EURGBP ask * GBPUSD ask = 0.86990 * 1.59455 = 1.3871 (rounded). Compared to the underlying it is clear that the synthetic and the underlying have approximately the same price and thus either could be used for a transaction at the ask prices. However, double transaction costs are required for the synthetic. This equality between ask prices for the underlying EURUSD and synthetic EURUSD does not represent an apparent inefficiency that can be exploited.
In order for a real efficiency to existing, the synthetic bid (ask) price would need to be greater (less) than the actual bid (ask) price. But keep in mind the transaction costs as well as the significant execution risk that could invalidate any attempt to arb these transitory prices.
In the new examples will be showing how to compute synthetic bid and ask prices for GBPUSD and EURGBP will be shown. Recall the following bidask prices:
Four BidAsk Rules
Four general rules for bid and ask prices can be stated:
Example2: GBPUSD synthetic bidask prices
To compute the synthetic GBPUSD bid price, recall that via rule BN (bid numerator) that a long position is taken in GBP and via rule BD (bid denominator) a short position is taken in USD. When working out the synthetic, the following equation comes into play:
Note that the price of EURGBP must be inverted by dividing 1 by the price of EURGBP (for JPY denominated pairs, divide 100 by the price to invert the quote). This inversion puts GBP in the numerator, thus matching the GBP in GBPUSD's numerator. The denominator of EURUSD matches the USD in GBPUSD's denominator so no inversion is necessary. The same rules as applied previously also apply now.
When computing the bid price of GBPUSD's synthetic, first the correct rule must be ascertained. GBP long is desired and USD short. GBP is in the denominator of EURGBP so the denominator rules (AD, BD) will need to be applied. according to rule BD the bid price of the denominating currency (GBP) is short. Rule AD states that the denominator of the ask price represents a long GBP position This meets the goal of long GBP. Thus the ask price of EURGBP must be used for a long GBP position. Applying rule BD to EURUSD gives a short USD position, just as is needed to finish the synthetic GBPUSD bid at long GBP and short USD.
GBPUSD ask (red) vs. synthetic bid (green)Thus, synthetic GBPUSD bid = (1/EURGBP ask) * EURUSD bid = (1.0/0.86990) * 1.38705 = 1.59449 (rounded). Compared to the real GBPUSD bid of 1.59440 it is clear that the synthetic price is 0.9 pips higher than the GBPUSD bid price. This slight improvement opens the way for transactions in the synthetic to replace transactions in GBPUSD if conditions such as interest rates earned/paid are favorable, and transaction costs are taken into consideration. However, there is still no arbitrage opportunity because the synthetic bid is still less than the actual ask price of GBPUSD.
To compute the GBPUSD synthetic ask, recall that the real ask price represents a short GBP position and a long USD position. Again, GBP is in the denominator of EURGBP so the denominating rules must be applied. Applying rule AD to EURGBP indicates a long position in GBP. Again, this is the opposite of what we are looking for! Rule BD states that the denominator represents a short position, so the bid price will be used for EURGBP. USD is in the denominator of EURUSD so by applying rule AD we find that USD is long, a match!
Thus, to compute the ask price of GBPUSD's synthetic, bid prices will be used for EURGBP to get GBP short, and ask prices will be used for EURUSD to get USD long. Synthetic GBPUSD ask price = (1/EURGBP) bid * EURUSD ask = (1.0/0.86975) * 1.38710 = 1.59492 (rounded). Comparing synthetic GBPUSD ask price to actual GBPUSD ask price it is clear that the actual ask price of 1.59455 is better than the synthetic ask price of 1.59492 indicating no inefficiency or opportunity in executing via the GBPUSD synthetic ask price over the actual GBPUSD ask price.
[You must be registered and logged in to see this image.]
The pictures above show GBPUSD bid and ask prices compared against synthetic ask and bid prices respectfully. Opportunities exist when the green line exceeds the red line. However, as can be seen from the pictures, these opportunities are transitory and very small in magnitude.
Example 3: EURGBP synthetic bid and ask prices
The equation to compute the synthetic price for EURGBP is as follows:
Turning our attention to calculate the bid price for EURGBP, recall that the bid price of EURGBP represents EUR long and GBP short. To compute the synthetic bid price for the numerator EUR (long), EURUSD bid prices may be used via rule BN. To compute GBP short, recall that GBP is in the numerator of GBPUSD. According to rule AN the ask price of the numerator must be used to get GBP short.
Four BidAsk Rules
Four general rules for bid and ask prices can be stated:
Thus the calculation of the EURGBP synthetic bid = bid EURUSD * (1/GBPUSD) ask = 1.38705 * (1/1.59455) = synthetic EG bid of 0.86987 (rounded). Compare the synthetic bid to the actual bid to see improvement of approximately 1.2 pips over the actual EURGBP bid price. The synthetic bid price doesn't exceed the actual ask price, and so in spite of the synthetic offering, a better deal on the bid than the actual, noarbitrage opportunity was found.
The synthetic ask for EURGBP can likewise be computed as ask EURUSD * (1/GBPUSD) bid = 1.38710 * (1/1.59440) = 0.86998 (rounded). Compared to the actual EURGBP ask it is clear that the market is efficient and that the synthetic ask price offers no opportunity either to ask price improvement or for arbitrage.
Conclusion
Calculating bid and ask prices for synthetic pairs is fairly straightforward. Keep in mind that an underlying pair's bid consists of a long position in the numerator of the underlying, and a short position in the denominator of the underlying. Then simply match up two related pairs that contain the underlying currencies combined with a third currency for the two synthetics, such as underlying EURAUD with EURUSD and AUDUSD where USD is the third currency. EURAUD synthetic could also be formed using GBP as the third currency such as EURGBP and GBPAUD.
Then just determine which currency is long for the underlying and match up a synthetic pair's bid or ask price to match that long position. Do the same for the short underlying currency match up either the synthetic pair's bid or ask. The same rules apply to ask prices but in reverse. It may be useful to write out the four bidask rules for your underlying to make this process easier.
Currency Pairs
On a retail forex level, currency prices are quoted in currency pairs. This is significant because a single forex transaction actually includes two currencies at one rate. A retail forex trader doesn't actually buy or sell any physical currency, but rather buys or sells a cross rate which is supposed to represent the cost to buy or sell from one currency to another. In practice, because no physical currency changes hands, trading a currency pair is similar to trading a stock or any other financial instrument where the quoted price is executable and profit or loss is determined by an appreciation of the instrument after purchase or depreciation of the instrument aftersale minus transaction and carry costs.
Tri Arb Ring Example
An example of a triangular arbitrage ring is the U.S. dollar (USD), British pound (GBP), and Euro (EUR). The currency pairs involved in such an arbitrage opportunity are EUR/USD, GBP/USD, and EUR/GBP. Note that these pairs can be thought of as an algebraic formula with a numerator and a denominator. The numerator in EUR/USD is the Euro or EUR, while the denominator in that pair is the U.S. dollar (USD). This equation works out to EUR divided by USD. These three currency pairs make up a tri arb ring.
[You must be registered and logged in to see this image.]
Synthetic Pairs
Using the triangular arbitrage formula it is possible to create synthetic currency pairs from the other two pairs in a ring. For example EUR/USD = GBP/USD * EUR/GBP. Recall from basic algebra that when two fractions are multiplied, identical diagonal values can be crossed out or eliminated. In this case, GBP is in the numerator of the GBP/USD pair, and GBP is in the denominator of the EUR/GBP pair. When these two pairs are multiplied, the GBP in the numerator cancels out the GBP in the denominator and EUR/USD is left, so the equation resolves to EUR/USD = (GBP)/USD * EUR/(GBP) = EUR/USD. (The GBP in parentheses cancel out).
To finish out this particular ring, synthetic pairs can also be created for GBP/USD and for EUR/GBP. GBP/USD = GBP/EUR * EUR/USD. There is no pair for GBP/EUR so the pair EUR/GBP is mathematically inverted by dividing 1 by the pair as so: GBP/EUR = 1/(EUR/GBP). In this example, the EUR in the denominator and in the numerators cancel each other out and the formula leaves GBP/USD = GBP/(EUR) * (EUR)/USD = GBP/USD.
The third formula is EUR/GBP = EUR/USD * USD/GBP. Again, there is no USD/GBP so GBP/USD is inverted by taking 1 and dividing it by the pair as EUR/GBP = EUR/(USD) * 1/[GBP/(USD)]. Fractions in the denominator are inverted and multiplied, leaving EUR/(USD) * (USD)/GBP = EUR/GBP.
In this way, it is possible to create a synthetic pair out of a valid triangle or ring for each of the underlying pairs. To recap the synthetic pairs:
 Code:
EUR/USD = EUR/GBP * GBP/USD
GBP/USD = GBP/EUR * EUR/USD
EUR/GBP = EUR/USD * USD/GBP
To create the formula for triangular arbitrage with a meancentered at zero, it is merely necessary to get all the terms on the correct side of the equation.
 Code:
EUR/USD  EUR/GBP * GBP/USD = 0
alternatively, this can be written as follows:
 Code:
log(EUR/USD)  log(EUR/GBP)  log(GBP/USD) = 0
See the graphics below to illustrate that both formulas written above produce identical results.
[You must be registered and logged in to see this image.]
[You must be registered and logged in to see this image.]
Practical Triangular Arbitrage
If this formula is plotted you will note that it roughly centers around zero but at times has serious excursions from this value. Playing the deviations for reversion is a game of the quickest of the quick and really isn't an achievable aim for retail forex traders who trade through a forex dealer (also known as a market maker or bucket shop). Attempting this type of triangular arbitrage on retail forex brokers is generally discouraged in customer agreements and will typically lead to the broker implementing countermeasures of increased slippage, slow fill times, and sometimes no fill at all. Because this type of "riskfree" tri arb is extremely time sensitive, even a small delay in order placement is enough to nullify any potential profit. Profits from a triangular arbitrage strategy are small but consistent to those who are quickest to spot and act on the imbalance.
But it is worth noting that inherent in practical Triangular Arbitrage is a significant execution risk, a glaring problem with the practical implementation of this "riskfree" strategy. There may be some opportunities available on forex ECNs, however, this remains a game of the quickest so latency and colocation play a large part in determining who profits from triangular arbitrage opportunities.
Triangular Arbitrage Calculation Example
An example of using three prices follows:
 Code:
EURUSD = 1.4169
GBPUSD = 1.60655
EURGBP = 0.8821
Using the formula above (EUR/USD EUR/GBP * GBP/USD = 0) we have:
 Code:
1.4169  0.8821 * 1.60655 = 0 which simplifies to 0.000237755 = 0 !!
Clearly a small discrepancy exists between the theoretical equilibrium price of zero and the actual price of 0.00024 (rounded). However, because three pairs are involved the 2.4 pips discrepancy may not be able to be overcome if all three pairs are transacted for a supposed riskfree transaction. As buyers come into one market and bid and take offers, that currency pair is pushed out of balance with the others. The currency pair may come back into balance in one of two basic ways. Either the currency pair that is out of balance can be arbitraged back into balance, or one or both of the other two pairs can be arbitraged to bring balance back to the triad.
Which Pair is Out of Balance?
A common question is to wonder how to tell which pair is out of balance in a triangular arbitrage situation? One possible solution is to consider the synthetic pairs that make up the tri arb.
We know that EUR/USD = EUR/GBP * GBP/USD. When the numbers are worked out, we conclude that:
 Code:
1.4169 < 1.417138,
or that the EUR/USD (1.4169) is priced lower than the synthetic EUR/USD (1.417138). This may indicate that EUR/USD is underpriced relative to the other two pairs. Note that out of balance does not automatically mean that future rebalancing will lead to EUR/USD price rising though it may lead to EUR/USD being bought by arbitrageurs. It is also possible if there is sufficient supply of EUR/USD for prices to continue to drop relative to the others or to not rise as quickly (in an uptrend), but that the other two pairs catch up with the undervalued EUR/USD to keep the triangle in balance. Working out the other two synthetic currency pairs we see that
 Code:
GBP/USD = GBP/EUR * EUR/USD or 1.60655 > 1.60628.
In this case, GBP/USD is higher priced than its synthetic. And finally:
 Code:
EUR/GBP = EUR/USD * USD/GBP or 0.8821 > 0.881952 indicating that EUR/GBP is also priced higher than its synthetic.
Triangular Arbitrage Strategy Summary
In summary, it is apparent that EUR/USD is lower priced than its synthetic currency pair, while both GBP/USD and EUR/GBP are higher priced than their synthetic currency pairs. Making the assumption that the synthetic currency pairs represent true or actual value, it would then be apparent that:
 Code:
EUR/USD is undervalued 1.4169  1.417138 = 0.00024 or 2.4 pips
GBP/USD is overvalued 1.60655  1.60628 = +0.00027 or +2.7 pips
EUR/GBP is overvalued by 0.8821  0.881952 = +0.000148 or + 1.48 pips
Thus if a triangular arbitrage trade were initiated to revert to the zero mean, EUR/USD would be bought, while GBP/USD and EUR/GBP would be sold. After inspecting the magnitude of the discrepancy, it is clear that GBPUSD is more out of balance than the other two pairs (though only slightly more than EURUSD is out of balance), so it may be that GBP/USD will be first to be armed back into line. Or it may be that GBP/USD is most vulnerable to a mean reversion to bring the triad back into line. It must be remembered that the prices in the above illustration are not bid/ask prices and as such the perceived opportunity may be much smaller (or nonexistent) than described. The next question to answer relates to the size of each currency pair to trade. The initial instinct might indicate that equal sizes would balance out against each other, but that is not correct. In the next part, I'll show you why.
Triangular Arbitrage Lot Size
Calculating the triangular arbitrage lot size for a "perfectly" hedged triangular arbitrage ring is straightforward once you understand the simple math behind the prices. To get started you need three related pairs that form a ring or triangle and simultaneous prices from those three pairs. An easy way to record simultaneous prices in a dynamic market is to take a screenshot.
[You must be registered and logged in to see this image.]
In the text above the triangular arbitrage, an example was designed using three currency pairs and their simultaneous prices. It is possible to calculate Triangular Arbitrage with BidAsk Quotes. In this article we will use the following ring and prices to work a series of examples showing how to compute the fully hedged lot size for a triangular arbitrage ring:
 Code:
EURUSD = 1.4169
GBPUSD = 1.60655
EURGBP = 0.8821
It was shown that when you have the prices for three currency pairs (as the above), it is trivial to determine which pair is out of balance, or in other words, which pairs are overvalued and which are undervalued relative to the triangular arbitrage ring. Knowing which pair is relatively high and which is relatively low is important if you wish to execute a triangular arbitrage ring in the proper direction to capture the inefficiency, as shown in the picture to the upper left. The picture shows an example view of a triangular arbitrage inefficiency in EURJPY  USDJPY * EURUSD over 1000 bidask price changes (a very short period of time). It is apparent that there is persistent but very small inefficiency apparent between the markets  only about 1 scaled pip or 0.0001 at the 3 standard deviation level. In a general sense, you can determine which pair is out of balance by the following three formulas computed from the EURUSD, GBPUSD, and EURGBP data previously stated:
 Code:
EURUSD  EURGBP * GBPUSD = 1.4169  0.8821 * 1.60655 = EURUSD overvalued by 0.00024
EURGBP  EURUSD / GBPUSD = 0.8821  1.4169 / 1.60655 = EURGBP undervalued by 0.00015
GBPUSD  EURUSD / EURGBP = 1.60655  1.4169 / 0.8821 = GBPUSD undervalued by 0.00027
[You must be registered and logged in to see this image.]
The picture shows what a 6.9 sigma jump looks like with EURUSD  GBPUSD*EURGBP. The absolute move is only 6 pips away from parity and is only identifiable with bid / ask data. Can you execute the arb quickly enough to capture the 6 pips less trading costs and spread? The example shown may be marginal in this regard.
But what do you do if you want to size your positions to form a perfect hedge? How do you calculate the correct lot size for a fully hedged triangular arbitrage ring? First, you need to select a pair from the ring and select an initial lot size. I'll select EURUSD and a lot size of 10,000 units.
To break down the exposure of the EUR/USD pair when you buy 10,000 EUR/USD you own 10,000 EUR and in order to finance the purchase of EUR, you must borrow an equivalent amount of USD. To work out the quantity of USD, simply multiply by the exchange rate.
Buy 10,000 EUR/USD = +10,000 EUR 14,169 USD (10,000 * 1.4169).
The sign for USD is negative because when you go long EUR you are short USD as in EUR/USD. Likewise, when you go short EUR, you are long USD.
 Code:
EURUSD = 1.4169
GBPUSD = 1.60655
EURGBP = 0.8821
 Code:
EUR/USD long 10,000: EUR + 10,000, USD 14,169. Take the USD and impute the amount of GBP as follows:
GBP/USD short 14,169 / 1.60655 = short 8,820 (rounded) GBP which comes out to 8820 x 1.60655 = 14,170 USD long (rounded).
EUR/GBP short sell 10,000 to offset the existing 10,000 long EUR which comes out in GBP as 10,000 * .8821 = 8821 GBP long
 Code:
1.4169 EUR/USD long 10,000 EUR, short 14,169 USD
1.60655 GBP/USD short 8,820 GBP, long 14,170 USD
0.8821 EUR/GBP short 10,000 EUR, long 8,821 GBP
 Code:
EUR: 10,000  10,000 = 0 EUR residual exposure
GBP: 8820 + 8821 = 1 GBP residual exposure
USD: 14169 + 14170 = 1 USD residual exposure
 Code:
1.60655 GBP/USD +10,000 = GBP + 10,000, USD 16,066
0.8821 EUR/GBP 10,000 GBP and imputed 10,000 /0.8821 = +11,337 EUR
1.4169 EUR/USD 11,337 EUR, +16,063 USD
finally:
 Code:
0.8821 EUR/GBP 10,000 EUR, + 10,000*0.8821 = +8821 GBP
1.60655 GBP/USD 8821 GBP, +8821 * 1.60655 = +14,171 USD
1.4169 EUR/USD +10,000 EUR, 10,000*1.4169 = 14,169 USD
There may be some fractional residuals that are not accounted in this analysis but for practical purposes, small residuals can be ignored as they are too small to affect a trader's equity much due to the very small size.
Also, from a practical standpoint, many forex brokers enforce a minimum size that makes much of the discussion on size moot. Sizes on mini lot brokers that offer 0.01 lot sizing are a minimum of 100 units so rounding of lot sizes would need to be done at that level. Standard lot brokers offering 0.01 lotsizing would round to the nearest 1000 units.
So there you have it, three ways to compute the hedged lot size to use for triangular arbitrage. You can start with any of the three currency pairs within the triangular arbitrage ring with the desired size and then by following the pattern in the examples above, you can calculate the other correct lot sizes for the entire triangular arbitrage ring. Work through the examples above on your own (or some of your own choosing) to make sure you understand how to work the math. You need the current prices for all three pairs so the easiest way to record the prices before they change is to take a screenshot.
Triangular Arbitrage With Bid Ask Quotes
Triangular arbitrage opportunities can be easily identified using bid and ask quotes. In this article, I describe formulas for computing triangular arbitrage using bid and ask quotes. It is worth noting that the triangular arbitrage computation using bid and ask prices is a bit more complex than simply using close prices. But once the basic triangular arbitrage concept is understood at the currency level, you should be able to compute your own triangular arbitrage inefficiencies based on bid and ask quotes. I will describe the method of computing triangular arbitrage with bid and ask quotes via simple rules and three examples.
Getting Started
You will need a simultaneous bid and ask quotes. I suggest taking a screenshot of your quote window because bid and ask prices are in constant flux and identifying an inefficiency requires accurate immediate and simultaneous prices.
Recall that at the heart of the triangular arbitrage formula is a conversion to the underlying currencies that make up a currency pair. Suppose we have simultaneous bid and ask quotes for three currency pairs that form a triangle or ring:
 Code:
EURUSD bid 1.38705 ask 1.38710
GBPUSD bid 1.59440 ask 1.59455
EURGBP bid 0.86975 ask 0.86990
Triangular Arbitrage Equations
You can visualize the ring via canceling fractions following the form A * B * C = 1 as either:
 Code:
EURUSD * (1/GBPUSD) * (1/EURGBP) = 1
(shown in the picture in white as EU/GU/EG)
Or the same equation can be worked out via subtraction for each pair as previously stated where the first term is the pair and the second complex term is the synthetic pair, so the following list is EURUSD, GBPUSD and EURGBP subtracting their respective synthetics to equal approximately zero.
 Code:
EURUSD  EURGBP*GBPUSD = 0
(shown in the picture in green as EUEG*GU)
GBPUSD  EURUSD/EURGBP = 0
EURGBP  EURUSD/GBPUSD = 0
[You must be registered and logged in to see this image.]
Note how in the picture, the two series are virtually identical except the first formula has a mean of one while the second formula has a mean of zero. The most appropriate method to use to calculate the triangular arbitrage formula is a matter of the objective. As can be seen from the pictures, all the formulas show approximately the same triangular arbitrage dynamic in a generalized way.
Bid and Ask Quotes
With bid and ask quotes, the situation is slightly more complex. Just as was shown in Triangular Arbitrage Lot Size to determine the proper lot size, a calculation must be made to the underlying currency representing each pair. The EURUSD currency pair is made up of the underlying currencies EUR and USD. A long position in EURUSD represents being long EUR and short USD. Likewise, a short position in EURUSD is actually a short position in EUR and a long position in USD. Because forex traders trade currency pairs and not the underlying currencies, this principle of one currency long and one currency short applies to any FX transaction with a currency pair.
Getting back to the example mentioned earlier:
 Code:
EURUSD bid 1.38705 ask 1.38710
GBPUSD bid 1.59440 ask 1.59455
EURGBP bid 0.86975 ask 0.86990
When you post a bid, you are attempting to buy, and when you post the ask price, you are attempting to sell. Bid and ask prices generally represent the prices at which your market maker or counterparty is willing to transact where the counterparty wishes to buy or sell respectively. If you place a buy limit order for EURUSD at 1.38705, your price is the same as the posted bid. If price moves down your order may be filled and you will belong EURUSD. In this case, you will be long EUR and short USD. If you buy 10,000 units of EURUSD, you are long 10,000 EUR and short 13,870.5 USD (10,000 * 1.38705). Keep this in mind when you attempt to convert bid and ask prices for three pairs into a triangular arbitrage relationship in an effort to spot temporary market inefficiencies.
Four BidAsk Rules
Four general rules for bid and ask prices can be stated
 Code:
BN The numerator (EUR) of a EURUSD bid price represents a long position in EUR.
BD The denominator (USD) of a EURUSD bid price represents a short position in USD.
AN The numerator (EUR) of a EURUSD ask price represents a short position in EUR.
AD The denominator (USD) of a EURUSD ask price represents a long position in USD.
(BN = Bid price numerator, BD = bid price denominator)
(AN = ask price numerator, AD = ask price denominator)
Example 1: EURUSD synthetic bid and ask prices
[You must be registered and logged in to see this image.]
For the purposes of this first example, assume the goal is to identify bid / ask price anomalies on EURUSD. The effective formula is EURUSD  EURGBP*GBPUSD = 0 or otherwise stated EURUSD = EURGBP*GBPUSD. Because the bid price of EURUSD should equal EURGBP*GBPUSD it is important to figure the actual currencies involved in the synthetic. As stated in rules BN and BD above, a posted bid to EURUSD is a willingness to buy EUR and to sell USD respectively. Through cancellation the formula for the synthetic reverts to EURUSD = EURGBP*GBPUSD. To buy EUR with EURGBP you use the bid price because EUR is in the numerator (just as with EURUSD in rule BN). To sell USD with GBPUSD, you also use the bid price, because USD is in the denominator, just as the USD in EURUSD represents a short position according to rule BD.
Likewise in calculating ask prices for EURUSD by applying rules AN and AD to EURUSD's synthetic EURGBP*GBPUSD, we use ask prices for EURGBP according to rule AN to create a short position in EUR. To create a long position in USD according to rule AD, ask prices for GBPUSD should be used. Thus to summarize:
The bid price of synthetic EURUSD = bid price of EURGBP * bid price of GBPUSD.
Ask prices of synthetic EURUSD = ask price of EURGBP * ask price of GBPUSD.
[You must be registered and logged in to see this image.]
The result of these calculations is shown in the first picture (above) where the EURUSD bid is shown in red and compared against a green synthetic ask price. Note how there are a few small excursions of the synthetic ask price below the red bid line representing a little opportunity for arbitrage. The magnitude of these small excursions would likely not pay for transaction costs as well as the times when price moves between identification and execution, eliminating the opportunity. Likewise, there are many times when the synthetic bid in the second picture is equal to or greater than the ask prices, but just once when a single pip of profit could theoretically be captured. These pictures generally show that the markets over this 1000 bid/ask price change period are efficiently priced with not much opportunity for fleeting arbitrage opportunities of a pip or less.
It is now possible to easily compute the synthetic bid and ask prices for EURUSD using the following prices:
 Code:
EURUSD bid 1.38705 ask 1.38710
GBPUSD bid 1.59440 ask 1.59455
EURGBP bid 0.86975 ask 0.8699
Also, note the formula:
 Code:
EURUSD = EURGBP * GBPUSD
Actual vs. Synthetic Calculation and Comparison
EURUSD synthetic bid = EURGBP bid * GBPUSD bid = 0.86975 * 1.59440 = 1.3867294 which rounds to 1.38673. Compare this synthetic price to the actual bid price for EURUSD which is 3.2 pips higher indicating no opportunity from the synthetic bid. This is understandable considering the underlying spread is 1/2 pip!
EURUSD synthetic ask = EURGBP ask * GBPUSD ask = 0.86990 * 1.59455 = 1.3871 (rounded). Compared to the underlying it is clear that the synthetic and the underlying have approximately the same price and thus either could be used for a transaction at the ask prices. However, double transaction costs are required for the synthetic. This equality between ask prices for the underlying EURUSD and synthetic EURUSD does not represent an apparent inefficiency that can be exploited.
In order for a real efficiency to existing, the synthetic bid (ask) price would need to be greater (less) than the actual bid (ask) price. But keep in mind the transaction costs as well as the significant execution risk that could invalidate any attempt to arb these transitory prices.
In the new examples will be showing how to compute synthetic bid and ask prices for GBPUSD and EURGBP will be shown. Recall the following bidask prices:
 Code:
EURUSD bid 1.38705 ask 1.38710
GBPUSD bid 1.59440 ask 1.59455
EURGBP bid 0.86975 ask 0.86990
Four BidAsk Rules
Four general rules for bid and ask prices can be stated:
 Code:
BN The numerator (GBP) of a GBPUSD bid price represents a long position in GBP.
BD The denominator (USD) of a GBPUSD bid price represents a short position in USD.
AN The numerator (GBP) of a GBPUSD ask price represents a short position in GBP.
AD The denominator (USD) of a GBPUSD ask price represents a long position in USD.
(BN = Bid price numerator, BD = bid price denominator)
(AN = ask price numerator, AD = ask price denominator)
Example2: GBPUSD synthetic bidask prices
To compute the synthetic GBPUSD bid price, recall that via rule BN (bid numerator) that a long position is taken in GBP and via rule BD (bid denominator) a short position is taken in USD. When working out the synthetic, the following equation comes into play:
 Code:
GBPUSD = (1/EURGBP) * EURUSD
Note that the price of EURGBP must be inverted by dividing 1 by the price of EURGBP (for JPY denominated pairs, divide 100 by the price to invert the quote). This inversion puts GBP in the numerator, thus matching the GBP in GBPUSD's numerator. The denominator of EURUSD matches the USD in GBPUSD's denominator so no inversion is necessary. The same rules as applied previously also apply now.
When computing the bid price of GBPUSD's synthetic, first the correct rule must be ascertained. GBP long is desired and USD short. GBP is in the denominator of EURGBP so the denominator rules (AD, BD) will need to be applied. according to rule BD the bid price of the denominating currency (GBP) is short. Rule AD states that the denominator of the ask price represents a long GBP position This meets the goal of long GBP. Thus the ask price of EURGBP must be used for a long GBP position. Applying rule BD to EURUSD gives a short USD position, just as is needed to finish the synthetic GBPUSD bid at long GBP and short USD.
GBPUSD ask (red) vs. synthetic bid (green)Thus, synthetic GBPUSD bid = (1/EURGBP ask) * EURUSD bid = (1.0/0.86990) * 1.38705 = 1.59449 (rounded). Compared to the real GBPUSD bid of 1.59440 it is clear that the synthetic price is 0.9 pips higher than the GBPUSD bid price. This slight improvement opens the way for transactions in the synthetic to replace transactions in GBPUSD if conditions such as interest rates earned/paid are favorable, and transaction costs are taken into consideration. However, there is still no arbitrage opportunity because the synthetic bid is still less than the actual ask price of GBPUSD.
To compute the GBPUSD synthetic ask, recall that the real ask price represents a short GBP position and a long USD position. Again, GBP is in the denominator of EURGBP so the denominating rules must be applied. Applying rule AD to EURGBP indicates a long position in GBP. Again, this is the opposite of what we are looking for! Rule BD states that the denominator represents a short position, so the bid price will be used for EURGBP. USD is in the denominator of EURUSD so by applying rule AD we find that USD is long, a match!
Thus, to compute the ask price of GBPUSD's synthetic, bid prices will be used for EURGBP to get GBP short, and ask prices will be used for EURUSD to get USD long. Synthetic GBPUSD ask price = (1/EURGBP) bid * EURUSD ask = (1.0/0.86975) * 1.38710 = 1.59492 (rounded). Comparing synthetic GBPUSD ask price to actual GBPUSD ask price it is clear that the actual ask price of 1.59455 is better than the synthetic ask price of 1.59492 indicating no inefficiency or opportunity in executing via the GBPUSD synthetic ask price over the actual GBPUSD ask price.
[You must be registered and logged in to see this image.]
The pictures above show GBPUSD bid and ask prices compared against synthetic ask and bid prices respectfully. Opportunities exist when the green line exceeds the red line. However, as can be seen from the pictures, these opportunities are transitory and very small in magnitude.
Example 3: EURGBP synthetic bid and ask prices
 Code:
EURUSD bid 1.38705 ask 1.38710
GBPUSD bid 1.59440 ask 1.59455
EURGBP bid 0.86975 ask 0.86990
The equation to compute the synthetic price for EURGBP is as follows:
 Code:
EURGBP = EURUSD * (1/GBPUSD)
Turning our attention to calculate the bid price for EURGBP, recall that the bid price of EURGBP represents EUR long and GBP short. To compute the synthetic bid price for the numerator EUR (long), EURUSD bid prices may be used via rule BN. To compute GBP short, recall that GBP is in the numerator of GBPUSD. According to rule AN the ask price of the numerator must be used to get GBP short.
Four BidAsk Rules
Four general rules for bid and ask prices can be stated:
 Code:
BN The numerator (EUR) of a EURGBP bid price represents a long position in EUR.
BD The denominator (GBP) of a EURGBP bid price represents a short position in GBP.
AN The numerator (EUR) of a EURGBP ask price represents a short position in EUR.
AD The denominator (GBP) of a EURGBP ask price represents a long position in GBP.
(BN = Bid price numerator, BD = bid price denominator)
(AN = ask price numerator, AD = ask price denominator
Thus the calculation of the EURGBP synthetic bid = bid EURUSD * (1/GBPUSD) ask = 1.38705 * (1/1.59455) = synthetic EG bid of 0.86987 (rounded). Compare the synthetic bid to the actual bid to see improvement of approximately 1.2 pips over the actual EURGBP bid price. The synthetic bid price doesn't exceed the actual ask price, and so in spite of the synthetic offering, a better deal on the bid than the actual, noarbitrage opportunity was found.
The synthetic ask for EURGBP can likewise be computed as ask EURUSD * (1/GBPUSD) bid = 1.38710 * (1/1.59440) = 0.86998 (rounded). Compared to the actual EURGBP ask it is clear that the market is efficient and that the synthetic ask price offers no opportunity either to ask price improvement or for arbitrage.
Conclusion
Calculating bid and ask prices for synthetic pairs is fairly straightforward. Keep in mind that an underlying pair's bid consists of a long position in the numerator of the underlying, and a short position in the denominator of the underlying. Then simply match up two related pairs that contain the underlying currencies combined with a third currency for the two synthetics, such as underlying EURAUD with EURUSD and AUDUSD where USD is the third currency. EURAUD synthetic could also be formed using GBP as the third currency such as EURGBP and GBPAUD.
Then just determine which currency is long for the underlying and match up a synthetic pair's bid or ask price to match that long position. Do the same for the short underlying currency match up either the synthetic pair's bid or ask. The same rules apply to ask prices but in reverse. It may be useful to write out the four bidask rules for your underlying to make this process easier.
Permissions in this forum:
You cannot reply to topics in this forum

