Optimal Investment, Growth Options and Security Returns

Author(s)

·  Jonathan Berk

·  Richard Green

·  Vasant Naik

Reference

Abstract

As a consequence of optimal investment choices, firms' assets and growth options change in predictable ways. Using a dynamic model, we show that this imparts predictability to  changes in a firm's systematic risk, and its expected return. Simulations show that the model simultaneously reproduces: (i) the time series relation between the book-to-market ratio and asset returns, (ii) the cross-sectional relation between book to market, market value and return, (iii) contrarian effects at short horizons, (iv) momentum effects at longer horizons and (v) the inverse relation between interest rates and the market risk premium.

Download the paper(as an Adobe Acrobat PDF file.)

If you are having trouble reading the file you are probably not using Version 3.0 or later of the reader. You can solve this problem by downloading the latest verion of the reader from Adobe.)
 

Presentations

If you were at any of the following presentations and want a copy of the slides, click on the appropriate link:
 

Calling the Simulation Programs from within Matlab

Windows Machine

 

All of the code used in the paper has been implemented as matlab function calls and is freely avialable as executable Matlab calls.  This implementation was only undertaken recently.  The numbers in the paper were generated using a c program that is also available (see below).  There are three different Matlab calls:

 

Matlab Function Call

Description

Files

getonej
This function generates the value of J* and Je* as defined in the paper for a given current interest rate and other parameter values

getonej.dll
getonej.m (help file)

getj
This function generates as grid to approximate J* and Je* as defined in the paper.  getj.dll
getj.m (help file)
gendata
This function takes the grid generated by getj and uses it to generate a data set. gendata.dll
gendata.m (help file)

To download this, click on one of the following links:

To use these files you will need to have a windows (32 bit) based machine (if you are an academic user and are not using a windows based machine, see below).  Then simply copy each file into a convenient directory.  Then run Matlab from within that directory.  All three function come with help files which should be put in the same directory as the other files.  To read the help file, just type "help X" in Matlab, where x is one of the above function names. 

For your convenience, see file "hl.m" for some some sample Matlab code that uses the bottom two functions.  The file "testonej.m" contains sample code that uses getonej. The file "testall.m" contains sample code that runs all three functions, together with the output (file: testallout.txt) that I produced on my machine. This code takes about 1 minute to run on my Pentium II.  Bear in mind that if you are running on Unix, since the random number generator is not identical, not all the output of gendata will be identical to what I got.


Non-Windows Machine

If you are not using a Windows machine, or you would like to alter the code, you can still use these matlab calls so long as you are not using the code for any commercial purpose. The source code can only be freely used for academic purposes. It is expressly forbidden to use (or even download) the source code for any commercial purpose, including research at a commercial organization, without permission.  If you satisfy this requirement, then you can compile the function calls yourself from within Matlab on your machine.  I suggest taking a look at the online matlab manual that describes how to do this.  You should also look at the comments at the begining of each source file. 

To download this, click on one of the following links:

To compile each of the calls you need to execute the following command in matlab

mex X Y bgnfunctions.c win.c

where X and Y are filenames that depend on which call you are compiling (see below).  You will probably not need win.c on unix, depending on your compiler, --- see the notes in the relevant source files.  You will need the following header (header.h). Just put this file in the same directory as the other files. The values of X and Y for each call is given below:
 

Matlab Call

X

Y

getonej

getonej.c

gateway_getonej.c

getj

getj.c

gateway.c

gendata

gendata.c

gateway_gend.c

If this all works you will be able to call any of these function in matlab by just typing the name.  Put the above help files into the directory to get help on how to use the functions.  One suggestion, once you are done, run "testall.m". This Matlab file should produce the output as shown in "testallout.txt".  This code takes about 1 minute to run on my Pentium II.  Bear in mind that  if you are running this on Unix, since the random number generator is not identical, not all the output of gendata will be identical to what I got.

Running the Simulations Without Matlab

