36
Lecture 14 Xiaoguang Wang STAT 598W March 11th, 2014 (STAT 598W) Lecture 14 1 / 36

Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Embed Size (px)

Citation preview

Page 1: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Lecture 14

Xiaoguang Wang

STAT 598W

March 11th, 2014

(STAT 598W) Lecture 14 1 / 36

Page 2: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Outline

1 Some other terms: Namespace and Input/Output

2 Armadillo C++

3 Application

(STAT 598W) Lecture 14 2 / 36

Page 3: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Outline

1 Some other terms: Namespace and Input/Output

2 Armadillo C++

3 Application

(STAT 598W) Lecture 14 3 / 36

Page 4: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Namespace

Namespaces allow to group entities like classes, objects and functionsunder a name.

Format:

namespace identifier

{

entities

}

identifier: any valid identifier;entities: the set of classes, objects and functions that are includedwithin the namespace.

(STAT 598W) Lecture 14 4 / 36

Page 5: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Namespaces

Example:

namespace myNamespace

{

int a, b;

}

To access the previous variables from outside myNamespace we canwrite:

myNamespace::a

myNamespace::b

(STAT 598W) Lecture 14 5 / 36

Page 6: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Namespaces: Example

The functionality of namespaces is especially useful in the case that thereis a possibility that a global object or function uses the same identifier asanother one, causing redefinition errors.

Example:

// namespaces

#include <iostream>

using namespace std;

namespace first

{

int var = 5;

}

(STAT 598W) Lecture 14 6 / 36

Page 7: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Namespaces: Example (Continued)

namespace second

{

double var = 3.1416;

}

int main () {

cout << first::var << endl;

cout << second::var << endl;

return 0;

}

(STAT 598W) Lecture 14 7 / 36

Page 8: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Key Word Using: Example 1

The keyword using is used to introduce a name from a namespace into thecurrent declarative region.

Example:

// using

#include <iostream>

using namespace std;

namespace first

{

int x = 5;

int y = 10;

}

(STAT 598W) Lecture 14 8 / 36

Page 9: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Key Word Using: Example 1 (Continued)

namespace second

{

double x = 3.1416;

double y = 2.7183;

}

int main () {

using first::x;

using second::y;

cout << x << endl;

cout << y << endl;

cout << first::y << endl;

cout << second::x << endl;

return 0;

}

(STAT 598W) Lecture 14 9 / 36

Page 10: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Key Word Using: Example 2

The keyword using can also be used as a directive to introduce an entirenamespace.

Example:

// using

#include <iostream>

using namespace std;

namespace first

{

int x = 5;

int y = 10;

}

(STAT 598W) Lecture 14 10 / 36

Page 11: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Key Word Using: Example 2 (Continued)

namespace second

{

double x = 3.1416;

double y = 2.7183;

}

int main () {

using namespace first;

cout << x << endl;

cout << y << endl;

cout << second::x << endl;

cout << second::y << endl;

return 0;

}

(STAT 598W) Lecture 14 11 / 36

Page 12: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Key Word Using: Example 3

using and using namespace have validity only in the same block in whichthey are stated or in the entire code if they are used directly in the globalscope.

Example:

// using namespace example

#include <iostream>

using namespace std;

namespace first

{

int x = 5;

}

(STAT 598W) Lecture 14 12 / 36

Page 13: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Key Word Using: Example 3 (Continued)

namespace second

{

double x = 3.1416;

}

int main () {

{ using namespace first;

cout << x << endl;}

{ using namespace second;

cout << x << endl;}

return 0;

}

(STAT 598W) Lecture 14 13 / 36

Page 14: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Namespaces

Namespace alias: We can declare alternate names for existingnamespaces according to the following format:

namespace new_name = current_name;

Namespace std: All the files in the C++ standard library declare all ofits entities within the std namespace. That is why we have generallyincluded the using namespace std.

(STAT 598W) Lecture 14 14 / 36

Page 15: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

File Input and Output

The fstream header includes the following classes:

ofstream : Stream class to write on files

ifstream : Stream class to read from files

fstream : Stream class to both read from and write on files

Once an object of one of the above classes types is declared andassociated with a file, it can be used with the insertion operator � or theextraction operator � in much the same way as cout or cin.

