1つのcsvファイルがあり、2つの株式の終値があります(毎日)
Dates Bajaj_close Hero_close
3/14/2013 1854.8 1669.1
3/15/2013 1850.3 1684.45
3/18/2013 1812.1 1690.5
3/19/2013 1835.9 1645.6
3/20/2013 1840 1651.15
3/21/2013 1755.3 1623.3
3/22/2013 1820.65 1659.6
3/25/2013 1802.5 1617.7
3/26/2013 1801.25 1571.85
3/28/2013 1799.55 1542
上記のデータを時系列形式に変換したい。 (開始日は3/14/2013
および終了日は3/13/2015
)これを試してみましたが、奇妙な出力が得られます
values <- bajaj_hero[, -1] (excluded first column i.e date in real dataset)
bajaj_hero_timeseries <- ts(values,start=c(2013,1),end=c(2015,3),frequency=365)
出力は次のとおりです。
Bajaj_close Hero_close
2013.000 1854.80 1669.10
2013.003 1850.30 1684.45
2013.005 1812.10 1690.50
2013.008 1835.90 1645.60
2013.011 1840.00 1651.15
2013.014 1755.30 1623.30
2013.016 1820.65 1659.60
2013.019 1802.50 1617.70
2013.022 1801.25 1571.85
助けてください.. :)
Rには、時系列を再設定する複数の方法があります。毎日の株の価格で作業しているので、週末と休業日には金融市場が閉じているため、取引日とカレンダー日が同じではないことを考慮する必要があります。ただし、取引日と暦日の両方の観点から時系列を操作する必要がある場合があります。たとえば、日次リターンは、週末が介入するかどうかに関係なく、連続する日次終値から計算されます。ただし、週単位の価格概要など、カレンダーベースのレポートを作成することもできます。これらの理由により、Rの財務データにはZooの拡張であるxtsパッケージが一般的に使用されます。データでどのように使用できるかの例を次に示します。
例に示されているデータがデータフレームdfにあると仮定します
library(xts)
stocks <- xts(df[,-1], order.by=as.Date(df[,1], "%m/%d/%Y"))
#
# daily returns
#
returns <- diff(stocks, arithmetic=FALSE ) - 1
#
# weekly open, high, low, close reports
#
to.weekly(stocks$Hero_close, name="Hero")
出力を与える
Hero.Open Hero.High Hero.Low Hero.Close
2013-03-15 1669.1 1684.45 1669.1 1684.45
2013-03-22 1690.5 1690.50 1623.3 1659.60
2013-03-28 1617.7 1617.70 1542.0 1542.00
入力。質問はcsv入力を提供しなかったため、質問に表示される入力のテキストから始めます。
Lines <- "Dates Bajaj_close Hero_close
3/14/2013 1854.8 1669.1
3/15/2013 1850.3 1684.45
3/18/2013 1812.1 1690.5
3/19/2013 1835.9 1645.6
3/20/2013 1840 1651.15
3/21/2013 1755.3 1623.3
3/22/2013 1820.65 1659.6
3/25/2013 1802.5 1617.7
3/26/2013 1801.25 1571.85
3/28/2013 1799.55 1542"
Zoo。"ts"
クラスシリーズは通常、日付インデックスを表しませんが、そうするZooシリーズを作成できます( Zooパッケージを参照 ):
library(Zoo)
z <- read.Zoo(text = Lines, header = TRUE, format = "%m/%d/%Y")
または、これを既にデータフレームDF
に読み込んでいる場合は、次の2行目に示すようにZooに変換できます。
DF <- read.table(text = Lines, header = TRUE)
z <- read.Zoo(DF, format = "%m/%d/%Y")
上記のいずれの場合でも、z
iaは"Date"
クラス時間インデックスを持つZooシリーズです。また、時間インデックスとして1、2、3、...を使用するZooシリーズzz
を作成することもできます。
zz <- z
time(zz) <- seq_along(time(zz))
ts。これらのいずれかを"ts"
クラスシリーズに変換できます。
as.ts(z)
as.ts(zz)
最初のものには、エポック(1970年1月1日)以降の日数である時間インデックスがあり、欠落している日にはNAがあり、2番目には時間インデックスとして1、2、3、...があり、NAはありません。
月次シリーズ。通常、"ts"
シリーズは、月次、四半期、または年次のシリーズに使用されます。したがって、入力を月に集約する場合、"ts"
シリーズとして合理的に表すことができます。
z.m <- as.zooreg(aggregate(z, as.yearmon, mean), freq = 12)
as.ts(z.m)
次の質問を参照してください。 data.frameをxts order.byに変換するには、適切な時間ベースのオブジェクトが必要です 。order.byの引数を見ることを提案します。
現在受け入れ可能なクラスには、「Date」、「POSIXct」、「timeDate」、およびインデックス値が一意のままである「yearmon」および「yearqtr」が含まれます。
さらに、order.by = as.POSIXctを使用した明示的な変換を提案します。
df$Date <- as.POSIXct(strptime(df$Date,format),tz="UTC")
xts(df[, -1], order.by=as.POSIXct(df$Date))
どこでフォーマットが割り当てられるか、
format <- "%m/%d/%Y" #see strptime for details
ライブラリfpp
を使用すると、日付形式time_ser=ts(data,frequency=4,start=c(1954,2))
で時系列を簡単に作成できます。
ここでは、1954年の第2四半期から四半期の頻度で開始します。
パーティーに遅れましたが、 tsbox パッケージはこのような変換を実行するように設計されています。データをts
- objectに変換するには、次のようにします。
dta <- data.frame(
Dates = c("3/14/2013", "3/15/2013", "3/18/2013", "3/19/2013"),
Bajaj_close = c(1854.8, 1850.3, 1812.1, 1835.9),
Hero_close = c(1669.1, 1684.45, 1690.5, 1645.6)
)
dta
#> Dates Bajaj_close Hero_close
#> 1 3/14/2013 1854.8 1669.10
#> 2 3/15/2013 1850.3 1684.45
#> 3 3/18/2013 1812.1 1690.50
#> 4 3/19/2013 1835.9 1645.60
library(tsbox)
ts_ts(ts_long(dta))
#> Time Series:
#> Start = 2013.1971293045
#> End = 2013.21081883954
#> Frequency = 365.2425
#> Bajaj_close Hero_close
#> 2013.197 1854.8 1669.10
#> 2013.200 1850.3 1684.45
#> 2013.203 NA NA
#> 2013.205 NA NA
#> 2013.208 1812.1 1690.50
#> 2013.211 1835.9 1645.60
日付を自動的に解析し、頻度を検出し、週末の欠損値を明示的にします。 ts_<class>
、データを他の時系列クラスに変換できます。