c++ 財務程式設計 - introduction

18

Click here to load reader

Upload: ycliutw

Post on 14-Nov-2014

69 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: C++ 財務程式設計 - Introduction

1

C++ and Quantitative Finance

交通大學

資訊與財金管理學系助理教授戴天時 資訊博士

[email protected]

2

課程簡介

Black-Scholes formula, 隱含波動度, 新奇選擇權評價

函式的撰寫及呼叫2/23

計算零息利率, 遠期利率, static spread,矩陣計算,投資組合的風險值估計

陣列結構2/16

債券價格和存續期間計算

使用二分法計算 IRRYield spread 的計算

程式流程控制及迴圈

1/26

現值的計算

商業本票價格計算

C++語言概論1/19

實務演練主題時間

Page 2: C++ 財務程式設計 - Introduction

3

課程資源

• 範例程式:請參見硬碟的資料夾

• 參考書目或講義:– C++財務程式設計 戴天時 (2005)證券暨期貨發展基金會

ISBN 986-7737-51-2

4

Acknowledgement

• 感謝下列人士為改寫本教材所投入的心力

C++ DLL的建立以及如何使用Excel呼叫DLL,XLL的撰寫

章宇傑

邱俊淵

王釧茹

台大資訊所

台大資訊所

台大資訊所

Quasi-Monte Carlo simulation

陳宜廷台大財金所

AMM許智睿台大資訊所

Page 3: C++ 財務程式設計 - Introduction

5

C++語言概論

C++語言簡介編譯程式簡介

撰寫你的第一個C++程式資料型態和運算式

程式檢驗和除錯

實務演練:現值運算,商業本票價值計算算術運算式的簡寫

邏輯運算式

6

C++ 語言歷史簡介• C

–從BCPL 和 B這兩個語言演變而來–用來開發作業系統

–最重要的程式語言

• C++–由Bell Labs 的Bjarne Stroustrup開發

–包含C語言的架構–加入物件導向的概念 程式開發更快速

–先學會C再進入C++

Page 4: C++ 財務程式設計 - Introduction

7

C++語言和BASIC和 JAVA比較

•執行較慢

•易於撰寫網頁及網路程式

•可有效降低網頁伺服器負擔

•易入手

•Excel 提供VBA(執行效率慢)

•執行效率高

•功能強大

•透過CGI支援動態網頁功能

JAVABasicC++

8

C++程式開發流程

• 1.編輯程式• 2.前置處理

(Preprocess)

• 3.編譯• 4.聯結函式庫• 5.呼叫程式執行

Preprocessor programprocesses the code.

Loader puts program in memory.

CPU takes eachinstruction and executes it, possibly storing new data values as the program executes.

Compiler creates object code and storesit on disk.

Linker links the objectcode with the libraries

Loader

Primary Memory

Compiler

Editor

Preprocessor

Linker

Primary Memory

.

.

.

.

.

.

.

.

.

.

.

.

Disk

Disk

Disk

CPU

Disk

Disk

Page 5: C++ 財務程式設計 - Introduction

9

編譯程式介紹

• 使用程式: Visual Studio 中的Visual C++– Developed by Microsoft–整合Basic, C, FoxPro 等開發環境

• Visual C++–支援C,C++等程式撰寫語法–支援Win SDK, MFC

• 視窗程式設計

• 本課程著重在使用C++程式撰寫財務數值程式

10

使用VC撰寫第一個程式(建立一個新的Project)

• 開啟一個新的 project– File->New->Project-> Win32ConsoleApplication

–填入 Project Name 和該Project所在目錄• 注意:VC會在該目錄建立Workspace等相關檔案,所以不同的project請放在不同的目錄中

–透過Wizard選擇,建立Project.

–在Project中加入一個Source Code File• 副檔名為 “.cpp” 例如: First.cpp

Page 6: C++ 財務程式設計 - Introduction

11

參照圖例

12

加入新的檔案到 Project中

