gpt4 book ai didi

r - 组合时间序列对象和列表:软件包“termstrc”

转载 作者:行者123 更新时间:2023-12-01 23:29:51 27 4
gpt4 key购买 nike

R软件包“ termstrc”是为术语结构估计而设计的,是一种非常有用的工具,但是它要求将数据设置为特别尴尬的格式:列表中的列表。

问题:为了创建运行“ dyncouponbonds”功能所需的重复子列表格式,在R外部或R内部准备和成形数据的最佳方法是什么?

“ dyncouponbonds”命令要求在重复的子列表中设置数据,从而在债券的列表和这些债券的时不变特征(我们称其为“债券清单”)后面附加了这些债券的一些时间特征(价格和累计),并在t + 1到T的时间内复制。

以下是一个期间的列表格式示例。 “ dyncouponbonds”命令要求在所有T时段内,在总括列表中复制此格式。每个时期的ISIN,MATURITYDATE,ISSUEDATE,COUPONRATE都相同。每个时期的价格,应计费用,报废价格和今日价格都会有所不同。

R> str(govbonds$GERMANY)

List of 8
$ ISIN : chr [1:52] "DE0001141414" "DE0001137131" "DE0001141422" ...
$ MATURITYDATE:Class 'Date' num [1:52] 13924 13952 13980 14043 ...
$ ISSUEDATE :Class 'Date' num [1:52] 11913 13215 12153 13298 ...
$ COUPONRATE : num [1:52] 0.0425 0.03 0.03 0.0325 ...
$ PRICE : num [1:52] 100 99.9 99.8 99.8 ...
$ ACCRUED : num [1:52] 4.09 2.66 2.43 2.07 ...
$ CASHFLOWS :List of 3
..$ ISIN: chr [1:384] "DE0001141414" "DE0001137131" "DE0001141422" ...
..$ CF : num [1:384] 104 103 103 103 ...
..$ DATE:Class 'Date' num [1:384] 13924 13952 13980 14043 ...
$ TODAY :Class 'Date' num 13908

最佳答案

这是一个相当高级的数据处理问题。 R有许多强大的数据处理工具,您无需离开R即可准备(公认的相当钝的)dyncouponbonds对象。的确,您实际上不应该这样做,因为从另一种语言中获取结构然后转换为dyncouponbonds将会是更多的工作。

我要确保的第一件事是您对lapply函数非常熟悉。您将充分利用它。您将使用它来创建couponbonds对象的列表,这实际上是dyncouponbonds。但是,创建息票债券对象要困难一些,这主要是因为CASHFLOWS子列表想要每个与债券的ISIN相关的现金流量以及现金流量的日期。为此,您将使用lapply和一些相当高级的下标。子集功能也将派上用场。

