Ts 함수 frequency - Ts hamsu frequency

벡터를 이용하여 시계열 데이터를 직접 만들어 보자. 시계열 데이터를 만들 때에는 ts(time series) 객체를 이용한다.

#=== 3. 시계열분석 데이터 만들기 - ts()

# (1) ts() 함수 사용

vect01 <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)

ts01 <- ts(vect01,start=2001,frequency=4)

ts01

ts02 <- ts(vect01,start=2001,frequency=12)

ts02

ts03 <- ts(vect01,start=2001,frequency=1)

ts03

(ts04 <- ts(vect01,end=2001,frequency=4))

(ts05 <- ts(vect01,end=2001,frequency=12))

?ts

length : 원소들의 갯수

mode : 원소들의 종류

tsp : 시계열 시작, 종료, 간격

dim : 다중시계열의 행과 열의 수

dimnames : 다중시계열의 행과 열의 이름

분기별 데이터 만들기

vect01 <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)

ts01 <- ts(vect01,start=2001,frequency=4)

ts01

> ts01

Qtr1 Qtr2 Qtr3 Qtr4

2001 1 2 3 4

2002 5 6 7 8

2003 9 10 11 12

2004 13 14 15 16

length(ts01) # 16

class(ts01) # ts

mode(ts01) # numeric

help(ts)

월별 데이터 만들기

ts02 <- ts(vect01,start=2001,frequency=12)

ts02

> ts02

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

2001 1 2 3 4 5 6 7 8 9 10 11 12

2002 13 14 15 16

연도별 데이터 만들기

ts03 <- ts(vect01,start=2001,frequency=1)

ts03

> ts03

Time Series:

Start = 2001

End = 2016

Frequency = 1

[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

>

(ts04 <- ts(vect01,end=2001,frequency=4))

(ts05 <- ts(vect01,end=2001,frequency=12))

> help(ts)

2019. 1. 30. 17:29

시계열 ts()

R로 시계열 분석 시, frequency를 나눌 때는 데이터가 frequency대로 정확하게 떨어지게 나눠야 함

ex)

ts(data, start=c(2012,3), frequency = 12) 

2012년 1월~2018년 2월 자료까지 밖에 없는 경우

2012년 3월을 start 점으로 해줘야 함

'programing > R studio' 카테고리의 다른 글

R 패키지 설치 에러  (3) 2019.06.09
R 단축키  (0) 2019.03.23
approx VS approxfun  (0) 2019.01.30
특정 행 or 열 이름만 바꾸기  (0) 2018.12.03
duplicated(), unique(), distinct()  (0) 2018.09.17

NAME

PASSWORD

HOMEPAGE

SECRET

PREV 1···8910111213141516···355 NEXT

+ Recent posts

Powered by Tistory, Designed by wallel

Rss Feed and Twitter, Facebook, Youtube, Google+

  • 1. 시계열 데이터 맛보기
    • 1.1. 시계열 데이터 팩키지와 자료구조
    • 1.2. 시계열 데이터 시각화
  • 2. 시계열 데이터 다루기
    • 2.1. 주식 데이터 1종
    • 2.2. 주식 데이터 다수

학습 목표

  • 금융공학을 위한 시계열 데이터 기초를 이해한다.
  • 금융데이터를 가져와서 데이터를 정제하는 방식을 살펴본다.

시계열 데이터(time series)는 시간 순서로 배열된 데이터의 한 종류로 시간에 걸쳐 순차적으로 기록된다. 시계열 데이터는 널려있다고 해도 과언은 아니다. 주식수익률 데이터를 포함한 재무데이터, 인플레이션, 소비자 물가를 포함한 각종 경제 관련 데이터 및 시간순으로 정당 지지율도 대표적인 시계열 데이터가 된다.

날짜와 시간을 어떻게 R 자료구조로 표현하는 방법과 실무에서 자주 등장하는 불규칙한 시계열 데이터를 일정 간격을 갖는 시계열 데이터로 변환하는 방법에 대해서는 다음 웹사이트를 참고한다.

  • 시간 데이터 기초
  • 불규칙 시계열 데이터

1. 시계열 데이터 맛보기

1.1. 시계열 데이터 팩키지와 자료구조 1

팩키지시계열 객체상세 설명
fts fts C++ 시계열 라이브러리 tslib에 대한 R 인터페이스
its its 불규칙 시계열 데이터를 처리하는 S4 클래스
tseries irts “POSIXct” 색인을 갖는 불규칙 시계열 객체
timeSeries timeSeries Rmetrics 팩키지 시계열 유틸리티
tis tis 시간 색인과 시계열 데이터를 위한 S3 함수와 클래스
stats ts, mts 일정한 시간 간격을 갖는 시계열 객체
zoo zoo 불규칙 시계열을 포함하고 전체 관측점을 시계열 순으로 색인한 S3 클래스
xts xts zoo 클래스 확장