(STAT 598W) Lecture 14 15 / 36

Page 16: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Example: Basic file operations

#include<fstream>

using namespace std;

int main(){

ofstream myfile;

myfile.open ("example.txt");

myfile << "Writing this to a file.\n";

myfile.close();

return 0;

}

(STAT 598W) Lecture 14 16 / 36

Page 17: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Opening the file

The line:

myfile.open ("example.txt");

opens a file called example.txt and assigns to it the output streamobject myfile.

The ”open” function can take a second argument, the mode, whichhelps determine its behaviour. Each stream class has the mode set bydefault if no second argument is given.

Warning: When I ran it, the ofstream overwrote the file each time. Ifwe had just wanted to append text to the end of the file, we wouldneed to specify the mode when we open the file as

myfile.open ("example.txt", ios::app);

If the program fails to open the file, it may not explicitly give anerror. We can check whether it was successful by using

myfile.is_open()

which will return true if and only if myfile currently corresponds to anopen file.

(STAT 598W) Lecture 14 17 / 36

Page 18: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Data input and output

Additionally, fstream objects also come with several boolean functionsto help control data flow and detect errors.

bad() : Returns true if read/write operation fails.fail() : Returns true if read/write operation fails, or if a formattingerror occurs.eof() : Returns true if read operation has reached the end of the file.good() : Returns false if any of the above is true.

Once finished, you should always close the file with the close()function. In the case of an output stream, text isnt written to the fileimmediately when you write to the stream, but rather is stored in abuffer. The call to close() signals the program to finish writing to thefile.

(STAT 598W) Lecture 14 18 / 36

Page 19: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Another Example for reading data

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

int main () {

string line;

ifstream myfile ("example.txt");

if (myfile.is_open())

{ while ( getline (myfile,line) )

{

cout << line << ’\n’;

}

myfile.close();

}

else cout << "Unable to open file";

return 0;

} (STAT 598W) Lecture 14 19 / 36

Page 20: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Outline

1 Some other terms: Namespace and Input/Output

2 Armadillo C++

3 Application

(STAT 598W) Lecture 14 20 / 36

Page 21: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Introduction

Developed by the National Information and CommmunicationsTechnology of Australia (NICTA) and from contributions around theworld. (Conrad Sanderson)

GNU Software.

C++ linear algebra library that outperforms NEWMAT and IT++ inspeed and ease of use.

Armadillo aims to replicate most of the MATLAB’s operations withinC++.

(STAT 598W) Lecture 14 21 / 36

Page 22: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

C-make installation

We need to install cmake first:http://www.cmake.org/cmake/resources/software.html.

Download cmake-2.8.10.2.tar.gz in your home directory.

Extract the installation files:

tar xzf cmake-2.8.10.2.tar.gz

Create a new folder in your home directory (say ~/opt) in order tocontain library and header files.

Go to the installation folder and type:

./bootstrap --prefix=~/opt

make

make install

(STAT 598W) Lecture 14 22 / 36

Page 23: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Installation