这个问题在很大程度上还取决于您从何处获取数据,以及将数据从彭博社中取出并不容易,这主要是因为您需要使用BDS函数和“ DES_CASH_FLOW”字段来追溯每个要绑定的数据得到它的现金流量。我说的是历史,因为如果您使用的是二元债券,那么我假设您将要进行历史收益曲线分析。您需要将BDS函数的“ SETTLE_DT”字段覆盖为使用BDP函数和字段“ FIRST_SETTLE_DT”为债券收到的值,以便从债券寿命开始时获得所有现金流量(否则,它只会从今天返回,这对历史分析没有好处。但是我离题了。如果您不使用Bloomberg,我不知道您将从何处获得此数据。

然后,您需要获取每个债券的静态数据,即到期日,ISIN,息票利率和发行日期。您将需要历史价格和应计利息数据。同样,如果使用Bloomberg,您将为此使用BDP函数以及您在下面的代码中看到的字段以及我包装为bbdh的历史数据函数BDH。再次假设您是Bloomberg用户,下面是代码:

bbGetCountry <- function(cCode, up = FALSE) {
# this function is going to get all the data out of bloomberg that we need for a
# country, and update it if ncessary
if (up == TRUE) startDate <- as.Date("2012-01-01") else startDate <- histStartDate
# first get all the curve members for history
wdays <- wdaylist(startDate, Sys.Date()) # create the list of working days from startdate
actives <- lapply(wdays, function(x) {
bds(conn, BBcurveIDs[cCode], "CURVE_MEMBERS", override_fields = "CURVE_DATE",
override_values = format(x, "%Y%m%d"))
})
names(actives) <- wdays
uniqueActives <- unique(unlist(actives)) # there will be puhlenty duplicates. Get rid of them
# now get the unchanging bond data
staticData <- bdp(conn, uniqueActives, bbStaticDataFields)
# now get the cash flowdata
cfData <- lapply(uniqueActives, function(x) {
bds(conn, x, "DES_CASH_FLOW_ADJ", override_fields = "SETTLE_DT",
override_values = format(as.Date(staticData[x, "FIRST_SETTLE_DT"]), "%Y%m%d"))
})
names(cfData) <- uniqueActives
# now for historic data
historicData <- lapply(bbHistoricDataFields, function(x) bbdh(uniqueActives, flds = x, startDate = startDate))
names(historicData) <- bbHistoricDataFields # put the names in otherwise we get a numbered list
allDates <- as.Date(index(historicData$LAST_PRICE)) # all the dates we will find settlement dates for for all bonds. No posix
save(actives, file = paste("data/", cCode, "actives.dat", sep = "")) #save all the files now
save(staticData, file = paste("data/", cCode, "staticData.dat", sep = ""))
save(cfData, file = paste("data/", cCode, "cfData.dat", sep = ""))
save(historicData, file = paste("data/", cCode, "historicData.dat", sep = ""))
#save(settleDates, file = paste("data/", cCode, "settleDates.dat", sep = ""))
assign(paste(cCode, "data", sep = ""), list(actives = actives, staticData = staticData, cfData = cfData, #
historicData = historicData), pos = 1)


}

我上面使用的bbdh函数是Rbbg库的bdh函数的包装,看起来像这样:

bbdh <- function(secs, years = 1, flds = "last_price", startDate = NULL) {
#this function gets secs over years from bloomberg daily data
if(is.null(startDate)) startDate <- Sys.Date() - years * 365.25
if(class(startDate) == "Date") stardDate <- format(startDate, "%Y%m%d") #convert date classes to bb string
if(nchar(startDate) > 8) startDate <- format(as.Date(startDate), "%Y%m%d") # if we've been passed wrong format character string
rawd <- bdh(conn, secs, flds, startDate, always.display.tickers = TRUE, include.non.trading.days = TRUE,
option_names = c("nonTradingDayFillOption", "nonTradingDayFillMethod"),
option_values = c("NON_TRADING_WEEKDAYS", "PREVIOUS_VALUE"))
rawd <- dcast(rawd, date ~ ticker) #put into columns
colnames(rawd) <- sub(" .*", "", colnames(rawd)) #remove the govt, currncy bits from bb tickers
return(xts(rawd[, -1], order.by = as.POSIXct(rawd[, 1])))
}


国家/地区代码来自将两个字母名称与Bloomberg收益曲线描述相关联的结构:

BBcurveIDs  <- list(PO = "YCGT0084 Index", #Portugal
DE = "YCGT0016 Index",
FR = "YCGT0014 Index",
SP = "YCGT0061 Index",
IT = "YCGT0040 Index",
AU = "YCGT0001 Index", #Australia
AS = "YCGT0063 Index", #Austria
JP = "YCGT0018 Index",
GB = "YCGT0022 Index",
HK = "YCGT0095 Index",
CA = "YCGT0007 Index",
CH = "YCGT0082 Index",
NO = "YCGT0078 Index",
SE = "YCGT0021 Index",
IR = "YCGT0062 Index",
BE = "YCGT0006 Index",
NE = "YCGT0020 index",
ZA = "YCGT0090 Index",
PL = "YCGT0177 Index", #Poland
MX = "YCGT0251 Index")


因此,bbGetCountry将通过以下Bloomberg字段创建4种不同的数据结构,分别称为Actives,staticData,dynamicData和HistoricData:

bbStaticDataFields <- c("ID_ISIN",
"ISSUER",
"COUPON",
"CPN_FREQ",
"MATURITY",
"CALC_TYP_DES", # pricing calculation type
"INFLATION_LINKED_INDICATOR", # N or Y, in R returned as TRUE or FALSE
"ISSUE_DT",
"FIRST_SETTLE_DT",
"PX_METHOD", # PRC or YLD
"PX_DIRTY_CLEAN", # market convention dirty or clean
"DAYS_TO_SETTLE",
"CALLABLE",
"MARKET_SECTOR_DES",
"INDUSTRY_SECTOR",
"INDUSTRY_GROUP",
"INDUSTRY_SUBGROUP")

bbDynamicDataFields <- c("IS_STILL_CALLABLE",
"RTG_MOODY",
"RTG_MOODY_WATCH",
"RTG_SP",
"RTG_SP_WATCH",
"RTG_FITCH",
"RTG_FITCH_WATCH")

bbHistoricDataFields <- c("PX_BID",
"PX_ASK",
#"PX_CLEAN_BID",
#"PX_CLEAN_ASK",
"PX_DIRTY_BID",
"PX_DIRTY_ASK",
#"ASSET_SWAP_SPD_BID",
#"ASSET_SWAP_SPD_ASK",
"LAST_PRICE",
#"SETTLE_DT",
"YLD_YTM_MID")


现在,您可以使用所有这些数据结构来创建优惠券对象:

createCouponBonds <- function(cCode, dateString) {
cdata <- get(paste(cCode, "data", sep = "")) # get the data set
today <- as.Date(dateString)
settleDate <- today
daycount <- 0
while(daycount < 3) {
settleDate <- settleDate + 1
if (!(weekdays(settleDate) %in% c("Saturday", "Sunday"))) daycount <- daycount + 1
}
goodbonds <- subset(cdata$staticData, COUPON != 0 & INFLATION_LINKED_INDICATOR == FALSE) # clean out zeros and tbills
goodbonds <- goodbonds[rownames(goodbonds) %in% cdata$actives[[dateString]][, 1], ]
stripnames <- sapply(strsplit(rownames(goodbonds), " "), function(x) x[1])
pxbid <- cdata$historicData$PX_BID[today, stripnames]
pxask <- cdata$historicData$PX_ASK[today, stripnames]
pxdbid <- cdata$historicData$PX_DIRTY_BID[today, stripnames]
pxdask <- cdata$historicData$PX_DIRTY_ASK[today, stripnames]
price <- as.numeric((pxbid + pxask) / 2)
accrued <- as.numeric(pxdbid - pxbid)
cashflows <- lapply(rownames(goodbonds), function(x) {
goodflows <- cdata$cfData[[x]][as.Date(cdata$cfData[[x]][, "Date"]) >= today, ]
#gfstipnames <- sapply(strsplit(rownames(goodflows), " "), function(x) x[1]) dunno if I need this
isin <- rep(cdata$staticData[x, "ID_ISIN"], nrow(goodflows))
cf <- apply(goodflows[, 2:3], 1, sum) / 10000
dt <- as.Date(goodflows[, 1])
return(list(isin = isin, cf = cf, dt = dt))
})
isinvec <- unlist(lapply(cashflows, function(x) x$isin))
cfvec <- as.numeric(unlist(lapply(cashflows, function(x) x$cf)))
datevec <- unlist(lapply(cashflows, function(x) x$dt))
govbonds <- list(ISIN = goodbonds$ID_ISIN,
MATURITYDATE = as.Date(goodbonds$MATURITY),
ISSUEDATE = as.Date(goodbonds$FIRST_SETTLE_DT),
COUPONRATE = as.numeric(goodbonds$COUPON) / 100,
PRICE = price,
ACCRUED = accrued,
CASHFLOWS = list(ISIN = isinvec, CF = cfvec, DATE = as.Date(datevec)),
TODAY = settleDate)
govbonds <- list(govbonds)
names(govbonds) <- cCode
class(govbonds) <- "couponbonds"
return(govbonds)
}


请仔细查看现金流<-lapply ...函数,因为这是您创建子列表的地方,并且是问题答案的核心,尽管当然,如何完成很大程度上取决于您的拥有情况决定建立中间数据结构,我只给了您一种可能性。我意识到我的答案很复杂,但是问题很复杂。您所需的所有代码也不在此答案中,缺少一些帮助程序功能,但是如果您与我联系,我很乐意提供它们。当然,核心功能的骨架就在这里,实际上,很多问题是首先获取数据并进行适当地结构化。您正确地猜想每个键的某些数据是静态的,某些数据是动态的,而某些则是历史的。因此,中间数据结构的维对于不同部分的优惠券对象是不同的。尽管我已经为每个列表/数据框使用了单独的列表/数据框,并根据需要通过绑定ID进行链接,但是如何表示取决于您。

上面的函数将使用一个日期字符串,因此您可以使用上述lapply对每个历史数据点执行此操作,嘿“ presto”,dyncouponds:

spl <<- lapply(dodates, function(x) createCouponBonds("SP", x))
names(spl) <<- lapply(spl, function(x) x$SP$TODAY)
class(spl) <- "dyncouponbonds"


你去。你自找的....

如果您不使用Bloomberg,那么您的输入数据结构将大不相同,但是,正如我刚开始所说,请非常熟悉lapply和sapply。显然,有许多其他方法可以解决此问题,但以上方法适用于彭博社。如果您理解此代码,那么您一定会知道您正在为其他数据源做什么。

最后请注意,来自findata.org的 Rbbg包用于与Bloomberg交互。

关于r - 组合时间序列对象和列表:软件包“termstrc”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com