>

Computational Finance: Midterm Examination

April 19, 2000
Philip H. Dybvig

This is a closed-book examination. Answer all questions as directed. Mark your answers directly on the examination. On the valuation question, make sure your answer is clearly indicated. There are no trick questions on the exam. Good luck!
A. General Concepts Very Short Answer: 20 points

  1. We buy cheap gold futures in one market and sell the identical contract for more in another market to lock in a riskless profit. This is most related to which concept: arbitrage, dominance, hedging, or value-at-risk?
    
    
    
    
  2. If the call option price equals the underlying stock price, we would rather buy the stock than the option because the stock is worth more in most contingencies and is never worth less. This is most related to which concept: arbitrage, dominance, hedging, or value-at-risk?

     
     
     
    
    
  3. We sell short a portfolio of the stock and the bond that has the same terminal payoff as employee stock options we own. This is best described by which concept: arbitrage, dominance, hedging, or value-at-risk?

     
    
    
    
    
  4. Name three interest derivative securities.

     
    
    
    
    
  5. Name a commodity whose price can rationally be expected to drop for certain at a known future time.

     
    
    
    
    
    
    
    
    
B. Financial Computation 40 points

A Simple Option Pricing Problem in One Period

Riskless bond (interest rate is 20%):

100 --- 120

Futures price:

    |- 80
50 -|
    |- 30

Derivative security (call futures option with a strike of 50):

    |- 30
 ? -|
    |-  0
  1. What is the portfolio of the futures contract and the bond that replicates the option? (Reminder: you do not put up any money to enter a futures position.)

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  2. What is the price of the replicating portfolio?

        
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  3. What are the risk-neutral probabilities of the two states? (I recommend that you verify that your answer is consistent with valuation of the futures, the bond, and the option.)

        
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  4. (thought question - answer in a sentence or two of ordinary length) You manage a portfolio for a charitable foundation that receives a gift of futures options. For tax reasons, the foundation is not allowed to trade futures, and therefore it cannot hedge using a replicating portfolio. Furthermore, the terms of the gift do not permit selling the option before maturity. Is the value of the option equal to the value computed above? Why or why not?

        
    
    
    
    
    
    
    
    
    
    
C. Computer Implementation Short Answer: 40 points

The questions in this section are based on the Fixed Income Applet in Homework 2. You should not need to use the complete java program listing, but it is included at the end of the exam in case you would like to have a look at it.

  1. The method cap in F_I_bin computes the price of interest rate caps. This method contains the following for loop which computes the prices through the tree.
    //compute prices back through the tree
    //j is the number of periods from the end
    //i is the number of up moves from the start
        for(j=1;j<=nper;j++) {for(i=0;i<=nper-j;i++) {
            r[i] = r0 + up * (double) (2*i-nper + j);
            prup = 0.5 + prfact*(rbar-r[i]);
            prup = Math.min((double) 1.0,Math.max((double) 0.0,prup));
            val[i] = (prup*val[i+1]+(1.0-prup)*val[i])*Math.exp(-r[i]*tinc)
              + Math.max((double) 0.0,(r[i]-level)*tinc);}}
    
    How would this have to be modified to price a floor instead?
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  2. Here is the method bprice in F_I_bin, which computes the price of a pure discount bond.
      double bprice(double r0) {
        int i,j;
        double prup;
    //initialize terminal payoffs
    //i is the number of up moves
        for(i=0;i<=nper;i++) {
    //  r[i] = r0 + up * (double)(2*i-nper);   not needed for this claim
          val[i] = 1.0;}
    //compute prices back through the tree
    //j is the number of periods from the end
    //i is the number of up moves from the start
        for(j=1;j<=nper;j++) {for(i=0;i<=nper-j;i++) {
            r[i] = r0 + up * (double) (2*i-nper + j);
            prup = 0.5 + prfact*(rbar-r[i]);
            prup = Math.min((double) 1.0,Math.max((double) 0.0,prup));
            val[i] = (prup*val[i+1]+(1.0-prup)*val[i])*Math.exp(-r[i]*tinc);}}
        return(val[0]);}
    
    How would this method have to be modified to price a European call option on the interest rate?
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  3. In F_I_bin, a down-move in interest rates has the same magnitude (but the opposite sign) as an up-move in interest rates. Is the average change in interest rates equal to zero?
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
D. Advanced Questions Short Answer: up to 20 make-up points

