2012-01-04 43 views
52

Tôi đã có một khung dữ liệu với các dữ liệu sau:Chuyển đổi với cột ngày đến chuỗi thời gian

>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 
... 

Như bạn có thể nhìn thấy cột NGÀY tôi đại diện cho một ngày (yyyyMMdd) và cột CLOSE tôi đại diện cho giá cả.

Bây giờ tôi phải tính toán CalmarRatio, từ gói PerformanceAnalytics.

Tôi mới thành R, vì vậy tôi không thể hiểu mọi thứ, nhưng từ những gì tôi đã googled đến thời điểm tôi thấy rằng tham số R cho chức năng đó cần phải là một đối tượng giống như chuỗi thời gian.

Có cách nào tôi có thể chuyển đổi mảng của mình thành đối tượng chuỗi thời gian do có thể không có dữ liệu cho mỗi ngày trong một khoảng thời gian (chỉ dành cho những ngày tôi chỉ định)?

Trả lời

46

Cột DATE của bạn có thể đại diện cho một ngày, nhưng nó thực sự là ký tự, yếu tố, số nguyên hoặc vectơ số.

Trước tiên, bạn cần chuyển đổi cột DATE thành đối tượng Date. Sau đó, bạn có thể tạo đối tượng xts từ các cột CLOSEDATE trong số PRICE data.frame của mình. Cuối cùng, bạn có thể sử dụng đối tượng xts để tính toán lợi nhuận và tỷ lệ 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 
+13

cho người mới bắt đầu hoàn thiện: sử dụng 'xts' đòi hỏi tải thư viện đầu tiên của mình, với' require ('XTS') ' – Jealie

+0

@Jealie: while true, OP được hỏi về việc tạo ra một để sử dụng với hàm PerformanceAnalytics. PerformanceAnalytics phụ thuộc vào xts, vì vậy xts có khả năng đã được tải. –

13

Hầu hết mọi người tìm cách làm việc với lớp chuỗi thời gian là một nỗi đau lớn. Bạn nên cân nhắc sử dụng lớp sở thú từ vườn thú gói. Nó sẽ không phàn nàn về thời gian bị mất, chỉ về các bản sao. Các chức năng PerformanceAnalytics gần như chắc chắn sẽ được mong đợi 'sở thú' hoặc lớp con cháu 'xts' của nó.

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 
+4

Cũng lưu ý rằng 'read.zoo' có thể thiết lập chỉ mục. Biến thể này hoạt động: 'read.zoo (PRICE, format ="% Y% m% d ")' giả định rằng 'PRICE' là một khung dữ liệu (chứ không phải mảng hoặc ma trận) với hai cột số và cột này cũng hoạt động: 'read.zoo (text =" ... same.as.above ... ", header = TRUE, format ="% Y% m% d ")' –

+0

Thật tuyệt khi bạn và Achim thêm vào. nhân vật cưỡng chế trước as.Date. Vài lần đầu tiên tôi nhận được NA vì as.Date (20070103, format = "% Y% m% d") không thực hiện cưỡng chế cần thiết. Tuy nhiên, một ví dụ khác về nhiều điều tôi đang nợ bạn. –

+0

Vâng, đó là chính xác. Bạn cần một phiên bản sở thú đủ để làm việc. Phiên bản trên CRAN phải ổn. –

2

Một giải pháp khác là sử dụng các tidyquant gói, trong đó cho phép các chức năng của các gói tài chính, bao gồm chức năng chuỗi thời gian, được sử dụng với khung dữ liệu. Các ví dụ sau cho thấy cách bạn có thể nhận được Tỷ lệ Calmar cho nhiều nội dung. Các tidyquant vignettes đi vào chi tiết hơn về cách sử dụng các gói phần mềm.


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 
Các vấn đề liên quan