시계열 데이터를 R에서 담아내는 객체는 다양하다. C++ tslib을 R로 가져온 것부터 가장 최근 xts 팩키지까지 다양한 방식이 동원된다. 시계열 데이터를 자료구조로 이해할 경우 먼저 등간격을 갖는 일정한 시간 데이터인지, 불규칙한 시간 데이터인지 판단을 해야하고, 그 다음으로 색인여부가 속도와 연관되어 시계열 데이터를 이해하는 중요한 기준이 될 수 있다.

Base 팩키지에 포함된 ts 함수를 사용하면 간단한 시계열 데이터를 생성시킬 수 있다. 특히 window 함수를 활용하여 특정 기간 데이터도 쉽게 뽑아낼 수 있다.

# 0. 환경설정 --------------------------------------------------------------
library(tidyverse)
library(lubridate)
library(xts)

# 1. 시계열 데이터 --------------------------------------------------------------
## 1.1. 처음부터 생성------------------------------------------------------------
dat <- c(7,5,3,1,3,5,7)
dat_ts <- as.ts(dat)
dat_ts
Time Series:
Start = 1 
End = 7 
Frequency = 1 
[1] 7 5 3 1 3 5 7
dat_1987_ts <- ts(dat, start=1987)
dat_1987_ts
Time Series:
Start = 1987 
End = 1993 
Frequency = 1 
[1] 7 5 3 1 3 5 7
dat_quarter_ts <- ts(dat, start=c(1987,3), frequency=4)
dat_quarter_ts
     Qtr1 Qtr2 Qtr3 Qtr4
1987              7    5
1988    3    1    3    5
1989    7               
# 특정기간 뽑아내기
window(dat_quarter_ts, start=c(1987,3), end=c(1988,4))
     Qtr1 Qtr2 Qtr3 Qtr4
1987              7    5
1988    3    1    3    5

시계열 자료구조를 활용하는 이유

시계열 자료구조를 활용하는 이유는 다음 맥주생산량 데이터를 통해 이해하면 쉽다. 시계열 자료구조가 아닌 경우 plot 함수에 던지게 되면 산점도를 찍게 되지만, 시계열 자료구조를 갖는 경우 각 관측점을 연결한 시각화 산출물을 생성시킨다.

xts 팩키지를 활용하면 불규칙, 규칙 시계열 데이터를 자체 색인을 통해 빠르게 접근하고 다양한 시계열 데이터를 자유로이 다룰 수 있는 도구상자를 지원한다.

## 1.2. 데이터셋에서 불러오기----------------------------------------------------
# 맥주생산량 데이터
beer_df <- read_csv("https://raw.githubusercontent.com/jamesrobertlloyd/gp-structure-search/master/data/raw/TSDL/monthly-beer-production-in-austr.csv") 
names(beer_df) <- c("dtime", "beer")

beer_df <- beer_df %>% dplyr::filter(!is.na(beer)) %>% mutate(dtime=ymd(paste0(dtime,"-01")))

# ts 변환
head(beer_df)
# A tibble: 6 × 2
       dtime  beer
      <date> <dbl>
1 1956-01-01  93.2
2 1956-02-01  96.0
3 1956-03-01  95.2
4 1956-04-01  77.1
5 1956-05-01  70.9
6 1956-06-01  64.8
tail(beer_df)
# A tibble: 6 × 2
       dtime  beer
      <date> <dbl>
1 1995-03-01   152
2 1995-04-01   127
3 1995-05-01   151
4 1995-06-01   130
5 1995-07-01   119
6 1995-08-01   153
beer_ts <- ts(beer_df[,-1], start=c(1956,01), frequency=12)

par(mfrow=c(1,2))
plot(beer_df, main="시계열 정보 활용 못함", xlab="", ylab="맥주생산량")
plot(beer_ts, main="시계열 정보 활용 직선으로 연결함", xlab="", ylab="맥주생산량")
# xts 변환
beer_xts <- as.xts(beer_df[,-1], order.by=beer_df$dtime)

par(mfrow=c(1,1))
plot(beer_xts)

1.2. 시계열 데이터 시각화 2

시계열 데이터를 시각화할 경우 시계열 시간이 항상 시계열 관측값보다 긴 것이 좋다. 태양의 흑점수(sunspot)를 관측한 데이터의 특징은 흑점개수가 빠르게 증가하고 느리게 감소하는 경향이 있는데 상단 그래프(시간축이 관측축보다 긴 경우)는 이런 경향이 잘 관찰되지만, 하단 그래프(시간축과 관측축이 동일한 경우)는 이런 경향을 확인하기 상대적으로 쉽지 않다.

# 2. 시각화----------------------------------------------------
require(graphics)
data(sunspot.year)
layout(matrix(c(1:2, 1:2), ncol=2), height=c(.2,.8))

