# CFEVALDEMO1

Function `cfeval` calculates cash flows of fixed-income portfolios and structured products, given a quasi-symbolic, Matlab-syntax, typically
recursive description of principal and coupon dynamics. Combined, these descriptions are passed to `cfsim` in cell arrays of strings, whose rows correspond to securities, and columns to periods.

## Contents

```
help cfeval
```

CFEVAL Evaluate portfolio cash flows given their symbolic definitions INPUTS : N*T cell arrays of strings, where cell (i,t) contains definition of .. on security i in period t: pofun - principal outstanding cpfun - coupon payment psfun - scheduled principal repayment ppfun - unscheduled principal repayment par - parameter structure, available to calculations defined in pofun, cpfun, psfun, ppfun OUTPUTS : N*T arrays, where element (i,t) contains value of .. on security i in period t: cfval - total cash flow (sum of cfval, psval and ppval) poval - principal outstanding cpval - coupon payment psval - scheduled principal repayment ppval - unscheduled principal repayment NOTES : Cells of input arrays are evaluated sequentially, iterating over * periods: t = 1,..,T * securities: i = 1,..,N * input arrays: pofun, cpfun, psfun, ppfun Computing xval(i,t) - note that xfun arrays definitions must use indexes i and t - one can reference already-evaluated quantities EXAMPLE : See CFEVALDEMO AUTHOR : Dimitri Shvorob, dimitri.shvorob@vanderbilt.edu, 9/25/07

## Example 1. Fixed-coupon bond

a) set up security definitions

T = 3; [pofun,cpfun,psfun,ppfun] = deal(cell(1,T));

- Principal outstanding: constant, normalized to 1

```
[pofun{:}] = deal('1');
```

- Coupon: 5%

```
[cpfun{:}] = deal('0.05*poval(i,t)');
```

- Principal repayment: outstanding principal at maturity

[psfun{:}] = deal('0'); psfun{T} = 'poval(i,t)';

```
[ppfun{:}] = deal('0');
```

b) calculate total cash flows

cfeval(pofun,cpfun,psfun,ppfun)

ans = 0.05 0.05 1.05

## Example 2. Floating-rate note

a) set up security definitions

[pofun,cpfun,psfun,ppfun] = deal(cell(1,T));

- Principal outstanding: constant, normalized to 1

```
[pofun{:}] = deal('1');
```

- Coupon: linked to a variable rate, its path passed to
`cfeval`in parameter structure`par`

```
clear par
```

```
par.libor = 0.1*rand(1,T) %#ok
```

par = libor: [0.04 0.06 0.08]

```
[cpfun{:}] = deal('par.libor(t)*poval(i,t)');
```

- Principal repayment: outstanding principal at maturity

[psfun{:}] = deal('0'); psfun{T} = 'poval(i,t)';

```
[ppfun{:}] = deal('0');
```

b) calculate coupon payments and total cash flows

```
[cfval,poval,cpval] = cfeval(pofun,cpfun,psfun,ppfun,par); %#ok
```

```
cpval, cfval %#ok
```

cpval = 0.04 0.06 0.08 cfval = 0.04 0.06 1.08

## Example 3. Floater and inverse floater

a) set up security definitions

[pofun,cpfun,psfun,ppfun] = deal(cell(2,T));

- Principal outstanding: constant, normalized to 1, split 50/50 between floater and inverse floater

par.w = [.5 .5];

```
[pofun{:}] = deal('par.w(i)');
```

- Coupon:
`(LIBOR + 2%)`for floater,`max(5%-LIBOR,0)`for inverse floater

```
[cpfun{1,:}] = deal('(par.libor(t) + 0.02)*poval(i,t)');
```

```
[cpfun{2,:}] = deal('max(0.05 - par.libor(t),0)*poval(i,t)');
```

- Principal repayment: outstanding principal at maturity

[psfun{:}] = deal('0'); [psfun{:,T}] = deal('poval(i,t)');

```
[ppfun{:}] = deal('0');
```

b) calculate coupon payments and total cash flows

```
[cfval,poval,cpval] = cfeval(pofun,cpfun,psfun,ppfun,par); %#ok
```

```
cpval, cfval %#ok
```

cpval = 0.03 0.04 0.05 0.00 0 0 cfval = 0.03 0.04 0.55 0.00 0 0.50

## Example 4. CDO with senior and subordinate tranches

a) set up security definitions

[pofun,cpfun,psfun,ppfun] = deal(cell(2,T));

- Principal: normalized to 1, split 75/25 between senior and subordinate tranches, and subsequently reduced by collateral
defaults, occuring at random rate
`d(t)`, so that fraction`1-d(t)`of principal outstanding in period`t`remains at`t+1`

```
clear par
```

par.w = [.75 .25];

par.d = .1*ones(1,T);

```
[pofun{:,1}] = deal('par.w(i)');
```

Credit loss on overall portfolio:

clp = 'par.d(t-1)*sum(poval(:,t-1),1)' %#ok

clp = par.d(t-1)*sum(poval(:,t-1),1)

Credit loss on senior tranche:

cls = ['max(0,' clp ' - poval(2,t-1))'] %#ok

cls = max(0,par.d(t-1)*sum(poval(:,t-1),1) - poval(2,t-1))

Subordinate tranche: principal reduced by credit losses, but cannot go negative

[pofun{2,2:end}] = deal(['max(0,poval(2,t-1) - ' clp ')']);

Senior tranche: principal reduced only if credit losses exceed subordinate tranche's principal

[pofun{1,2:end}] = deal(['max(0,poval(1,t-1) - ' cls ')']);

- Coupon: 5% on senior tranche, 10% on subordinate tranche

par.r = [.05 .10];

```
[cpfun{:}] = deal('par.r(i)*poval(i,t)');
```

- Principal repayment: outstanding principal at maturity

[psfun{:}] = deal('0'); [psfun{:,T}] = deal('poval(i,t)');

```
[ppfun{:}] = deal('0');
```

b) calculate principal outstanding, coupon payments, and overall cash flows

```
[cfval,poval,cpval] = cfeval(pofun,cpfun,psfun,ppfun,par); %#ok
```

```
poval, cpval, cfval %#ok
```

poval = 0.75 0.75 0.75 0.25 0.15 0.06 cpval = 0.04 0.04 0.04 0.03 0.01 0.01 cfval = 0.04 0.04 0.79 0.03 0.01 0.07