날짜 열이있는 데이터 프레임을 시계열로 변환
다음 데이터가있는 데이터 프레임이 있습니다.
>PRICE
DATE CLOSE
1 20070103 54.700
2 20070104 54.770
3 20070105 55.120
4 20070108 54.870
5 20070109 54.860
6 20070110 54.270
7 20070111 54.770
8 20070112 55.360
9 20070115 55.760
...
보시다시피 DATE 열은 날짜 (yyyyMMdd)를 나타내고 CLOSE 열은 가격을 나타냅니다.
이제 PerformanceAnalytics 패키지에서 CalmarRatio를 계산해야합니다.
나는 R을 처음 접했기 때문에 모든 것을 이해할 수는 없지만 내가 검색 한 것부터 그 함수에 대한 R 매개 변수가 시계열과 같은 객체 여야한다는 것을 알 수 있습니다.
기간의 모든 날짜에 대한 데이터가 없을 수 있다는 점을 감안하여 내 배열을 시계열 객체로 변환 할 수있는 방법이 있습니까 (지정한 날짜에만 해당)?
당신의 DATE
열은 날짜를 나타낼 수 있지만, 실제로는 문자, 요소, 정수, 또는 숫자 벡터 중 하나입니다.
먼저 DATE
열을 Date
개체 로 변환해야 합니다. 그런 다음 data.frame의 CLOSE
및 DATE
열 에서 xts 개체를 만들 수 있습니다 PRICE
. 마지막으로 xts 객체를 사용하여 수익률과 Calmar 비율을 계산할 수 있습니다.
PRICE <- structure(list(
DATE = c(20070103L, 20070104L, 20070105L, 20070108L, 20070109L,
20070110L, 20070111L, 20070112L, 20070115L),
CLOSE = c(54.7, 54.77, 55.12, 54.87, 54.86, 54.27, 54.77, 55.36, 55.76)),
.Names = c("DATE", "CLOSE"), class = "data.frame",
row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9"))
library(PerformanceAnalytics) # loads/attaches xts
# Convert DATE to Date class
PRICE$DATE <- as.Date(as.character(PRICE$DATE),format="%Y%m%d")
# create xts object
x <- xts(PRICE$CLOSE,PRICE$DATE)
CalmarRatio(Return.calculate(x))
# [,1]
# Calmar Ratio 52.82026
대부분의 사람들은 시계열 클래스로 작업하는 것이 큰 고통이라고 생각합니다. zoo 패키지의 zoo 클래스 사용을 고려해야합니다. 누락 된 시간에 대해 불평하지 않고 중복에 대해서만 불평합니다. PerformanceAnalytics 함수는 거의 확실하게 'zoo'또는 하위 클래스 'xts'를 예상합니다.
pricez <- read.zoo(text=" DATE CLOSE
1 20070103 54.700
2 20070104 54.770
3 20070105 55.120
4 20070108 54.870
5 20070109 54.860
6 20070110 54.270
7 20070111 54.770
8 20070112 55.360
9 20070115 55.760
")
index(pricez) <- as.Date(as.character(index(pricez)), format="%Y%m%d")
pricez
2007-01-03 2007-01-04 2007-01-05 2007-01-08 2007-01-09 2007-01-10 2007-01-11 2007-01-12 2007-01-15
54.70 54.77 55.12 54.87 54.86 54.27 54.77 55.36 55.76
대체 솔루션은 tidyquant
시계열 기능을 포함한 금융 패키지의 기능을 데이터 프레임과 함께 사용할 수 있도록 하는 패키지를 사용하는 것입니다. 다음 예는 여러 자산에 대한 Calmar 비율을 얻는 방법을 보여줍니다. tidyquant 네트는 패키지를 사용하는 방법에 대한 자세한 내용으로 이동합니다.
library(tidyquant)
# Get prices
price_tbl <- c("FB", "AMZN", "NFLX", "GOOG") %>%
tq_get(get = "stock.prices",
from = "2010-01-01",
to = "2016-12-31")
price_tbl
#> # A tibble: 6,449 × 8
#> symbol date open high low close volume adjusted
#> <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 FB 2012-05-18 42.05 45.00 38.00 38.23 573576400 38.23
#> 2 FB 2012-05-21 36.53 36.66 33.00 34.03 168192700 34.03
#> 3 FB 2012-05-22 32.61 33.59 30.94 31.00 101786600 31.00
#> 4 FB 2012-05-23 31.37 32.50 31.36 32.00 73600000 32.00
#> 5 FB 2012-05-24 32.95 33.21 31.77 33.03 50237200 33.03
#> 6 FB 2012-05-25 32.90 32.95 31.11 31.91 37149800 31.91
#> 7 FB 2012-05-29 31.48 31.69 28.65 28.84 78063400 28.84
#> 8 FB 2012-05-30 28.70 29.55 27.86 28.19 57267900 28.19
#> 9 FB 2012-05-31 28.55 29.67 26.83 29.60 111639200 29.60
#> 10 FB 2012-06-01 28.89 29.15 27.39 27.72 41855500 27.72
#> # ... with 6,439 more rows
# Convert to period returns
return_tbl <- price_tbl %>%
group_by(symbol) %>%
tq_transmute(ohlc_fun = Ad,
mutate_fun = periodReturn,
period = "daily")
return_tbl
#> Source: local data frame [6,449 x 3]
#> Groups: symbol [4]
#>
#> symbol date daily.returns
#> <chr> <date> <dbl>
#> 1 FB 2012-05-18 0.00000000
#> 2 FB 2012-05-21 -0.10986139
#> 3 FB 2012-05-22 -0.08903906
#> 4 FB 2012-05-23 0.03225806
#> 5 FB 2012-05-24 0.03218747
#> 6 FB 2012-05-25 -0.03390854
#> 7 FB 2012-05-29 -0.09620809
#> 8 FB 2012-05-30 -0.02253811
#> 9 FB 2012-05-31 0.05001770
#> 10 FB 2012-06-01 -0.06351355
#> # ... with 6,439 more rows
# Calculate performance
return_tbl %>%
tq_performance(Ra = daily.returns,
performance_fun = CalmarRatio)
#> Source: local data frame [4 x 2]
#> Groups: symbol [4]
#>
#> symbol CalmarRatio
#> <chr> <dbl>
#> 1 FB 0.50283172
#> 2 AMZN 0.91504597
#> 3 NFLX 0.14444744
#> 4 GOOG 0.05068483
위의 답변에서와 같이 데이터 프레임 (또는 모든 시계열)을 xts 또는 zoo 객체로 변환하든, 다른 시계열 (예 : ts
객체) 로 변환 하든 tsbox 패키지를 사용하면 쉽게 강제 변환 할 수 있습니다.
PRICE <- structure(list(
DATE = c(20070103L, 20070104L, 20070105L, 20070108L, 20070109L,
20070110L, 20070111L, 20070112L, 20070115L),
CLOSE = c(54.7, 54.77, 55.12, 54.87, 54.86, 54.27, 54.77, 55.36, 55.76)),
.Names = c("DATE", "CLOSE"), class = "data.frame",
row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9"))
library(tsbox)
ts_xts(PRICE)
#> [time]: 'DATE' [value]: 'CLOSE'
#> Loading required namespace: xts
#> Registered S3 method overwritten by 'xts':
#> method from
#> as.zoo.xts zoo
#> CLOSE
#> 2007-01-03 54.70
#> 2007-01-04 54.77
#> 2007-01-05 55.12
#> 2007-01-08 54.87
#> 2007-01-09 54.86
#> 2007-01-10 54.27
#> 2007-01-11 54.77
#> 2007-01-12 55.36
#> 2007-01-15 55.76
ts_ts(PRICE)
#> [time]: 'DATE' [value]: 'CLOSE'
#> Time Series:
#> Start = 2007.00547581401
#> End = 2007.0383306981
#> Frequency = 365.2425
#> [1] 54.70 54.77 55.12 NA NA 54.87 54.86 54.27 54.77 55.36 NA
#> [12] NA 55.76
참조 URL : https://stackoverflow.com/questions/8732461/convert-data-frame-with-date-column-to-timeseries
'developer tip' 카테고리의 다른 글
Scala에서 Iterator와 Stream의 차이점은 무엇입니까? (0) | 2020.12.31 |
---|---|
인증 된 (로그인 된) 사용자 세션으로 Scrapy 사용 (0) | 2020.12.31 |
n 차원 그리드 유형에 대한 cojoin 또는 cobind 작성 (0) | 2020.12.31 |
윤활유가있는 날짜 순서 (0) | 2020.12.31 |
Spring은 추상 클래스 내부에서 autowire 할 수 있습니까? (0) | 2020.12.31 |