琴子 [財經程式設計] 在 R Session 中篩選股票資料

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

說明

本文說明如何在 R session 中篩去股票資料中不會用到的部分。將資料瘦身後,運算起來會比較快。

前置作業

將股票資料載入 R session 中 (出處):

itot <- read.csv("C:/Users/user/Downloads/ITOT-20230629.csv", header=TRUE, stringsAsFactors=FALSE)
itot$Date <- as.Date(itot$Date)

此處使用的股票代號是 ITOT,這是一檔投資美國巿場的 ETF。

去除非必要欄位

subset 函式可將用不到的欄位移除。此處保留原始資料,另外建一個新的變數來存修改後的資料:

itot2 <- subset(itot, select = -c(Open, High, Low, Adj.Close))

保留特定年份的資料

承上,僅保留特定年份的交易記錄:

itot3 <- itot2[as.numeric(format(itot2$Date, "%Y")) == 2021, ]

此處的運作方式是將 Date 欄位轉為數字向量後,進行比較運算,以取出想要的結果。運算結果是一個布林向量,當成取交易記錄的索引。

若想取出特定時間區間的資料,要用兩個條件運算後取其交集:

itot2years <- as.numeric(format(itot2$Date, "%Y"))
itot3 <- itot2[2017 <= itot2years & itot2years <= 2021, ]

若指令較長,可以將運算結果存在一個中間變數中,這樣指令看起來比較簡潔。

節錄特定日期後的股價交易記錄

我們延伸先前的概念,撰寫一個可自動節錄特定日期後的股價交易記錄的 R 命令稿:

args <- commandArgs(trailingOnly=TRUE)

if (length(args) != 2) {
  stop("Wrong argument")
}

if (!grep("\\d+-\\d+-\\d+", args[1])) {
  stop("Not a valid date")
}

if (!file.exists(args[2])) {
  stop("No data sheet loaded")
}

# Read the data sheet.
sheet <- read.csv(args[2], header=TRUE, stringsAsFactors=TRUE)

# Convert the data strings to the data objects.
sheet$Date <- as.Date(sheet$Date)

# Crop the data sheet by a specific date.
sheet <- sheet[(sheet$Date >= args[1]),]

# Name the output data sheet.
output <- paste(tools::file_path_sans_ext(basename(args[2])),
                "cropped", sep="-")
output <- paste(output, "csv", sep=".")

# Write the cropped data to a data sheet.
write.csv(sheet, output, row.names = FALSE)

因為這些動作是固定的,每次都要載入 R 環境操作比較慢。我們寫了一個可重覆使用的 R 命令稿。請自行閱讀程式碼。

使用方式如下:

$ Rscript cropByDate.R 2019-01-01 ITOT.csv
關於作者 琴子喜歡觀察市場邏輯,也喜歡沉靜地彈鋼琴。旅行時總習慣記錄風景背後的脈絡,投資時則偏好慢慢思考而非追高殺低。

現實中關注全球經濟與資產配置,虛擬世界則熱衷於在《黑色沙漠》裡操作漁業與貿易鏈,研究市場機制與角色配置的效率極限。

「理性投資」是琴子整理思緒、檢視決策的地方。不是為了給建議,而是希望留下清楚的腳印,提醒自己:判斷永遠比預測重要。