第一部分、計算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) 
}