Page 7: C++ 財務程式設計 - Introduction

13

使用VC撰寫第一個程式(編輯Source Code File)

#include<stdio.h>void main(){

//這是註解,編譯程式不處理printf("The first program in your C++ \n");/*註解:列印到螢幕

*/printf("and quantitative finance class\n");

}

引用函式庫:stdio(呼叫printf)

主程式:取名為 main

主程式開始: {

主程式結束: }

列印字串:使用printf

字串使用”包住

\n代表換行

用分號;來分開指令

見 FirstProgram project

14

使用VC撰寫第一個程式(編譯並執行你的程式)

• 建立可執行檔– Build-> Build **.exe

• 程式語法錯誤的訊息及處理:–見下方名稱為“Build”的小視窗–根據其訊息修改程式–重新編譯

• 程式執行– Build-> Execute **.exe

Page 8: C++ 財務程式設計 - Introduction

15

程式編譯的執行畫面

16

程式產生錯誤訊息的畫面

第8行有程式錯誤

更改第8行的程式錯誤

Page 9: C++ 財務程式設計 - Introduction

17

常見錯誤訊息

fatal error C1004: unexpected end of file found漏打右大括弧 }

error C2001: newline in constant字串結束漏打分號

error C2065: 'printaf' : undeclared identifierprintf函式名稱拼錯

syntax error : missing ';'分號漏打

Compiling...FirstProgram.cppLinking...LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/FirstProgram.exe : fatal error LNK1120: 1 unresolved externals(意即找不到主函式)

主函式名字(main)拼錯

Cannot open include file: 'studio.h': No such file or directory('studio.h': 代表拼錯的名字)

函式庫(stdio)名字拼錯

invalid preprocessor command 'inclfude'('inclfude'代表拼錯的名字)

include拼錯

顯示訊息錯誤

18

課堂演練

• 開啟一個新的project• 使用printf來列印出自己的工作單位和名稱例: printf(“交大資財\n”);

printf(“戴天時\n”);

Page 10: C++ 財務程式設計 - Introduction

19

變數的資料型態

• 變數可視為一塊可儲存資料的記憶體空間• 變數包含了變數的名稱和資料型態• 常見資料型態

• 變數需經宣告才可使用:int a,b,c;

倍精準浮點數浮點數整數字元意義

doublefloatintchar型態

宣告三個整數 a ,b, c

20

資料的輸入輸出

• 輸入:使用scanf, 輸出: 使用 printf

• 輸入兩個整數,輸出這兩個數的和

%lf%f%d%c符號

doublefloatintchar型態

