簡體   English   中英

計算時間序列的滾動最小值/最大值

[英]Calcing Rolling Min/Max Values on a time series

對於以下數據(tiblle 被命名為 eq_quotes)

Date        High    Low    Close    Rolling Max Rolling Min
12/16/2020  371.16  368.87  370.17  371.16      363.26
12/15/2020  369.59  365.92  369.59  371.05      363.26
12/14/2020  369.8   364.47  364.66  371.05      363.26
12/11/2020  366.74  363.26  366.3   371.05      359.17
12/10/2020  367.86  364.43  366.73  371.05      359.17
12/9/2020   371.05  365.95  366.85  371.05      359.17
12/8/2020   370.78  367.67  370.17  370.78      359.17
12/7/2020   369.62  367.72  369.09  369.85      354.87
12/4/2020   369.85  367.22  369.85  369.85      354.87
12/3/2020   368.19  365.5   366.69  368.19      354.15
12/2/2020   366.96  364.2   366.79  367.68      354.15
12/1/2020   367.68  364.93  366.02  367.68      354.15
11/30/2020  363.12  359.17  362.06  364.18      354.15
11/27/2020  364.18  362.58  363.67  364.18      354.15
11/25/2020  363.16  361.48  362.66  363.81      351.26
11/24/2020  363.81  359.29  363.22  363.81      351.26
11/23/2020  358.82  354.87  357.46  362.78      350.51
11/20/2020  357.72  355.25  355.33  364.38      350.51
11/19/2020  358.18  354.15  357.78  364.38      347.65
11/18/2020  361.5   356.24  356.28  364.38      347.65

我正在嘗試為日期列之后的三列數據計算單個滾動最小值/最大值。
window 的寬度將為 10,並從該行中的值開始。

最后兩列是數據中該行的數據應該是什么

我嘗試了多種方法來使用 RollMax 嘗試以下方法來計算數據:

  1. Rollmax 指向我想用作輸入的 3 列 類似(刪除代碼):
    rollmax(eq_quotes[,2:4],
                 k=10,
                 fill=NA,
                 align = "left")

==> 挑戰是創建了一個 3x # 行矩陣並且沒有為該行返回單個值 2) 在每一列上最多執行 3 次 Rollmax

                max(rollmax(eq_quotes$High,
                            k=10,
                            fill=NA,
                            align = "left"),
                       rollmax(eq_quotes$Low,
                               k=10,
                               fill=NA,
                               align = "left"),
                       rollmax(eq_quotes$Close,
                               k=10,
                               fill=NA,
                               align = "left")
                       
                    )
  1. 試圖將數據切片為 10 行子表,但仍然遇到如何計算 3 列數據的最大值/最小值的挑戰

您可以嘗試以下方法:

library(zoo)
library(dplyr)

df %>%
  mutate(across(High:Close, ~rollapply(.x, 10, 
                min, align = 'left', partial = TRUE), .names = '{col}_min'),  
         rolling_min = pmin(High_min, Low_min, Close_min), 
         across(High:Close, ~rollapply(.x, 10, 
                max, align = 'left', partial = TRUE), .names = '{col}_max'),  
         rolling_max = pmax(High_max, Low_max, Close_max)) %>%
  select(Date:Close, rolling_min, rolling_max)

這將返回:

#         Date   High    Low  Close rolling_min rolling_max
#1  12/16/2020 371.16 368.87 370.17      363.26      371.16
#2  12/15/2020 369.59 365.92 369.59      363.26      371.05
#3  12/14/2020 369.80 364.47 364.66      363.26      371.05
#4  12/11/2020 366.74 363.26 366.30      359.17      371.05
#5  12/10/2020 367.86 364.43 366.73      359.17      371.05
#6   12/9/2020 371.05 365.95 366.85      359.17      371.05
#7   12/8/2020 370.78 367.67 370.17      359.17      370.78
#8   12/7/2020 369.62 367.72 369.09      354.87      369.85
#9   12/4/2020 369.85 367.22 369.85      354.87      369.85
#10  12/3/2020 368.19 365.50 366.69      354.15      368.19
#11  12/2/2020 366.96 364.20 366.79      354.15      367.68
#12  12/1/2020 367.68 364.93 366.02      354.15      367.68
#13 11/30/2020 363.12 359.17 362.06      354.15      364.18
#14 11/27/2020 364.18 362.58 363.67      354.15      364.18
#15 11/25/2020 363.16 361.48 362.66      354.15      363.81
#16 11/24/2020 363.81 359.29 363.22      354.15      363.81
#17 11/23/2020 358.82 354.87 357.46      354.15      361.50
#18 11/20/2020 357.72 355.25 355.33      354.15      361.50
#19 11/19/2020 358.18 354.15 357.78      354.15      361.50
#20 11/18/2020 361.50 356.24 356.28      356.24      361.50

對於 3 列,我們計算滾動最小值和最大值,然后使用pminpmax我們為每一行收集一個最小值和最大值。

由於最低價和收盤價不能高於最高價,我們只需要取最高價列的滾動最大值,類似地取最低價的滾動最小值。 另請注意,對於任何數字向量 x,min(x) = -max(-x)。

library(dplyr)
library(zoo)

eq_quotes %>%
  mutate(Roll_Max = rollmax(High, 10, align = "left", fill = NA),
         Roll_Min = -rollmax(-Low, 10, align = "left", fill = NA))

筆記

Lines <- "
Date        High    Low    Close    Rolling_Max Rolling_Min
12/16/2020  371.16  368.87  370.17  371.16      363.26
12/15/2020  369.59  365.92  369.59  371.05      363.26
12/14/2020  369.8   364.47  364.66  371.05      363.26
12/11/2020  366.74  363.26  366.3   371.05      359.17
12/10/2020  367.86  364.43  366.73  371.05      359.17
12/9/2020   371.05  365.95  366.85  371.05      359.17
12/8/2020   370.78  367.67  370.17  370.78      359.17
12/7/2020   369.62  367.72  369.09  369.85      354.87
12/4/2020   369.85  367.22  369.85  369.85      354.87
12/3/2020   368.19  365.5   366.69  368.19      354.15
12/2/2020   366.96  364.2   366.79  367.68      354.15
12/1/2020   367.68  364.93  366.02  367.68      354.15
11/30/2020  363.12  359.17  362.06  364.18      354.15
11/27/2020  364.18  362.58  363.67  364.18      354.15
11/25/2020  363.16  361.48  362.66  363.81      351.26
11/24/2020  363.81  359.29  363.22  363.81      351.26
11/23/2020  358.82  354.87  357.46  362.78      350.51
11/20/2020  357.72  355.25  355.33  364.38      350.51
11/19/2020  358.18  354.15  357.78  364.38      347.65
11/18/2020  361.5   356.24  356.28  364.38      347.65"
eq_quotes <- read.table(text = Lines, header = TRUE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM