[R-sig-finance] 3-d visualisation of yield curves?

Pfaff, Bernhard Bernhard.Pfaff at drkw.com
Tue Aug 31 09:00:06 CEST 2004


Hello Ajay,

you can achieve this task with persp() and an auxiliary function trans3d()
(provided in the example section of the persp() documentation). The function
trans3d() transforms the output of persp() into a plane and this is needed
for the labeling adjustment of the axis.
It is kind of fiddling to get the labels correctly positioned but it works
along the lines:

pmat <- persp(y, x, as.matrix(ypper), xlab="Last 100 periods",
ylab="Maturities (months)", zlab="Yields", zlim=c(3,6), theta=130, phi=15,
col="Seagreen", box=T, ticktype="detailed", shade=0.3, ltheta=270, lphi=30,
r=sqrt(3), expand=0.5, main="Historical yield curves", axes=FALSE)
# Draw x-axis labels; only draw some of the labels to avoid overlap
subset <- seq(lastobs-51,lastobs-1, length=5)
par(xpd=NA)
text(trans3d((1:lastobs)[subset], 120, 3, pmat), labels=paste(" ",
temp.ymd[subset]), srt=310, adj=0)
# Draw y-axis labels; only draw some of the labels to avoid overlap
xnames <-
c("y1m","y3m","y6m","y9m","y12m","y24m","y36m","y48m","y60m","y72m","y84m","
y96m","y108m","y120m")
subset <- c(1,6,9,11,13,14)
text(trans3d(enter position as integer, x[subset], 3, pmat),
labels=paste(xnames, " ")[subset], srt=60, adj=1)
# Redo z-axis
text(trans3d(lastobs, 1, seq(2, 5, 1), pmat), labels=paste(seq(2, 5, 1), "
"), adj=1)
# Redo axis labels
text(trans3d(enter position as integer, 160, 0, pmat), labels="Last 100
periods", srt=40)
text(trans3d(enter position as integer, mean(x), 0, pmat),labels="Maturities
(months)", srt=330)
text(trans3d(enter position as integer, -50, 4.5, pmat), abels="Yields",
srt=95)

see the help archives, too. The coloring could/should be achieved with
conditional arguments. Apologize for not having worked it out with your
sample data, but rather copied the code snippet in here. 

HTH and directs you to the right spot to look at,
-B.

> A yield curve is a picture z(t) running (say) from maturity t=0 to
> t=10 years. And, the yield curve fluctuates; there's a new one every
> day. So you have a time-series of curves.
> 
> I have seen very pretty 3d color visualisation of the changing yield
> curve. The x axis is time, the y axis is maturity, the z axis is the
> interest rate. Low interest rates are coloured blue and high interest
> rates are coloured red. I have also seen a user-interface where the
> person can change the point of perspective and interactively look at
> the scene from different vantage points.
> 
> q: How would one do this in R? :-) Have you deployed ggobi or lattice
>    graphics for the task?
> 
> q: Does it add insight to look at yield curves in this way? Wise men
>    on the r-help mailing list generally say that you don't gain too
>    much insight from pretty 3d plots, so I have de-emphasised
>    them. But one can't help feeling tempted by those pretty pictures!
> 
> There's a code fragment at the end of this email, which sets up a
> matrix syc.points which has 118 rows (for 118 days) and 100 columns,
> where each column is the spot interest rate at one maturity. The
> maturities run from 0.1 to 10 years. This may help you play with the
> question. In case it's of interest, this is the spot yield curve in
> India from 1 April this year onwards, which has been an exciting time.
> 
> Thanks,
> 
>         -ans.
> 
> -- 
> Ajay Shah                                                   Consultant
> ajayshah at mayin.org                      Department of Economic Affairs
> http://www.mayin.org/ajayshah           Ministry of Finance, New Delhi
> 
> 
> 
> 
> nsz <- function(b0, b1, b2, tau, t) {
>   tmp = t/tau
>   tmp2 = exp(-tmp)
>   return(b0 + ((b1+b2)*(1-tmp2)/(tmp)) - (b2*tmp2))
> }
> 
> ns <- structure(list(date = as.integer(c(20040401, 20040402, 
> 20040405, 
> 20040406, 20040407, 20040408, 20040410, 20040412, 20040413, 20040415, 
> 20040416, 20040417, 20040419, 20040420, 20040421, 20040422, 20040423, 
> 20040424, 20040427, 20040428, 20040429, 20040430, 20040503, 20040505, 
> 20040506, 20040507, 20040508, 20040510, 20040511, 20040512, 20040513, 
> 20040514, 20040515, 20040517, 20040518, 20040519, 20040520, 20040521, 
> 20040522, 20040524, 20040525, 20040526, 20040527, 20040528, 20040529, 
> 20040531, 20040601, 20040602, 20040603, 20040604, 20040605, 20040607, 
> 20040608, 20040609, 20040610, 20040611, 20040612, 20040614, 20040615, 
> 20040616, 20040617, 20040618, 20040619, 20040621, 20040622, 20040623, 
> 20040624, 20040625, 20040626, 20040628, 20040629, 20040630, 20040701, 
> 20040702, 20040703, 20040705, 20040706, 20040707, 20040708, 20040710, 
> 20040712, 20040713, 20040714, 20040715, 20040716, 20040717, 20040719, 
> 20040720, 20040721, 20040722, 20040723, 20040724, 20040726, 20040727, 
> 20040728, 20040729, 20040730, 20040731, 20040802, 20040803, 20040804, 
> 20040805, 20040806, 20040807, 20040809, 20040810, 20040811, 20040812, 
> 20040813, 20040814, 20040816, 20040817, 20040818, 20040819, 20040821, 
> 20040823, 20040824, 20040825)), b0 = c(7.3422, 7.8217, 11.3901, 
> 7.4635, 7.2226, 7.2234, 7.3554, 7.3074, 8.468, 7.4894, 7.333, 
> 7.4633, 7.6058, 7.1231, 7.686, 7.0339, 7.4681, 7.3624, 7.3174, 
> 7.4157, 7.7941, 7.4091, 7.8367, 7.4442, 7.7108, 7.4472, 7.4185, 
> 7.1485, 7.0891, 7.3275, 6.9325, 7.0438, 7.0387, 7.2428, 7.7536, 
> 7.1781, 7.1971, 7.1158, 9.4099, 14.0915, 6.9736, 7.3604, 8.2228, 
> 8.9938, 9.2337, 14.5484, 11.5983, 14.1417, 11.5225, 7.516, 7.7201, 
> 7.5108, 7.575, 7.5737, 8.1235, 7.6523, 7.8026, 7.4334, 14.4161, 
> 7.4442, 8.3493, 7.7468, 7.8207, 7.8434, 8.3185, 8.0729, 7.9769, 
> 8.1296, 7.4141, 7.7981, 8.023, 8.2652, 7.9386, 7.8601, 7.9348, 
> 10.3803, 9.4022, 7.7753, 9.1768, 8.8638, 7.8373, 7.421, 7.4414, 
> 7.3915, 7.2947, 7.1905, 7.379, 6.9234, 7.5494, 6.9746, 7.9473, 
> 14.7695, 7.3734, 7.3422, 4.6736, 7.4979, 7.4727, 7.3631, 7.8308, 
> 7.6939, 7.0801, 7.7495, 5.0205, 7.6851, 15.2449, 11.4073, 10.5747, 
> 7.47, 8.06, 15.7304, 10.26, 7.3, 9.51, 9.32, 8.838, 13.3616, 
> 15.5854, 11.0715), b1 = c(-2.721, -3.2183, -6.5193, -3.2818, 
> -2.4963, -2.6716, -2.4753, -2.8383, -3.9206, -2.8313, -2.7894, 
> -2.8732, -3.2573, -2.5732, -2.9594, -2.3505, -2.6395, -2.6339, 
> -2.3883, -2.7691, -3.286, -2.5451, -3.0089, -2.9315, -3.2165, 
> -2.7868, -1.4352, -2.4697, -2.0563, -2.7682, -2.5612, -2.5146, 
> -2.5144, -2.4144, -2.9954, -2.3257, -2.1419, -2.1677, -4.3465, 
> -9.4, -2.1492, -2.6646, -3.4617, -4.1504, -3.1783, -9.4, -6.6092, 
> -9.4, -6.5229, -2.3708, -2.3271, -2.9659, -2.7749, -2.5683, -3.1604, 
> -2.3273, -2.543, -2.7601, -9.4, -2.2319, -3.1117, -3.3958, -2.7336, 
> -2.7717, -3.1778, -2.8743, -2.9824, -3.3025, -2.3269, -2.8134, 
> -3.2428, -3.4767, -3.2345, -3.019, -2.7832, -5.2133, -4.2563, 
> -2.9053, -4.092, -3.7751, -2.9284, -2.381, -2.6428, -2.7985, 
> -2.5906, -2.1872, -2.7013, -2.4288, -2.5056, -2.529, -2.9546, 
> -9.4, -2.2121, -2.419, -0.0105, -2.6278, -2.7345, -2.278, -2.6838, 
> -2.2775, -3.0019, -2.4925, -0.0191, -2.4934, -9.2345, -5.4497, 
> -4.4509, -2.88, -2.31, -9.1449, -3.96, -3.95, -3.4, -3.28, -3.1081, 
> -6.9305, -9.4, -4.9702), b2 = c(-2.9455, -3.1714, -7.1921, -1.2954, 
> -2.9376, -2.3315, -3.3516, -1.9412, -2.8231, -2.9133, -2.3912, 
> -2.7164, -0.6094, -2.4146, -3.0891, -2.8961, -3.452, -2.9017, 
> -3.525, -2.7331, -2.2974, -3.4923, -3.5535, -2.2847, -2.0384, 
> -2.8926, -5.7102, -2.7131, -3.5915, -2.4034, -1.4584, -2.2325, 
> -1.6771, -3.3011, -3.3382, -3.2615, -3.7138, -3.5048, -6.5431, 
> -8.59, -3.4933, -2.9518, -3.7216, -4.8041, -8.4707, -11.6242, 
> -7.4944, -8.6059, -7.4215, -4.0466, -4.4962, -2.4366, -2.9504, 
> -3.7409, -3.5684, -4.1972, -4.0236, -1.9687, -9.1264, -3.5223, 
> -4.1759, -1.2065, -3.4071, -3.2178, -3.4439, -3.0968, -2.1767, 
> -0.6931, -2.2134, -2.3287, -0.1982, -3.198, 0.0274, -1.4918, 
> -2.1835, -2.5059, -1.2104, -3e-04, -0.5105, -0.1034, -0.0324, 
> -0.0108, -0.0785, -0.0014, 0, -0.4718, -0.0261, 0.036, -0.0113, 
> 0.0142, -0.0189, -7.7247, -0.0115, -0.0146, 7.0134, 0.0116, 0.0098, 
> -0.0168, -0.0012, -0.0064, 0.0239, 0.0032, 6.0088, 0.01, -7.839, 
> -2.518, -1.4064, 0.02, -0.01, -9.5194, -2.12, 1.62, -1.98, -0.04, 
> -0.0255, -6.7197, -9.2038, -2.9766), tau = c(4.5266, 5.7445, 
> 10.7687, 6.682, 4.496, 5.1623, 4.8581, 6.3769, 9.7641, 5.8551, 
> 5.9208, 6.1627, 11.1458, 4.9739, 6.5382, 4.228, 5.2418, 5.5392, 
> 4.6344, 5.4967, 7.0604, 4.7554, 6.2326, 5.9656, 7.7035, 5.3672, 
> 3.8092, 4.2389, 3.5272, 4.9461, 4.8159, 4.0655, 4.972, 3.5159, 
> 4.9192, 3.8536, 3.6992, 3.4197, 5.8819, 14.656, 2.8546, 4.2702, 
> 5.9606, 6.1133, 4.7138, 10.0547, 9.0578, 12.9292, 8.6205, 3.6096, 
> 4.4072, 4.5344, 4.5593, 3.6541, 5.1583, 3.7913, 4.2516, 4.5431, 
> 13.0367, 3.5478, 5.3657, 5.4139, 3.8999, 3.9799, 4.6267, 4.1281, 
> 4.5191, 6.8646, 2.9362, 3.6888, 7.3445, 3.835, 7.5136, 4.6792, 
> 5.2262, 15.5, 15.5, 8.7869, 15.5, 15.4999, 8.3618, 7.8984, 5.6957, 
> 4.3874, 4.4051, 4.7968, 5.0399, 3.0356, 7.3138, 2.8834, 7.6381, 
> 15.5, 6.3357, 4.7519, 10.974, 3.925, 3.7252, 4.5168, 6.2362, 
> 6.282, 1.6898, 5.8815, 9.6076, 4.6436, 15.5, 15.5, 15.5, 1.39, 
> 4.49, 15.5, 12.39, 1.16, 8.23, 13.41, 7.886, 15.5, 13.5623, 15.5
> )), .Names = c("date", "b0", "b1", "b2", "tau"), row.names = 
> c("2105", 
> "2106", "2107", "2108", "2109", "2110", "2111", "2112", "2113", 
> "2114", "2115", "2116", "2117", "2118", "2119", "2120", "2121", 
> "2122", "2123", "2124", "2125", "2126", "2127", "2128", "2129", 
> "2130", "2131", "2132", "2133", "2134", "2135", "2136", "2137", 
> "2138", "2139", "2140", "2141", "2142", "2143", "2144", "2145", 
> "2146", "2147", "2148", "2149", "2150", "2151", "2152", "2153", 
> "2154", "2155", "2156", "2157", "2158", "2159", "2160", "2161", 
> "2162", "2163", "2164", "2165", "2166", "2167", "2168", "2169", 
> "2170", "2171", "2172", "2173", "2174", "2175", "2176", "2177", 
> "2178", "2179", "2180", "2181", "2182", "2183", "2184", "2185", 
> "2186", "2187", "2188", "2189", "2190", "2191", "2192", "2193", 
> "2194", "2195", "2196", "2197", "2198", "2199", "2200", "2201", 
> "2202", "2203", "2204", "2205", "2206", "2207", "2208", "2209", 
> "2210", "2211", "2212", "2213", "2214", "2215", "2216", "2217", 
> "2218", "2219", "2220", "2221", "2222"), class = "data.frame")
> 
> ns$date = as.Date(as.character(ns$date), format="%Y%m%d")
> syc.points <- matrix(nrow=nrow(ns), ncol=100)
> 
> # How to do this in a clever vectorised way?
> for (i in 1:nrow(ns)) {
>   j <- 1
>   for (t in seq(from=0.1,length=100,by=0.1)) {
>     syc.points[i,j] <- nsz(ns$b0[i], ns$b1[i], ns$b2[i], ns$tau[i], t)
>     j <- j + 1
>   }
> }
> 
> _______________________________________________
> R-sig-finance at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> 


--------------------------------------------------------------------------------
The information contained herein is confidential and is inte...{{dropped}}



More information about the R-sig-finance mailing list