Accelerating the pace of engineering and science

# 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:

• 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.

## 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.