int a,b;char c; scanf("%d",&a);printf(“a=%d\n",a);printf(“b=%d\n”,b);

宣告兩個整數 a ,b

輸入 a “%d”代表整數結果輸出

宣告變數 c

b的值尚未初始化,為一亂數

Warning message

見 Variable project

Page 11: C++ 財務程式設計 - Introduction

21

IEEE standards for floating-point representation

+ 2^6 x 1.01000111001

22

課堂演練

• 宣告一倍精密度浮點數 x.– double x;

• 用 scanf() 輸入 x–比較

scanf(“%lf”, &x);printf(“%lf”,x);

scanf(“%f”,&x);printf(“%lf”,x);

的輸出結果

Page 12: C++ 財務程式設計 - Introduction

23

資料型態和變數值的關係

• b=2.4;printf(b=%d",b);c=300;printf(c=%d",c);

double表示用所占空間大小為64bit的浮點數

8double

float表示用所占空間大小為32bit的浮點數

4float

long或是int皆表示用所占空間大小為32bit的整數

4int(或 long)

short代表short integer,表示用所占空間大小為16bit的整數

2short

表示字元1char

簡述大小(位元組)資料型態

b的值為2 (小數點後捨去)

c的值不為300 (超出儲存空間)

2^8=256 => -128~127

24

算術與邏輯運算式• C++允許算術運算以及邏輯運算式出現在同一個算式中

– 算術運算• 加(+), 減(-), 乘(*), 除(/), 取餘數 (%)• double d,e;• d=1+a*b%2;• 運算可分成浮點數和整數的計算

• e=2/3; • e=2.0/3;• e=a/b;• e=(double) a/b;

= 為指定運算元,將 1+a*b%2的值放入 d

先算 a*b, 再算 (a*b)%2,+ 最後計算

整數除法

型態強制轉換, 可寫成 e=double(a)/b;

Don’t write 3=1+2

Page 13: C++ 財務程式設計 - Introduction

25

課堂演練

程式碼比較• Case 1:

– double a=2.4;

– double b=1/2*a; – b=?

• Case 2:– double a=2.4;

– double b=a*1/2; – b=?

26

折現值計算

• 列出運算式: (折現值的計算)–假定利率r%,考慮一年後支付d元,兩年後支付e元的現金流量的現值

• 程式範例如下:

• 程式語法正確,但是計算結果不正確–程式除錯(debug)

int d,e,f; float r;scanf("%d",&d);scanf("%d",&e);scanf("%f",&r);f=d/(1+r);f=f+e/((1+r)*(1+r));printf("Present value=%f",f);

輸入現金流 d,e 和利率 r

計算d的現值

加上e的現值列印結果

見PV project

Page 14: C++ 財務程式設計 - Introduction

27

程式單步執行檢驗和除錯

• Build-> Start Debug-> …• 熱鍵 F10• 單步執行,並使用watch 檢驗計算結果• 找出錯誤部分並修改程式

– f宣告為整數,無法儲存小數

–修改f的資料型態

• 重新執行程式

f=d/(1+r);f=f+e/((1+r)*(1+r));

28

程式除錯的畫面

自動顯示每個變數的數值可手動加入欲觀察之變數

Page 15: C++ 財務程式設計 - Introduction

29

課堂演練:程式除錯

商業本票價值計算

• 由企業所發行無擔保的短期債券

• 根據企業在市場上的信用等級以及當時的市場利率折價發行

• CommericalPaper project程式– 輸入天數,發行利率– 計算本票價格

• 程式結果不正確 使用上述除錯工具除錯

)365

發行天期發行利率100000(100000 格面額十萬元商業本票價 ××−=

30

算術與邏輯運算式

算式的簡寫

• a+=b a=a+b;– a-=b; a*=b; a/=b; a=a-b; a=a*b; a=a/b;

• a+=(b-a); a=a+b-a; a=b;• a++ a=a+1;• a-- a=a-1;

請參見Variable project Part 4

Page 16: C++ 財務程式設計 - Introduction

31

算術與邏輯運算式

– 邏輯運算(常用來處理程式的流程控制)– non zero TRUE(1), zero FALSE(0)

(!)

(&&)

(||)

32

算術與邏輯運算式

• 邏輯算式的撰寫

double rate1=0.011, rate2=0.007;(rate1<0.01)&&(rate1>0.005)

• Range notes

(rate1<0.01)||(rate2<0.01)• Barrier option

Page 17: C++ 財務程式設計 - Introduction

33

算術與邏輯運算式

• 計算的優先順序

Operators Associativity Type ++ -- + - ! (type) right to left unary

* / % left to right multiplicative + - left to right additive < <= > >= left to right relational == != left to right equality && left to right logical AND || left to right logical OR ?: right to left conditional = += -= *= /= %= right to left assignment

, left to right comma

Fig. 4.16 Operator precedence and associativity.

Ex: Z=x+++y++;

34

算術與邏輯運算式

混合計算• x=6, y=5• (x>=5)&&y<10• !(x>10)+(!y)• !x>10+!y

Page 18: C++ 財務程式設計 - Introduction

35

課堂演練

• 撰寫程式,比較下列運算式

double rate1=0.008;a=(rate1<0.01)&&(rate1>0.005)a=0.005<rate1<0.01