The Desk and the Firm · The firm
20Build against Buy
In November 2018 Virtu Financial agreed to buy Investment Technology Group, an agency broker, and in March 2019 it completed the purchase for about $1.0 billion in cash, $30.30 a share. Its stated reasons were to offer its clients a complete suite of agency services, “including transparent trading and workflow technology, analytics, and liquidity solutions”, running on Virtu’s own infrastructure, and about $123 million a year of expense savings within two years. A firm can write the software it needs, license it, or buy the company that wrote it together with its clients and its people. The last is the most expensive way to acquire software, and sometimes the only way to acquire a business built on it.
20.1 What firms build and what they buy
Definition 20.1 (Build against buy)
The build against buy decision is the choice, for a capability the firm needs, between developing it with its own engineers, licensing or subscribing to a vendor’s product, or a mix (a vendor core with the firm’s own extensions), over the capability’s whole life.
The usual rule is that a firm builds what makes it different and buys what makes it the same. A market maker’s quoting engine and risk checks are its edge, and it builds them (Books 11 and 13); its payroll, email and much of its post-trade processing are the same as everyone’s, and it buys them. The hard cases sit in between: order and execution management systems (Book 10), the security master (Book 7), the machine-learning platform (Book 12). They are needed by everyone, they touch the firm’s edge at the edges, and they are expensive both ways.
Definition 20.2 (Total cost of ownership)
The total cost of ownership of a capability is the present value of every cost of having it over its life: development or licence fees, integration and customisation, infrastructure, support and maintenance, the engineers’ time and what they would otherwise have built, and the cost of leaving it.
20.2 Total cost of ownership
The chapter’s example is an order-management system over seven years (Listing 20.1). Building it takes seven engineers for two years, then three a year to maintain it, plus $0.2 million a year of infrastructure. Buying it costs a $1.2 million licence rising 5% a year, a $1.0 million integration fee and two engineers in the first year, and one engineer of support every year. An engineer-year costs $350 000 loaded, and the firm adds 30% for the work the engineer would otherwise have done: $455 000. The discount rate is 8%. All figures are illustrative; Boehm’s Software Engineering Economics (1981) is the classic reference on estimating the development and maintenance terms.
def build_costs(b, horizon):
ey = b.wage * (1 + b.kappa)
return [b.dev_engineers * ey if t < b.dev_years else b.maint_engineers * ey + b.infra for t in range(horizon)]
def buy_costs(y, horizon):
ey = y.wage * (1 + y.kappa)
out = []
for t in range(horizon):
c = y.licence * (1 + y.escalator) ** t + y.support_engineers * ey
if t == 0:
c += y.integration_fee + y.integration_engineers * ey
out.append(c)
return out
def npc(costs, r):
"""Net present cost, each year's cost paid at the year end."""
return sum(c / (1 + r) ** (t + 1) for t, c in enumerate(costs))
fm_buildbuy.paths.Building costs $3.19 million in each of the first two years and $1.57 million a year after (Figure 20.1); buying costs $3.57 million in the first year and then $1.72 million, rising with the licence to $2.06 million in year seven. Undiscounted, the build costs $14.2 million over seven years and the purchase $14.9 million. Discounting favours buying, since the build’s costs come first: the net present costs are $11.04 million and $11.30 million (Figure 20.2).
fm_buildbuy.by_horizon.Proposition 20.3 (The engineer cost that decides)
If every engineer-year on either path costs and all other costs do not depend on , the difference between the net present costs of building and buying is linear in , , with the present value of the build’s engineer-years less the purchase’s, times . When , building is cheaper exactly when .
Proof. Each year’s cost on each path is a constant plus a number of engineer-years times ; discounting and summing preserve linearity. The build uses more engineer-years (), so rises with and changes sign once, at . ∎
Over seven years the break-even loaded engineer-year is $363 000: at the firm’s $350 000 building wins, by $0.26 million of present cost, and a firm paying more for its engineers should buy. From the seventh year on, building stays cheaper at every longer horizon. The margin is thin, which is the common case: the decision rarely turns on the base case and often on what could go wrong.
20.3 Lock-in and the option to switch
Definition 20.4 (Vendor lock-in, switching cost)
Vendor lock-in is the dependence on a vendor that makes leaving it costly: data in its formats, workflows built around its product, integrations, skills and contracts. The switching cost is what leaving costs: migration, parallel running, retraining, termination fees and the risk of disruption.
Lock-in lets a vendor raise its price at renewal by up to the switching cost without losing the client. The chapter models the risk on a binomial tree: at each renewal the licence may rise 30% with probability 0.3; switching to another vendor costs $2.0 million and resets the price. With the price risk, the expected present cost of buying rises from $11.30 million to $13.46 million, $2.42 million more than building; the option to switch vendors, exercised when it pays, brings it back to $12.90 million. The option is worth $0.56 million, and its value is the reason to keep switching costs low (Listing 20.2). The best policy is simple: switch once the price has risen twice, by 69%, except in the last year, when a single year of savings no longer pays for the move (Figure 20.3).
def _tree(y, horizon, r, u, p, switch_cost, allow):
base = buy_costs(y, horizon)
lic = [y.licence * (1 + y.escalator) ** t for t in range(horizon)]
disc = [1 / (1 + r) ** (t + 1) for t in range(horizon)]
memo, policy = {}, set()
def v(t, k): # k: number of price rises in the current multiplier
if t == horizon:
return 0.0
if (t, k) in memo:
return memo[(t, k)]
stay = (base[t] + lic[t] * (u ** k - 1)) * disc[t] + p * v(t + 1, k + 1) + (1 - p) * v(t + 1, k)
best = stay
if allow and k > 0:
sw = (switch_cost + base[t]) * disc[t] + p * v(t + 1, 1) + (1 - p) * v(t + 1, 0)
if sw < stay:
best = sw
policy.add((t + 1, k))
memo[(t, k)] = best
return best
return v(0, 0), policy
def switch_value(y, horizon, r, u, p, switch_cost):
"""(expected NPC of staying, expected NPC with the best switching policy, option value) on the price tree."""
stay, _ = _tree(y, horizon, r, u, p, switch_cost, False)
flex, _ = _tree(y, horizon, r, u, p, switch_cost, True)
return stay, flex, stay - flex
firm.buildbuy.switch_policy.Definition 20.5 (Source-code escrow)
Source-code escrow is an arrangement under which a vendor deposits the source code of its product with an independent agent, to be released to the client on defined events such as the vendor’s insolvency or its ceasing to support the product.
Escrow does not remove lock-in; it lowers the cost of the worst case, where the vendor disappears, from a rebuild under pressure to a takeover of code the firm has never run. Its value depends on whether the deposit is kept current and could be built. Real options in general (Dixit and Pindyck, Investment under Uncertainty, 1994) formalise the same idea: flexibility has a value that a static comparison leaves out, and paying for it (short contracts, standard data formats, escrow) is sometimes cheaper than the lock-in it prevents.
20.4 Tutorial: seven years of an order-management system
Goal. Compare building and buying an order-management system over seven years, value the option to switch vendors, and find which inputs decide the answer. End state: the cost curves by horizon and the tornado chart (Figure 20.4).
- The paths.
fm_buildbuy.paths()lists the yearly costs;firm.buildbuy.npcdiscounts them. - The break-evens.
breakeven_wagesolves Proposition 20.3;breakeven_horizonfinds the horizon from which building stays cheaper. - The option.
switch_valuevalues the right to switch vendors on the renewal-price tree. - The tornado.
fm_buildbuy.tornado()moves each input by 20% up and down and records the build-minus-buy difference.
fm_buildbuy.tornado.The licence and the wage dominate: a licence 20% cheaper makes buying $1.17 million cheaper than building, one 20% dearer makes building $1.69 million cheaper; the wage moves the answer by the same amounts in the other direction. The number of development engineers comes next. The escalator and the integration fee barely matter over seven years. The decision therefore rests on two numbers that can be negotiated or measured: the licence the vendor will accept, and what the firm’s engineers really cost and could otherwise build.
20.5 Choosing a vendor
Definition 20.6 (Request for proposal)
A request for proposal is a structured invitation to vendors to propose a product or service against the firm’s written requirements, in a common format, so that proposals can be scored and compared on functions, performance, cost, terms and risk.
Method 20.7 (Running a build-against-buy decision)
- Write the requirements, separating what makes the firm different (build or extend) from what it shares with everyone (buy).
- Issue a request for proposal to at least three vendors; score functions, latency and capacity against the firm’s service-level agreements (Book 14), and price the full cost of ownership, not the licence.
- Estimate the build honestly, with the maintenance tail and the engineers’ opportunity cost.
- Compare over the capability’s expected life, with the price risk and the switching cost; value the option to switch and what it costs to keep.
- Negotiate terms that keep the option: data export, standard formats, escrow, price caps at renewal, termination assistance.
- Revisit at every renewal: lock-in grows with every integration.
A handoff specification (Book 12) between the firm’s systems and the vendor’s is the cheapest lock-in insurance: if the interface is the firm’s, a new vendor or an in-house build plugs into the same socket. A platform team (chapter 19) owns it.
20.6 Build: the build-against-buy model
Purpose. The cost of building and of buying over a horizon, the break-even engineer cost and horizon, the option to switch vendors, and the sensitivity of the answer.
Interface. firm.buildbuy: Build, Buy, build_costs, buy_costs, npc, breakeven_wage, breakeven_horizon, switch_value, tornado.
Rules. Costs are paid at year ends; engineer-years carry the opportunity cost on both paths; the option’s value is never negative.
Acceptance tests. code/firm/buildbuy/tests/: cost paths on hand numbers; the break-even wage equalises the costs; the option value grows with the price risk; the tornado’s order.
Stretch. A mixed path (vendor core with in-house extensions); insourcing as the switch; the probability that the build overruns.
Sources and further reading
- Virtu Financial, Forms 8-K of 7 November 2018 and 1 March 2019 (press releases on the acquisition of Investment Technology Group).
- A. K. Dixit and R. S. Pindyck, Investment under Uncertainty, Princeton University Press, 1994.
- B. W. Boehm, Software Engineering Economics, Prentice-Hall, 1981.
20.7 Exercises
Exercise 20.1 ★
What does a loaded engineer-year cost the firm, including the opportunity cost, and what do the build’s first two years cost?
Solution
Solution of Exercise 20.1.
million; the first two years cost million each.
Exercise 20.2 ★
What does the licence cost in year seven, and what is the purchase’s cost that year?
Solution
Solution of Exercise 20.2.
million; with a support engineer, $2.06 million.
Exercise 20.3 ★
Over which horizons is buying cheaper, and from which horizon is building cheaper?
Solution
Solution of Exercise 20.3.
Buying is cheaper over horizons of two to six years; building is cheaper over one year (the purchase’s integration year is dear) and from seven years on.
Exercise 20.4 ★★
Why does discounting favour buying in this example?
Solution
Solution of Exercise 20.4.
The build’s costs come in the first two years and its savings later; discounting shrinks the later savings more than the early costs.
Exercise 20.5 ★★
What was Virtu’s stated rationale for buying ITG, and what did it pay?
Solution
Solution of Exercise 20.5.
A complete suite of agency services, including workflow technology, analytics and liquidity solutions, on Virtu’s infrastructure, and about $123 million a year of expense savings plus $125 million of capital synergies; about $1.0 billion in cash, $30.30 a share.
Exercise 20.6 ★★
Why is the option to switch worth more when the vendor’s price is riskier? What would make it worthless?
Solution
Solution of Exercise 20.6.
The option pays in the states where the price has risen; the more likely and larger the rises, the more it saves. It is worthless if switching costs more than any price rise could, or if the price cannot rise.
Exercise 20.7 ★★★
Coding. Value the option to switch with a price-rise probability of 0.5 instead of 0.3. What does buying cost in expectation, with and without the option?
Solution
Solution of Exercise 20.7.
$15.28 million without the option and $13.79 million with it: the option is worth $1.50 million, against $0.56 million at a probability of 0.3. Both exceed the build’s $11.04 million.
Exercise 20.8 ★★★
Find the flaw. “Building is free: our engineers are already on the payroll.”
Solution
Solution of Exercise 20.8.
Engineers on the payroll cost their wage whatever they do, and what they build instead is the opportunity cost: the chapter prices it at 30% of the wage. Building also commits the firm to the maintenance tail for the system’s life.
20.8 Problem: Seven Years of an Order-Management System
Problem 20.1
Weekend problem — seven years of an order-management system
A chief technology officer must recommend whether to build or buy the firm’s next order-management system.
Part I — The decision.
- Define build against buy and the total cost of ownership.
- Which capabilities should a trading firm build, and which buy?
- What did Virtu buy in 2019, for how much, and why?
- Why is buying the company the most expensive way to acquire software?
Part II — The costs.
- List the yearly costs of each path.
- Give the net present costs over seven years and the undiscounted totals.
- State and prove Proposition 20.3.
- Give the break-even wage and the break-even horizon.
Part III — Lock-in.
- Define vendor lock-in and switching cost.
- Describe the renewal-price tree and give the expected cost of buying with and without the option to switch.
- Define source-code escrow and say what it does and does not do.
- Which contract terms preserve the option to switch?
Part IV — The recommendation.
- Read the tornado: which inputs decide?
- What would you negotiate with the vendor?
- What would you measure about your own engineers?
- Define a request for proposal and outline one for the system.
- How does a handoff specification reduce lock-in?
- When should the decision be revisited?
- State the named result: the fully loaded engineer-year cost at which building beats buying over seven years, and the value of the option to switch.
- In two sentences, write the recommendation.
Solution
Solution of Problem 20.1.
- See Definitions 20.1 and 20.2.
- Build what makes the firm different (quoting, risk checks, strategies); buy what is the same for everyone (payroll, email, much of post-trade).
- Investment Technology Group, for about $1.0 billion in cash, for agency services, workflow technology, analytics and cost savings.
- It pays for the vendor’s clients, people and other businesses as well as its software.
- See Exercises 20.1 and 20.2.
- $11.04 million and $11.30 million; $14.2 million and $14.9 million undiscounted.
- See Proposition 20.3.
- $363 000 loaded per engineer-year; seven years.
- See Definition 20.4.
- At each renewal the price may rise 30% with probability 0.3; switching costs $2 million. Expected cost $13.46 million without the option, $12.90 million with it.
- See Definition 20.5; it limits the damage if the vendor disappears, not the vendor’s pricing power.
- Data export in standard formats, termination assistance, price caps at renewal, escrow, short terms.
- The licence and the wage, then the development effort.
- The licence and a price cap at renewal.
- Their full cost and what they would otherwise build.
- See Definition 20.6; requirements, service levels, pricing over the life, terms, references.
- It makes the interface the firm’s, so a new vendor or a build can replace the old one without rewiring.
- At every renewal, and when the firm’s engineer costs or the vendor’s prices move.
- $363 000 per loaded engineer-year over seven years; the option to switch is worth $0.56 million.
- Build the system, since at $350 000 per engineer-year it is cheaper over seven years and avoids the vendor’s price risk, and specify the interfaces so that the build could be replaced; if engineers cost more than $363 000, buy with a price cap and an exit plan.
20.9 Interview questions
Interview question 20.1 ★ developer
Your team wants to build its own market data handler rather than use a vendor’s. What would you ask?
Solution
Solution of Interview question 20.1.
Whether the handler is part of the edge (latency the vendor cannot match), the full cost including maintenance and venue changes, and the cost of switching if the vendor fails or raises its price.
What the interviewer is looking for: edge, full cost and lock-in.
Interview question 20.2 ★ trader
Why might a trading firm buy an order-management system but build its execution algorithms?
Solution
Solution of Interview question 20.2.
The order-management system is the same for everyone; the algorithms are how the firm executes better than others.
What the interviewer is looking for: differentiation.
Interview question 20.3 ★★ researcher
How would you value the option to switch vendors?
Solution
Solution of Interview question 20.3.
As a real option: model the vendor’s price at renewals on a tree, and compare the expected cost of staying with the cost under the best switching policy, net of switching costs.
What the interviewer is looking for: backward induction on a price tree.
Interview question 20.4 ★★ developer
What makes a vendor’s product hard to leave, and how would you design around it?
Solution
Solution of Interview question 20.4.
Proprietary data formats, integrations to its interfaces, skills and contracts; design with the firm’s own interfaces, standard formats and export paths.
What the interviewer is looking for: owning the interface.
Interview question 20.5 ★★ risk
What risks does a critical vendor add, and how would you manage them?
Solution
Solution of Interview question 20.5.
Price power, outages, security, insolvency and loss of support; manage with service levels, exit plans, escrow, a second supplier where it matters and regular tests.
What the interviewer is looking for: concentration and exit.
Interview question 20.6 ★★★ developer, researcher
Estimate the seven-year total cost of ownership of building a system that takes six engineers a year to build.
Solution
Solution of Interview question 20.6.
Six engineer-years to build, then a maintenance tail of perhaps a third to a half of that each year, all at the loaded wage plus opportunity cost, plus infrastructure; discount over the life, and compare with a vendor’s full cost, not its licence.
What the interviewer is looking for: the maintenance tail and the opportunity cost.