Section 6 in the paper contains the results of a simulation exercise. The process involved programming the model in the paper, and then running this program to generate simulated data. This program is publically available. It comes in three forms:

 

Executable Code (for Windows NT/95 --- optimized to run on a Pentium Pro)

This is available to anyone who wants to run the code and may be used for any purposes. ("bgnold.exe" contains the the original code run in the paper --- see note below.)

 

To download this, click on one of the following links:

 

executables.exe (Self extracting archive)
executables.zip
(Zip file)

 

Source Code

The source consists of two files, "bgn.c" and "win.c". The first file is the main file. You may need to link in the second file depending on what c compiler you use to compile the code. You will be able to tell by looking at the code (or trying to compile without win.c). The source code can only be freely used for academic purposes. It is expressly forbidden to use (or even download) the source code for any commercial purpose, including research at a commercial organization, without permission. (The original code used was "bgnold.c" -- see note below.)  If you are thinking about making changes to the code, you should consider using the matlab calls, since this code is more readable.

 

To download this, click on one of the following links:

 

source.exe (Self extracting archive)
source.zip
(Zip file)

 

 

Matlab Calls

The functions can be called from within Matlab as matlab functions.  See below for more details.


Important Note:In the original code an approximation was used to speed up execution.  It has since become apparant that this approximation was not as accurate as earlier anticipated and so, since publication, the above code has been changed to incorporate a more accurate approximation (at some cost to speed).  For more details consult the documentation at the beginning of bgn.c.



Once you have downloaded the code, you need an input file to run the code:

To download this, click on one of the following links:

input_tex.exe (Self extracting archive)

input_tex.zip (Zip file)

As you can see from the input file it is also TeXable (if you do not know what this means ignore it). By TeXing the file you are able read the inputs to the program easier. Here is an example of the TeXed input file used in the paper. There are a few things to note about the input file. It takes approximately 24 hours to run one simulation in the paper on a Pentium Pro 200. However, by reducing the tolerance to 0.01, you can cut this to 1.5 hours. You can further reduce the execution time to a matter of minutes if you change any parameter that does not affect the value of the growth options (and have already run the program). In this case change TOG from 0 to 1 and the value of growth will be read from the file GRID5.DAT (saved from the previous run). You will notice that the program also saves other intermediate files, like econ.dat. This file contains the innovations in the kernal and interest rate processes and so allows two separate runs with the same pricing and interest rate processes. To read in this file change dep_run from 0 to 1. The type of output is determined by the variable math. The output can either be in regular space separated columns (formatted for matlab) or in a form that can be read directly into mathematica (formatted for mathematica). The program can potentially produce a large amount of output. When the output gets very large it automatically just produces only the files required to generate the statistics in the paper. If you want only market information set math=2. The file market.out is always space seperated regardless of what math is set to. The output of the program itself contains a detailed description of the output files.
 

Generating the Fama-French Histograms

The above program is used to generate the Fama-French histograms (Figures 2-5) in the paper.  The actual process of  compiling the output of each run (i.e., doing the FF regressions and saving the output) and then producing the histogram is quite intensive.  Although the histogram itself is generated by Mathematica, the data compilation was done using Matlab. On a windows machine the (only) way to do this is to repeatedly call the c program from Matlab. This Matlab program should be easy to customize for other machines/applications and is available to anybody who wants to use it.

 

To download this, click on one of the following links:

ffbeta.exe (Self extracting archive)

ffbeta.zip (Zip file)

 

Generating the Momentum/Contrarian Plot

The momentum/contrarian plot (Figure 6) was generated by also repeatedly running the c program. This code calls, "hret.m",  another piece of Matlab code, this code is included as well.  Both of these Matlab programs should be easy to customize for other machines/application  and is available to anybody who wants to use it.
 

To download this, click on one of the following links:

hl_hret.exe (Self extracting archive)

hl_hret.zip (Zip file)


 

I would greatly appreciate it if you could email me if you download either the paper or the code.