Download the most current version of Armadillo(http://arma.sourceforge.net/download.html) in your homedirectory.

Follow the installation procedures in the same webpage (depending onyour operating system). In class we will perform the most basicinstallation of Linux (without using LAPACK and BLAS libraries).

Untar the installation file:

tar xzf armadillo-3.800.0.tar.gz

Go to the installation folder and type:

~/opt/bin/cmake .

make

make install DESTDIR=~/opt

(STAT 598W) Lecture 14 23 / 36

Page 24: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Example 1

#include <iostream>

#include "armadillo"

using namespace std;

using namespace arma;

int main()

{

mat A = randu<mat>(4,5);

mat B = randu<mat>(4,5);

cout << A*trans(B) << endl;

return 0;

}

Run it as (assume the code file named as ”name.cpp” and the outputnamed as ”name”):

g++ -Wall -g -I ~/opt/usr/include name.cpp -o name -O2

(STAT 598W) Lecture 14 24 / 36

Page 25: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Matrix class

See http://arma.sourceforge.net/docs.html for more details.

mat type: matrix containing double or integer numbers.

It admits several constructors: mat(), mat(n_rows,n_cols), etc.

Matrix attributes: .n_rows(), .n_cols(), .n_elem().

The elements are accessed and assigned with (i,j) operator. Notethat the index starts at 0.

Element injection: A << 1 << 2 << 3 << endr;

(STAT 598W) Lecture 14 25 / 36

Page 26: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Some operators

Overloaded operators: +,-,*,%,==,¿=,!=.

.trans():transpose, eye(): set an identity matrix.

Cholesky decomposition: chol(mat M).

You can save memory declaring upper and lower triangular matrices:trimatu and trimatl.

Extract columns or rows from a matrix: A.col(k), A.row(k).

(STAT 598W) Lecture 14 26 / 36

Page 27: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Exercise

Armadillo has the function .randn() to generate standard normalrandom variables.

Generate samples of a multivariate normal random vector with meanµ and covariance matrix Σ, where Σ is positive definite.

If you don’t have LAPACK installed (e.g. “expert” server), let’sassume we have L such that Σ = LLT .

(STAT 598W) Lecture 14 27 / 36

Page 28: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

A good tutorial document

To learn more about Armadillo, another good material apart from itsofficial website is the document from the following link:

http://www.ngssc.se/courses/specialized-courses

/advanced-programming/cpp_part3_v2.pdf

(STAT 598W) Lecture 14 28 / 36

Page 29: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Outline

1 Some other terms: Namespace and Input/Output

2 Armadillo C++

3 Application

(STAT 598W) Lecture 14 29 / 36

Page 30: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

MonteCarlo simulation

In the Black-Scholes model we assume that the underlying assetfollows a geometric Brownian motion:

dSt = µStdt + σStdWt

where µ and σ > 0 are constants, Wt is a standard Brownian Motionand S0 = s.

Using Ito formula, the previous SDE admits the solution:

St = se

(µ−σ2

2

)t+σWt

(STAT 598W) Lecture 14 30 / 36

Page 31: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

MonteCarlo simulation

Under the risk-neutral measure (Q) we can simulate an entire path ofSt with the following scheme:

Si+1 = Si exp (r − σ2

2)δt + σ

√δtεi+1

where S0 = s and ε. ∼ N(0, 1) (iid)

Then given a payoff function Φ(·), the price of a derivative with suchpayoff at time 0 is:

Π = EQ [e−rTΦ(ST )]

(STAT 598W) Lecture 14 31 / 36

Page 32: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

MonteCarlo Simulation

Then we can use the estimate:

Π̂ =1

M

M∑i=1

e−rTΦ(ST (i))

where ST (i) is the i-th sample path in our simulation.

We can reduce the variance in our simulation by using antitheticvariates.

(STAT 598W) Lecture 14 32 / 36

Page 33: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Variance improvements

Improve your rate of convergence by using antithetic variables: usexi ∼ N(0, 1) and −xi to simulate the GBM and compute (for eachone) the simulated price. Then take the average price of bothsimulations.

You can improve the rate of convergence using control variates aswell.

(STAT 598W) Lecture 14 33 / 36

Page 34: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Exercise

Construct a namespace called “BS” (Black Scholes). It will includethe following classes:

A base class (Black-Scholes European)(BSEur) with the followingmembers:

Constructors.Destructor.Parameters: S ,K , r , σ,T and type of option.Black Scholes price.Function that displays the price on the screen.

A derived class from BSEur (say MCarlo) with the followingmembers:

Constructors.Destructor.Parameters: number of iterations.MonteCarlo price.Function that displays the price on the screen.

(STAT 598W) Lecture 14 34 / 36

Page 35: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Exercise

A derived class from Mcarlo (say MCAnti) with the followingmembers:

Constructors.Destructor.MonteCarlo price (using Antithetic variables).Function that displays the price on the screen.

Test your code in C++.

Implement your class in R using Rcpp, and compare the samplingdistribution of your two estimates.

(STAT 598W) Lecture 14 35 / 36

Page 36: Lecture 14 - Purdue University - Department of Statistics ... · PDF fileOutline 1 Some other terms: Namespace and Input/Output 2 Armadillo C++ 3 Application (STAT 598W) Lecture 14

Some recomendations

Use Armadillo for your random number generation.

Don’t forget to define your derived-class constructors as inlinefunctions.

(STAT 598W) Lecture 14 36 / 36