# Explore Single-Period Asset Arbitrage

This example explores a few basic concepts related to arbitrage in single-period, two-state asset portfolio. It uses these Symbolic Math Toolbox functions:

`equationsToMatrix`to convert a linear system of equations to a matrix.

`linsolve`to solve the system.

- Symbolic equivalent of standard MATLAB functions, such as
`diag`.

The portfolio consists of a bond, a long stock, and a long call option on the stock. This example symbolically derives the risk-neutral probabilities and call price for a single-period, two-state scenario.

## Contents

## Define Parameters of the Portfolio

Create the symbolic variable `r` representing the risk-free rate over the period. Set the assumption that `r` is a positive value.

syms r positive

Define the parameters for the the beginning of a single period, `time = 0`. Here `S0` is the stock price, and `C0` is the call option price with strike, `K`.

syms S0 C0 K positive

Now, define the parameters for the end of a period, `time = 1`. Label the two possible states at the end of the period as U (the stock price over this period goes up) and D (the stock price over this period goes down). Thus, `SU` and `SD` are the stock prices at states U and D, and `CU` is the value of the call at state U. Note that `SD <= K <= SU`.

syms SU SD CU positive

The bond price at `time = 0` is 1. Note that this example ignores friction costs.

Collect the prices at `time = 0` into a column vector.

prices = [1 S0 C0]'

prices = 1 S0 C0

Collect the payoffs of the portfolio at `time = 1` into the `payoff` matrix. The columns of `payoff` correspond to payoffs for states D and U. The rows correspond to payoffs for bond, stock, and call. The payoff for the bond is `1 + r`. The payoff for the call in state D is zero since it is not exercised (because `SD <= K`).

payoff = [(1 + r), (1 + r); SD, SU; 0, CU]

payoff = [ r + 1, r + 1] [ SD, SU] [ 0, CU]

`CU` is worth `SU - K` in state U. Substitute this value in `payoff`.

payoff = subs(payoff, CU, SU - K)

payoff = [ r + 1, r + 1] [ SD, SU] [ 0, SU - K]

## Solve for Risk-Neutral Probabilities

Define the probabilities of reaching states U and D.

syms pU pD real

Under no-arbitrage, `eqns` must always hold true with positive `pU` and `pD`.

eqns = payoff*[pD; pU] - prices

eqns = pD*(r + 1) + pU*(r + 1) - 1 SD*pD - S0 + SU*pU - C0 - pU*(K - SU)

Transform equations to use risk-neutral probabilities.

syms pDrn pUrn real; eqns = subs(eqns,[pD; pU], [pDrn; pUrn]/(1 + r))

eqns = pDrn + pUrn - 1 (SD*pDrn)/(r + 1) - S0 + (SU*pUrn)/(r + 1) - C0 - (pUrn*(K - SU))/(r + 1)

The unknown variables are `pDrn`, `pUrn`, and `C0`. Transform the linear system to a matrix form using these unknown variables.

[A, b] = equationsToMatrix(eqns, [pDrn, pUrn, C0]')

A = [ 1, 1, 0] [ SD/(r + 1), SU/(r + 1), 0] [ 0, -(K - SU)/(r + 1), -1] b = 1 S0 0

Using `linsolve`, find the solution for the risk-neutral probablities and call price.

x = linsolve(A, b)

x = (S0 - SU + S0*r)/(SD - SU) -(S0 - SD + S0*r)/(SD - SU) ((K - SU)*(S0 - SD + S0*r))/((SD - SU)*(r + 1))

## Verify the Solution

Verify that under risk-neutral probabilities, `x(1:2)`, the expected rate of return for the portfolio, `E_return` equals the risk-free rate, `r`.

E_return = diag(prices)\(payoff - [prices,prices])*x(1:2); E_return = simplify(subs(E_return, C0, x(3)))

E_return = r r r

## Test for No-Arbitrage Violations

To test for no-arbitrage violations, use the following values: `r = 5%`, `S0 = 100`, and `K = 100`. For `SU < 105`, the no-arbitrage condition is violated because `pDrn = xSol(1)` is negative (`SU >= SD`). Further, for a any call price other than `xSol(3)`, there is arbitrage.

xSol = simplify(subs(x, [r,S0,K], [0.05,100,100]))

xSol = -(SU - 105)/(SD - SU) (SD - 105)/(SD - SU) (20*(SD - 105)*(SU - 100))/(21*(SD - SU))

## Plot Call Price as a Surface

Plot the call price, `C0 = xSol(3)`, for `50 <= SD <= 100` and `105 <= SU <= 150`. Note that the call is worth more when the "variance" of the underlying stock price is higher for example, `S1 = 50, S2 = 150`.

ezsurf(xSol(3), [50,100,105,150])

## Reference

`Advanced Derivatives, Pricing and Risk Management: Theory, Tools and Programming Applications` by Albanese, C., Campolieti, G.