par(mar=c(.2,3.5,0,.5), oma=c(3.5,0,.5,0), mgp=c(2,.6,0), tcl=-.3, las=1)

plot(sunspot.year, type='n', xaxt='no', ylab='')
  grid(lty=1, col=gray(.9))
  lines(sunspot.year)
  
plot(sunspots, type='n', ylab='')
  grid(lty=1, col=gray(.9))
  lines(sunspot.year)

title(xlab="시간", outer=TRUE, cex.lab=1.2)
mtext(side=2, "태양의 흑점개수", line=2, las=0, adj=.75)

2. 시계열 데이터 다루기

2.1. 주식 데이터 1종

시계열 데이터의 대표적인 데이터가 주식 데이터로 특정 기업(웹젠)을 살펴보자.

오류

Error in download.file(paste(yahoo.URL, “s=”, Symbols.name, “&a=”, from.m, : cannot open URL ‘https://ichart.finance.yahoo.com/table.csv?s=069080.KQ&a=0&b=01&c=2017&d=4&e=18&f=2017&g=d&q=q&y=0&z=069080.KQ&x=.csv’ In addition: Warning message: In download.file(paste(yahoo.URL, “s=”, Symbols.name, “&a=”, from.m, : cannot open URL ‘https://ichart.finance.yahoo.com/table.csv?s=069080.KQ&a=0&b=01&c=2017&d=4&e=18&f=2017&g=d&q=q&y=0&z=069080.KQ&x=.csv’: HTTP status was ‘502 Connection refused’

따라서, 아마존을 대상으로 살펴보자. getSymbols 함수로 야후나 구글에서 주식데이터를 긁어오면 시가, 종가 등 다양한 정보를 아래 함수를 혹은 조합해서 활용이 가능하다.

  • Op() : 개장가격(opening price)
  • Hi() : 최고가(high price)
  • Lo() : 최저가(low price)
  • Cl() : 마감 종가(close price)
  • Vo() : 거래량(traded volume)
  • Ad() : 조정된 마감 종가(adjusted close price)
# 1. 데이터 긁어오기 ----------------------------------
# webzen_env <- new.env()
# webzen_xts <- getSymbols('069080.KQ', src='yahoo', env=webzen_env, from = "2017-01-01", auto.assign = F)

getSymbols("AMZN", src="google", auto.assign = TRUE, from = "2017-05-01")
[1] "AMZN"
# 2. 특정 칼럼 뽑아내기 ----------------------------------
## 2.1. 한 칼럼만 뽑아내기
head(Op(AMZN), 3)
           AMZN.Open
2017-05-01    927.80
2017-05-02    946.64
2017-05-03    946.00
head(Hi(AMZN), 3)
           AMZN.High
2017-05-01     954.4
2017-05-02     950.1
2017-05-03     946.0
head(Lo(AMZN), 3)
           AMZN.Low
2017-05-01   927.80
2017-05-02   941.41
2017-05-03   935.90
head(Cl(AMZN), 3)
           AMZN.Close
2017-05-01     948.23
2017-05-02     946.94
2017-05-03     941.03
head(Vo(AMZN), 3)
           AMZN.Volume
2017-05-01     5466544
2017-05-02     3848835
2017-05-03     3582686
# head(Ad(AMZN), 3)

## 2.2. 칼럼 다수 뽑아내기

head(OHLC(AMZN), 3)
           AMZN.Open AMZN.High AMZN.Low AMZN.Close
2017-05-01    927.80     954.4   927.80     948.23
2017-05-02    946.64     950.1   941.41     946.94
2017-05-03    946.00     946.0   935.90     941.03

2.2. 주식 데이터 다수

주식 데이터 다수를 가져열 경우 일단 new.env() 함수로 다수 주식데이터를 담아놓는 공간을 마련한다. 그후 split-apply-combine 전략을 적용한다.

# 3. 다수 데이터 긁어오기 ----------------------------------

data_env <- new.env()
getSymbols(c("AMZN", "AAPL"), env = data_env, src="google", auto.assign = TRUE, from = "2017-05-01")
[1] "AMZN" "AAPL"
## 3.1. 다수 데이터 종가 가져오기

data_lst <- lapply(data_env, Cl)
(closed <- do.call(merge, data_lst))
           AAPL.Close AMZN.Close
2017-05-01     146.58     948.23
2017-05-02     147.51     946.94
2017-05-03     147.06     941.03
2017-05-04     146.53     937.53
2017-05-05     148.96     934.15
2017-05-08     153.01     949.04
2017-05-09     153.99     952.82
2017-05-10     153.26     948.95
2017-05-11     153.95     947.62
2017-05-12     156.10     961.35
2017-05-15     155.70     957.97
2017-05-16     155.47     966.07
2017-05-17     150.25     944.76