第一部分、計算irr公式,設計function
#cashflow代表首期淨流出和未來各期淨流入
#seqn現金流量期數(從0開始)
#ra和rb分別為折現率的上下限
#rby則為從ra到rb之間折現率的間隔
irr.f <- function(cashflow, seqn, ra = 0.01, rb = 0.2, rby = 0.01){
results <- NULL #results <- NULL 為清空記憶體
n <- length(cashflow) #現金流量的期數
for(irate in seq(ra, rb, by = rby)){ #第一層for迴圈為集合各折現率的淨現值
total <- 0
for(i in 1:n){ #第二層for迴圈為計算某折現率的淨現值
total <- total + cashflow[i] / (1 + irate)^seqn[i] #irr的公式
}
results <- c(results, total) #將這次的total結果與前期的results合併形成新的results
}
plot(seq(ra, rb, by = rby), results, type = "b")
#畫出x軸為各折現率、y軸為淨現值且點和線皆表達的圖形,且點線皆呈現(type = "b")
abline(h = 0) #在高度=0的地方畫一條線
cbind(seq(ra, rb, by = rby), results) #print出首欄為報酬率,次欄為淨現值的結果
}
縮小範圍逼近最接近的折現率
#rep means repeat
irr.f(cashflow = c(-18000, rep(5600, 5)), seqn = 0:5, ra = 0.01, rb = 0.2, rby = 0.01)
## results
## [1,] 0.01 9179.21494
## [2,] 0.02 8395.37325
## [3,] 0.03 7646.36025
## [4,] 0.04 6930.20505
## [5,] 0.05 6245.06936
## [6,] 0.06 5589.23720
## [7,] 0.07 4961.10564
## [8,] 0.08 4359.17621
## [9,] 0.09 3782.04707
## [10,] 0.10 3228.40591
## [11,] 0.11 2697.02330
## [12,] 0.12 2186.74673
## [13,] 0.13 1696.49506
## [14,] 0.14 1225.25343
## [15,] 0.15 772.06855
## [16,] 0.16 336.04446
## [17,] 0.17 -83.66149
## [18,] 0.18 -487.84228
## [19,] 0.19 -877.24462
## [20,] 0.20 -1252.57202
irr.f(cashflow = c(-18000, rep(5600, 5)), seqn = 0:5, ra = 0.16, rb = 0.17, rby = 0.001)
## results
## [1,] 0.160 336.0444605
## [2,] 0.161 293.3530113
## [3,] 0.162 250.8238880
## [4,] 0.163 208.4562812
## [5,] 0.164 166.2493862
## [6,] 0.165 124.2024031
## [7,] 0.166 82.3145372
## [8,] 0.167 40.5849980
## [9,] 0.168 -0.9869996
## [10,] 0.169 -42.4022365
## [11,] 0.170 -83.6614887
irr.f(cashflow = c(-18000, rep(5600, 5)), seqn = 0:5, ra = 0.167, rb = 0.168, rby = 0.0001)
## results
## [1,] 0.1670 40.5849980
## [2,] 0.1671 36.4207218
## [3,] 0.1672 32.2580202
## [4,] 0.1673 28.0968925
## [5,] 0.1674 23.9373378
## [6,] 0.1675 19.7793554
## [7,] 0.1676 15.6229445
## [8,] 0.1677 11.4681044
## [9,] 0.1678 7.3148341
## [10,] 0.1679 3.1631331
## [11,] 0.1680 -0.9869996
#最終可以發現使淨現值=0的折現率為0.168也就是irr折現率。
第二部分、外匯交易資料 整理資料
#匯入資料
fx <- read.table("~/Desktop/時序/fx.txt", quote="\"", comment.char="")
#導入套件
library(zoo)
## Warning: package 'zoo' was built under R version 3.6.2
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
#將欄位重新命名
names(fx) <- c("Date", "Time", "Bid", "Ask", "Bank")
找出各銀行報價次數
# unique為不取出重複的bank名稱
Banks.names <- unique(fx$Bank)
#列出各間銀行報價次數
#fx[, "Bank"],代表從fx這個資料集中取出所有列(,的前面沒東西代表取全部橫列),並取出BANK那欄(,後面代表只取BANK那欄),最後用table函數列出結果。
table(fx[, "Bank"])
##
## ABIV ACBF ADCB AIBM ALBX ALFN ALMA AMRA ANZH ANZN ANZW AREX ATLX
## 113 322 2 4085 2 5147 2 8 7 5 6 8874 544
## BADI BANK BAON BAUA BBIQ BBLH BBMF BCIK BCIO BCIS BCIX BDRH BES3
## 486 231 234 277 1 6 24 10 4 6 981 30 54
## BGFX BGLX BHFX BIET BIGO BILZ BKR1 BKSA BMST BMXL BNL1 BNLA BNPT
## 7091 583 8658 2 1 18 11 45 6 3 3 5 16
## BNYT BNZW BOEB BOID BOIS BPAX BPMX BQNP BRAZ BREL BSAB BSPP CBKH
## 6 3 1 1 2 1735 761 54 461 236 1 2076 4
## CGD1 CHFX CHNY CIBT CLHK CMBK CRE1 CTTI DBFX DDBX DEUA DGHK DGZF
## 307 400 332 584 4 11 273 5 1094 627 1906 10 25
## DKFX DNBO DNBS DRE1 EBAG EMBA ESFO FJBK FLTG GTCX GUTA HSHK IBJQ
## 36 395 3 1679 12 7 55 2 2 4 389 4 71
## ICC1 INGV INGX INTS INVM ISBR KBPH KPBH KRBL KRFZ LBBW LBDB LEOF
## 17 193 10516 1 1 9193 2 7 3 12 760 3 1164
## LUBA MBBX MIDX MINN MPSS MPSW MTKH NABM NAPX NATA NBCM NBFX NBGX
## 187 2 4 39 1 2902 9 4 3 4 25 3 58
## NBJX NBKX NBP1 NEDL NTCC NWHK OBER ONEC PAMX PBNY PETR PKOQ PRIV
## 5209 1 1860 2 32 1432 3 2414 146 4 211 4 15
## RAB1 RBCJ RBCT RBOZ RCBW RVTB RZBA SBIQ SBIX SBLI SCKL SCXD SELY
## 5611 4 1693 1 2 2711 320 12 1 27 3 4 546
## SGOX SKRQ SOBN SPVT STST TDFX TEKT TMFT TRAQ TRBR TUBD UBFX UGBA
## 14303 4 70 77 1 2 191 21 19 7352 3022 7 8
## UNPR UOBX VIZA VUBR VUWX WBCA WFSF WLNY
## 5 219 89 3036 4 2 51 6
#sort函數將各銀行報價次數排序,decresasing = T 代表降冪排序。
sort(table(fx[, "Bank"]), decreasing = T)
##
## SGOX INGX ISBR AREX BHFX TRBR BGFX RAB1 NBJX ALFN AIBM VUBR TUBD
## 14303 10516 9193 8874 8658 7352 7091 5611 5209 5147 4085 3036 3022
## MPSW RVTB ONEC BSPP DEUA NBP1 BPAX RBCT DRE1 NWHK LEOF DBFX BCIX
## 2902 2711 2414 2076 1906 1860 1735 1693 1679 1432 1164 1094 981
## BPMX LBBW DDBX CIBT BGLX SELY ATLX BADI BRAZ CHFX DNBO GUTA CHNY
## 761 760 627 584 583 546 544 486 461 400 395 389 332
## ACBF RZBA CGD1 BAUA CRE1 BREL BAON BANK UOBX PETR INGV TEKT LUBA
## 322 320 307 277 273 236 234 231 219 211 193 191 187
## PAMX ABIV VIZA SPVT IBJQ SOBN NBGX ESFO BES3 BQNP WFSF BKSA MINN
## 146 113 89 77 71 70 58 55 54 54 51 45 39
## DKFX NTCC BDRH SBLI DGZF NBCM BBMF TMFT TRAQ BILZ ICC1 BNPT PRIV
## 36 32 30 27 25 25 24 21 19 18 17 16 15
## EBAG KRFZ SBIQ BKR1 CMBK BCIK DGHK MTKH AMRA UGBA ANZH EMBA KPBH
## 12 12 12 11 11 10 10 9 8 8 7 7 7
## UBFX ANZW BBLH BCIS BMST BNYT WLNY ANZN BNLA CTTI UNPR BCIO CBKH
## 7 6 6 6 6 6 6 5 5 5 5 4 4
## CLHK GTCX HSHK MIDX NABM NATA PBNY PKOQ RBCJ SCXD SKRQ VUWX BMXL
## 4 4 4 4 4 4 4 4 4 4 4 4 3
## BNL1 BNZW DNBS KRBL LBDB NAPX NBFX OBER SCKL ADCB ALBX ALMA BIET
## 3 3 3 3 3 3 3 3 3 2 2 2 2
## BOIS FJBK FLTG KBPH MBBX NEDL RCBW TDFX WBCA BBIQ BIGO BOEB BOID
## 2 2 2 2 2 2 2 2 2 1 1 1 1
## BSAB INTS INVM MPSS NBKX RBOZ SBIX STST
## 1 1 1 1 1 1 1 1
將不同銀行的外匯交易資料儲存成不同的集合
第一個集合為依照各銀行分類取“Date”, “Time”, “Bid”, “Ask”資料
#i代表各間銀行,用for迴圈跑以下過程
#assign函數為自動生成向量,括號內第一個為設定名稱;第二個為設定內容;第三個為envir將輸出東西設定路徑。
#fx[fx$Bank == i,]代表fx資料集中,取橫列=某特定銀行的那幾筆,直欄則取全部
for(i in Banks.names){
assign(i, fx[fx$Bank == i,], envir = .GlobalEnv)
}
#先將日期和時間串再一起(paste函數),再限制其格式(as.POSIXct為規定時間格式函數)並儲存在td向量中。
#paste函數為將物件串連,sep代表中間空格。
td <- as.POSIXct(paste(fx$Date, fx$Time, sep = " "), format = "%m.%d.%Y %H:%M:%S")
第二個集合為將日期和時間合併,並只取合併時間和“Bid”, “Ask”資料
# j代表各間銀行,用for迴圈跑以下過程
# eval函數代表把物件叫回來,在這代表叫回as.symbol(j)這個物件,也就是叫回所有j銀行的"Date", "Time", "Bid", "Ask"的資料。
# zoo函數為將括號內資料合併並轉換成時間序列數據,格式從data.frame轉為zoo。
# z[, -c(1, 2, 5)]代表保留z的所有橫列,刪除第一二五直欄(也就是只留ask bid)。
#assign名字為paste(j, ".ts", sep = ""),內容為w。
for(j in Banks.names){
z <- eval(as.symbol(j))
w <- zoo(z[, -c(1, 2, 5)], as.POSIXct(paste(fx$Date, fx$Time, sep = " "), format = "%m.%d.%Y %H:%M:%S"))
assign(paste(j, ".ts", sep = ""), w, envir = .GlobalEnv)
}
第三個集合為第二個集合去除時間相同的資料
#index(z)為取出z的時間資料
#duplicated函數為觀察數值是否重複,在此即為該時間是否與前一個時間相同,=1代表相同為TRUE不相同為FALSE;反之,=0代表相同為FALSE不相同為TRUE。
#dp為篩選出那些與前一個時間相同的資料(即duplicated = TRUE)
#最終篩選時z[-dp,],將與前一期時間相同的橫列資料刪除
for (j in Banks.names) {
z<-eval(as.symbol(paste(j, ".ts",sep="")))
dp<-which(duplicated(index(z))==1)
assign(paste(j, ".ts2",sep=""),z[-dp,], envir= .GlobalEnv)
}