These questions are intended to be more challenging conceptual questions. Answering these questions correctly can give you up to 20 points to substitute for points missed in Parts A-C.

  1. How would the cap method in F_I_bin be modified to include a ``down-and-out'' feature that makes it expire immediately should the interest rate ever fall below some level rlower?

    
    
    
    
    
    
    
    
    
    
  2. Moving from actual probabilities to risk-neutral probabilities for an asset like the stock in the binomial model requires us to adjust the mean return to the risk-free rate. Moving to risk-neutral probabilities in an interest-rate model may also require adjustment of the mean change of interest rates. How do we know what should be the new mean change in interest rates?

    
    
    
    
    
    
    
    
    
    
    
    

Supplemental Information

Although you may not need to see the java program file to answer the questions in part C, the file is included for your reference.

Caplet.java

//
// Fixed income binomial cap pricing applet
//
import java.applet.*;
import java.awt.*;

public class Caplet extends Applet {
  F_I_bin c2;
  double caprate,rzero;
  Label capval;
  TextField interest_rate, capped_level;
  public Caplet() {
    setLayout(new GridLayout(3,2));
    add(new Label("Interest rate (%) ="));
    add(interest_rate = new TextField("5",10));
    add(new Label("Capped level (%) ="));
    add(capped_level = new TextField("5.5",10));
    add(new Label("Cap value (per $100 face) ="));
    add(capval = new Label("**********"));
    c2 = new F_I_bin((double) 2.0, (int) 24, (double) 0.01, (double) 0.05,
      (double) 0.125, (int) 5001);
    recalc();}
 public boolean action(Event ev, Object arg) {
    if(ev.target instanceof TextField) {
      recalc();
      return true;}
    return false;}
  double text2double(TextField tf) {
    return Double.valueOf(tf.getText()).doubleValue();}
  void recalc() {
    capval.setText(String.valueOf((float) (100 * c2.cap(text2double(capped_level)/100.0,
      text2double(interest_rate)/100.0))));}}
//
// Fixed-income binomial option pricing engine
//

class F_I_bin {
  int nper;
  double tinc,up,down,sigma,rbar,kappa,prfact;
  double [] r,val;

  public F_I_bin(double ttm,int nper,double sigma,double rbar,double kappa,
      int maxternodes) {
    this.nper=nper;
    tinc = ttm/(double) nper;
    this.sigma = sigma;
    up = sigma*Math.sqrt(tinc);
    this.rbar = rbar;
    this.kappa = kappa;
    prfact = kappa*Math.sqrt(tinc)/(2.0*sigma);
    val = new double[maxternodes];
    r = new double[maxternodes];}

  double bprice(double r0) {
    int i,j;
    double prup;
//initialize terminal payoffs
//i is the number of up moves
    for(i=0;i<=nper;i++) {
//  r[i] = r0 + up * (double)(2*i-nper);   not needed for this claim
      val[i] = 1.0;}
//compute prices back through the tree
//j is the number of periods from the end
//i is the number of up moves from the start
    for(j=1;j<=nper;j++) {for(i=0;i<=nper-j;i++) {
        r[i] = r0 + up * (double) (2*i-nper + j);
        prup = 0.5 + prfact*(rbar-r[i]);
        prup = Math.min((double) 1.0,Math.max((double) 0.0,prup));
        val[i] = (prup*val[i+1]+(1.0-prup)*val[i])*Math.exp(-r[i]*tinc);}}
    return(val[0]);}

  double cap(double level,double r0) {
    int i,j;
    double prup;
//initialize terminal payoffs
//i is the number of up moves
    for(i=0;i<=nper;i++) {
//  r[i] = r0 + up * (double)(2*i-nper);   not needed for this claim
      val[i] = 0.0;}
//compute prices back through the tree
//j is the number of periods from the end
//i is the number of up moves from the start
    for(j=1;j<=nper;j++) {for(i=0;i<=nper-j;i++) {
        r[i] = r0 + up * (double) (2*i-nper + j);
        prup = 0.5 + prfact*(rbar-r[i]);
        prup = Math.min((double) 1.0,Math.max((double) 0.0,prup));
        val[i] = (prup*val[i+1]+(1.0-prup)*val[i])*Math.exp(-r[i]*tinc)
          + Math.max((double) 0.0,(r[i]-level)*tinc);}}
    return(val[0]);}}