提取最小值 returns
Extract minima returns
我正在尝试将极值理论的块最大值(在我的例子中是最小值)方法应用于金融 returns。我每天 returns 有 30 个金融指数存储在一个名为 'Returns' 的 csv 文件中。我首先加载数据
Returns<-read.csv("Returns.csv", header=TRUE)
然后我为 'Returns.csv' 文件中的每个索引提取长度相等(即 5 天)的连续非重叠块的最小值 returns。为此,我执行以下操作
for (xx in Returns) #Obtain the minima.
{
rows<-length(xx) #This is the number of returns
m<-5 #When m<-5 we obtain weekly minima. Change accordingly (e.g., 20)
k<-rows/m #This is the number of blocks (i.e., number of returns/size of block),
bm<-rep(0,k) #which is also the number of extremes
for(i in 1:k){bm[i]<-min(xx[((i-1)*m+1):(i*m)])}
#Store the minima in a file 'minima.csv'
write.table(bm,file="minima.csv", append=TRUE, row.names=FALSE, col.names=FALSE)
代码正确提取所有索引的最小值 returns,但是当最小值存储在文件 'minima.csv' 中时,它们都出现在同一列(附加)中。
我想让代码做的是读取文件 'Returns.csv' 第一列中包含的财务 returns,提取长度相等的连续非重叠块的最小值 returns(即, 5 天)并将它们存储在文件的第一列 'minima.csv'。然后对文件 'Returns.csv' 第二列中包含的财务 returns 执行完全相同的操作,并将最小值 returns 存储在文件 'minima.csv' 的第二列中,依此类推继续,直到我到达第 30 列。
我认为您的数据与此类似:
> m <- matrix(1:40, ncol=4)
> m
[,1] [,2] [,3] [,4]
[1,] 1 11 21 31
[2,] 2 12 22 32
[3,] 3 13 23 33
[4,] 4 14 24 34
[5,] 5 15 25 35
[6,] 6 16 26 36
[7,] 7 17 27 37
[8,] 8 18 28 38
[9,] 9 19 29 39
[10,] 10 20 30 40
显然你有更多的行和列,你的数据不仅仅是 1 到 40 的序列。将每列的大小分块为 5 并找到每列的最小值 运行:
> apply(m, 2, function(x) sapply(split(x, ceiling(seq_along(x)/5)), min))
[,1] [,2] [,3] [,4]
1 1 11 21 31
2 6 16 26 36
基本上,apply 是按列拆分 m 并将该函数应用于每一列。内部函数获取每一列,对列进行分块,然后 returns 每个分块的最小值。您的数据位于数据框中而不是矩阵中,因此您需要在 运行 上面的命令之前执行此操作。
m <- as.matrix(Returns)
将其写入 csv
> mins <- apply(m, 2, function(x) sapply(split(x, ceiling(seq_along(x)/5)), min))
> write.table(mins, file="test.min.csv", sep=',', row.names=F, col.names=F, quote=F)
我正在尝试将极值理论的块最大值(在我的例子中是最小值)方法应用于金融 returns。我每天 returns 有 30 个金融指数存储在一个名为 'Returns' 的 csv 文件中。我首先加载数据
Returns<-read.csv("Returns.csv", header=TRUE)
然后我为 'Returns.csv' 文件中的每个索引提取长度相等(即 5 天)的连续非重叠块的最小值 returns。为此,我执行以下操作
for (xx in Returns) #Obtain the minima.
{
rows<-length(xx) #This is the number of returns
m<-5 #When m<-5 we obtain weekly minima. Change accordingly (e.g., 20)
k<-rows/m #This is the number of blocks (i.e., number of returns/size of block),
bm<-rep(0,k) #which is also the number of extremes
for(i in 1:k){bm[i]<-min(xx[((i-1)*m+1):(i*m)])}
#Store the minima in a file 'minima.csv'
write.table(bm,file="minima.csv", append=TRUE, row.names=FALSE, col.names=FALSE)
代码正确提取所有索引的最小值 returns,但是当最小值存储在文件 'minima.csv' 中时,它们都出现在同一列(附加)中。 我想让代码做的是读取文件 'Returns.csv' 第一列中包含的财务 returns,提取长度相等的连续非重叠块的最小值 returns(即, 5 天)并将它们存储在文件的第一列 'minima.csv'。然后对文件 'Returns.csv' 第二列中包含的财务 returns 执行完全相同的操作,并将最小值 returns 存储在文件 'minima.csv' 的第二列中,依此类推继续,直到我到达第 30 列。
我认为您的数据与此类似:
> m <- matrix(1:40, ncol=4)
> m
[,1] [,2] [,3] [,4]
[1,] 1 11 21 31
[2,] 2 12 22 32
[3,] 3 13 23 33
[4,] 4 14 24 34
[5,] 5 15 25 35
[6,] 6 16 26 36
[7,] 7 17 27 37
[8,] 8 18 28 38
[9,] 9 19 29 39
[10,] 10 20 30 40
显然你有更多的行和列,你的数据不仅仅是 1 到 40 的序列。将每列的大小分块为 5 并找到每列的最小值 运行:
> apply(m, 2, function(x) sapply(split(x, ceiling(seq_along(x)/5)), min))
[,1] [,2] [,3] [,4]
1 1 11 21 31
2 6 16 26 36
基本上,apply 是按列拆分 m 并将该函数应用于每一列。内部函数获取每一列,对列进行分块,然后 returns 每个分块的最小值。您的数据位于数据框中而不是矩阵中,因此您需要在 运行 上面的命令之前执行此操作。
m <- as.matrix(Returns)
将其写入 csv
> mins <- apply(m, 2, function(x) sapply(split(x, ceiling(seq_along(x)/5)), min))
> write.table(mins, file="test.min.csv", sep=',', row.names=F, col.names=F, quote=F)