R語言與金融大數據處理——基礎篇(代碼)

# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 最後修改時間:2014-04-23(17.3)



# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   01、課程介紹 ##########################################################################################

# 課程內容 - 介紹課程的意義、基本結構、課程講述方法
{

# 爲什麼選擇R語言做金融大數據處理?

   # R語言是免費、開源、自由的計算平臺使用成本低

   # R的基礎語法簡單、學習速度快、上手容易

   # R語言的數據可視化能力強,提供了豐富的繪圖函數

   # 擴展軟件包發展速度快、更新快,目前已有數千個擴展包覆蓋幾乎所有的科學計算領域

   # 雖然運行速度比C/C++等慢,但是可以快速測試各種算法,節約項目實驗、研究時間。
   # 很多時候只需一行代碼就可以實行一項複雜的功能

   # R語言的學習、研究社區發展快、學習資料豐富



# 課程整體結構

   # R博大精深,內容極其豐富,即使單個方向要充分掌握也需要數年時間

   # 本課程的目的是幫助對程序編寫有一定了解的學員快速掌握R語言基礎知識和金融大數據處理的基本方法

   # 課程整體上分成兩部分:《基礎篇》 和 《擴展軟件包篇》

   # 現在大家看到的10節課屬於《基礎篇》介紹R語言的基礎知識,幫助大家建立基本的知識框架,可以馬上上手使用

   # 後期我們還將推出的《擴展軟件包篇》課程以R語言中的重要軟件包爲分類方式,每個軟件包用4-6節課做詳細介紹



# 本講座的特點

   # 本講座不使用PPT而是在RStudio中分享知識、直接運行代碼塊展示結果,讓大家看到立竿見影的效果

   # 貼近實戰,在介紹R語言知識的同時中也分享金融大數據處理實戰心得

   # 因爲加百力從2002年就在做數據分析、數據庫管理相關工作
   # 近幾年建立了自己的公司做對衝基金管理和金融大數據處理工作
   # 所以本講座還會分享建立數據分析、挖掘公司的理念、工作體系和企業管理經驗



# RStudio 重要快捷鍵

  # Ctrl + L              # 清除控制檯輸出
  # Ctrl + Enter          # 運行光標所在行的R代碼 或者 當前選中行的R代碼
  # Ctrl + Shift + S      # 運行當前腳本文件
  # Ctrl + D              # 刪除整行

}





# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   02、R基礎知識 ##########################################################################################

# 課程內容:介紹:變量賦值、分支結構、循環結構、函數使用、獲取幫助等知識

{

# 通過賦值生成一個新變量
x  <- 1.5;print(x)
y1 <- c(1.5,2.3,8.6,7.4,9.2);print(y1)
y2 <- c("MSFT","GOOG","AAPL");print(y2)
y3 <- c(T,F,T,T,F,F);print(y3)

3.1415926 -> z;print(z)               # 數據在左,變量名在右賦值,但比較少用

assign("t",1.414);print(t)            # assign()函數給變量賦值

szSymbolName <- 'GSPC'                # assign()函數的有趣用途:將數值賦值給保存在字符串變量中的變量名
assign(szSymbolName,1860);print(GSPC)


# 可一次輸入多個數據
cat("x = ",x,"\n",sep="")


# 顯示當前內存中的所有變量、函數名稱
ls()

# 刪除內存中的指定名稱變量
rm(GSPC)

# 刪除內存中加載的所有變量和函數,慎用
rm(list=ls())


# 分支結構

a <- 1
if(a==1) print("a==1")


a <- 2
if(a > 1)  print("a > 1")   else   print("a <= 1")


a <- 3
if( a == 1)
{
   print("a == 1")
}else                       # 注意這裏,else必須緊跟在上一個大括號後面
{
   print("a != 1")
}


# 多重分支結構,同樣每個else必須和前面的}緊緊粘在一起
a <- 4
if( a == 1)
{
   print("a == 1")
}else if( a == 2)
{
   print("a == 2")
}else
{
  print("Not 1 & 2")
}


# ifelse()計算第一個邏輯表達式得到結果如果爲T則返回第二個參數;否則返回第三個參數
a <- 2
print( ifelse(a > 1,3.1416,1.414) )


# switch語句的多重分支結構
n <- 1

switch(n,
       print("選項1"),
       print("選項2"),
       print("選項3"),
       print("選項4"),
       print("選項5")
       )



# for 循環結構

iTotal <-  0
for(i in 1:100)   # 使用關鍵詞in枚舉向量中的每一整數
{
   iTotal <- iTotal + i
} 
cat("1-100的累加和爲:",iTotal,"\n",sep="")



# 字符串也同樣可以成功枚舉十分方便
szSymbols <- c("MSFT","GOOG","AAPL","INTL","ORCL","SYMC")
for(SymbolName in szSymbols)
{
   cat(SymbolName,"\n",sep="")
}


# while循環
i <- 1
iTotal <- 0
while(i <= 100)
{
   iTotal <- iTotal + i
   i <- i + 1
}
cat("1-100的累加和爲:",iTotal,"\n",sep="")


# repeat循環
i <- 1
iTotal <- 0
repeat                               # 無條件循環,必須在程序內部設法退出
{
  iTotal <- iTotal + i
  i <- i + 1

  if(i <= 100) next else break       # 注意:next,break的用法
}
cat("1-100的累加和爲:",iTotal,"\n",sep="")



# 自定義函數
# 注意:建立功能豐富、龐大、專業的自定義函數庫、類庫是公司的核心競爭力
#pt <- function() { szCurTime <- as.character.Date(Sys.time()); options(prompt=paste(szCurTime,">",sep="")) }
#pt()


# 定義自己的二元運算符,%anything%,兩個百分號之間可以是任何字符串
# 定義二元運算符的過程和編寫自定義函數本質相同
"%g%" <- function(x,y)
{
   print(x+y)
   print(x-y)
   print(x*y)
   print(x/y)
}  

3%g%5


# 獲取幫助信息

?print            # 在RStudio右側打開相關幫助界面
example(print)

?quantmod         # 打開擴展包整體幫助信息

apropos("print*")  # 在搜索路徑下查找滿足正則表達式的所有函數信息

demo(graphics)

# 計算機英語還是比較容易,況且要想擁有國際水平的金融大數據處理能力英語關必須過
# 還可以安裝一個金山詞霸,一邊讀幫助文檔一邊將生詞計入生詞庫,多複習、記憶就好了

}





# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   03、R常用數據結構 ###############################################################################################

# 課程內容:介紹向量、數組、列表、數據框、日期時間等數據結構的基礎知識,以及生成這些結構的方法

# R語言的內部數據結構很豐富、使用靈活但是也很複雜比較容易出錯。函數和數據結構不對應很容易報錯

{

# 向量

x <- c(1,2,3,4,5);print(x)

x <- 1:10;print(x)

x <- seq(from=1,to=10);print(x)

x <- seq(from=1,to=10,by=2);print(x)

x <- seq(from=1,to=10,length.out=50);print(x)



# 生成日期變量並用生成的日期變量生成一組日期序列數據
s <- as.Date("2014-1-1")
e <- as.Date("2014-4-1")
dtVec <- seq(from=s,to=e,by=1)
print(dtVec)
print(class(dtVec))



# 生成一組重複數據。使用常數初始化指定長度的向量
x <- rep(1,10);print(x)

x <- rep("USD",5);print(x)


# sample()取樣函數從一組數據中隨機取出指定數量的數據
# replace參數決定是否可以重複取數
y <- sample(x=1:100,size=10,replace=F);print(y)

y <- sample(x=c(0,1),size=20,replace=T);print(y)



# 使用正態分佈隨機數生成函數生成指定數量、平均值、標準差的隨機數
x <- rnorm(n=10,mean=100,sd=20);print(x)



# 數組

# 生成向量然後通過設置行列數據轉換成二維數組
x <- 1:20
dim(x) <- c(5,4)
print(x)

# 直接生成數組並初始化每個元素爲3.14
x <- array(3.14,dim=c(5,4))
print(x)


# 可以生成三維數組
# 使用正態分佈隨機數初始化整個數組
x <- array(rnorm(40,10,5),dim=c(5,4,2))
print(x)
print(length(x))  # 對於矩陣length()函數得到的是所有元素的總數量



# 數據框
# 數據框的形式和Excel比較相似
# 每一列可以看做是一個向量,類型相同;不同列數據之間可以有不同類型
# 同列表的重要區別是:數據框要求每一列數據長度相同
# 數據框的每一行可以看作是一條記錄,每一列看做是記錄的某一個屬性
# 數據框是金融大數據處理中非常重要的數據結構,用途很廣必須深入瞭解
df  <- data.frame(symbols=c("MSFT","KO","CSCO"),price=c(40.40,40.56,23.02),currency=rep("USD",3),country=rep("USA",3),type=rep("STOCK",3))
df
print(class(df))
cat("df數據框行數爲:",nrow(df),"\ndf數據框列數爲:",ncol(df),"\n",sep="")
cat("df數據框總元素數量爲:",length(df),"\n",sep="")  # 得到的不是總元素個數,也不是行數而是列數(屬性)數量


# 列表
# 列表使用list()函數來定義,列表中的每個元素可以是單個變量或者是向量,甚至是另一個列表
# 列表中每個向量的長度可以不同,這是列表和數據框的重要區別
# 數據框是一種形式特殊的列表
lst <- list(symbols=c("MSFT","KO","CSCO"),price=c(40.40,40.56,23.02),currency="USD",country="USA",type="STOCK" )
lst
print(length(lst))  # 共5個元素



# 日期類變量
dtVar <- Sys.Date()
print(class(dtVar));print(dtVar)

dtVar <- Sys.time()
print(class(dtVar));print(dtVar)

dtVar <- as.Date("2014-4-17",tz="UTC")
print(class(dtVar));print(dtVar)

dtVar <- as.Date("2014/4/17",tz="CST")
print(class(dtVar));print(dtVar)



# 用數字直接生成日期對象
# ISOdate()函數得到的是一個POSIXct對象
t <- ISOdate(2014,4,17)
print(class(t));print(t)


# 允許繼續加入小時、分鐘、秒數信息
t <- ISOdatetime(2014,4,17,15,28,48)
print(class(t));print(t)



# 將Date日期轉換成儒略日期
# 在R中這是自1970-1-1以來的天數
d <- as.Date("2014-4-17")
as.integer(d)
julian(d)



# 提取日期中的各個組成部分信息
d <- Sys.time()
p <- as.POSIXlt(d)
print(class(p));print(mode(p));print(p)

print(p$year+1900)   # p$year 自1900年以來的年份
print(p$mon+1)       # p$mon  表示0-11月
print(p$mday)        # p$mday 該月的第幾天

print(p$yday+1)      # p$yday 該年的第幾天,0-365天,元旦當天是第0天
print(p$wday)        # p$wday 對應周幾,0-6,週日爲0,其他時間和我們日常習慣一致

}





# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   04、R的數據操作 ###############################################################################################

# 課程內容:R提供了極其靈活的方式,訪問、修改、擴充、刪除、計算向量、列表、數據框等基礎數據結構

{

# 訪問向量中元素

x <- 1:10;print(x)

print(x[5])

print(x[-5])

print(x[c(1,5,8)])

print(x[1:5])

print(x[1:5*2])          # 冒號優先級更高,首先得到1-5這5個數據再乘以2

print(x[ x > 5 ])        # 邏輯表達式用x中每一個元素計算邏輯表達式的值做索引,得到的是原數組中x大於5的元素

print(mean(x))
print(x[ x > mean(x) ] ) # 邏輯表達中可以使用函數


names(x) <- LETTERS[1:10];print(x)   # 使用字符常數數組給向量命名,再通過變量名訪問向量中的元素
print(x["A"])

View(x)


# 計算向量的長度
print(length(x))



# 修改指定位置的向量元素
x <- 1:10;print(x)
x[5] <- 100;print(x)


# 追加向量元素增加向量長度
x <- 1:10;print(x)
x <- c(x,11,12,13);print(x)

# 直接在向量末尾寫入數據
x <- 1:10;print(x)
x[length(x)+1] <- 11;print(x)


# 在向量指定位置插入數據
# 並不是在原來的向量中插入數據而是返回一個新的向量
# after參數表示在原向量中的那個向量後面插入數據
x <- 1:10;print(x)
y <- append(x,11:13,after=0);print(x);print(y)
y <- append(x,11:13,after=5);print(x);print(y)




# 訪問列表
lst <- list(symbols=c("MSFT","KO","CSCO"),price=c(40.40,40.56,23.02),currency="USD",country="USA",type="STOCK" )
print(lst[1])
print(lst$symbols)

print(lst[[1]])        # 該列表的第一個元素是一個向量symbols

print(lst$symbols[1])  # 該列表中symbols向量的第一個元素


# 在列表末尾添加一個新的元素TradeDate
names(lst)
lst$TradeDate <- as.Date(rep("2014-4-17",3))
names(lst)


# 在列表任意位置添加一個新的元素
z <- list(plantform = rep("FXCM",3))
lst <- append(lst,z,after=0)
names(lst)
str(lst)


# 刪除列表中的指定項
names(lst)
lst$price <- NULL
names(lst)




# 矩陣訪問

data(EuStockMarkets)

print(head(EuStockMarkets))
print(class(EuStockMarkets))
print(summary(EuStockMarkets))

print(EuStockMarkets[,"DAX"])    # 輸出所有行,DAX列數據,直接使用列名稱訪問
print(EuStockMarkets[,1])        # 輸出所有行,第一列(德國DAX指數)數據,編寫大型程序時顯然不夠直觀

# 查看整個矩陣的數據,壞處是還需要手動關閉打開的頁面
View(EuStockMarkets)

# rowSums()計算矩陣每一行的和生成一個新向量
rowTotal <- rowSums(EuStockMarkets)
# 以列方式將每一行和向量接在矩陣之後形成有5列的新矩陣
EuStockMarkets <- cbind(EuStockMarkets,rowTotal)
View(EuStockMarkets)

# colSums()計算矩陣每一列的和生成一個新向量
colTotal <- colSums(EuStockMarkets)
# 以行方式將每一行和向量接在矩陣之後形成一個有新累加和行的矩陣
EuStockMarkets <- rbind(EuStockMarkets,colTotal)
print(tail(EuStockMarkets))


# 訪問數據框

df  <- data.frame(symbols=c("MSFT","KO","CSCO"),price=c(40.40,40.56,23.02),currency=rep("USD",3),country=rep("USA",3),type=rep("STOCK",3))
df

print(class(df))

print(df[1,])   # 通過行列號訪問數據框的一行
print(df[,2])   # 通過行列號訪問數據框的一列


print(df$price) # 用列名稱是更好、更直觀的方式


# 如果需要多次訪問數據框中的數據列可以將數據框名稱加入到搜索路徑中
# 這樣就可以直接使用數據列名稱
attach(df)

  print(currency)
  print(type)

detach(df)

}





# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   05、R的重要數據分析函數 #######################################################################################

# 課程內容:介紹R中很多重要、常用的數據分析函數

{

# 顯示加載到內存中的變量和函數名稱
ls()

# 顯示加載到內存中的變量和函數的詳細信息
ls.str()


# 計算返回向量中最大、最小的元素的索引值
x <- 1:100
print(which.max(x))
print(which.min(x))

# 如果向量中存在多個相等的最大、最小值返回的是第一個最大、最小值的索引
x <- c(1,2,5,2,1,5)
print(which.max(x))
print(which.min(x))

# 返回最大、最小值
print(max(x))
print(min(x))



# 對向量進行排序,默認採用升序排序方式
x <- c(3,5,2,8,6,9,7,4)
print(sort(x))
print(sort(x,decreasing=T))   # 默認的降序參數設置爲F,如果設置爲T則採用降序排序


# 日期字符串向量
szDate <- c("2014-1-1","2014-3-1","2014-3-18","2014-2-14","2014-4-26","2014-4-1","2014-1-24")
# 通過as.Date()函數生成日期序列
# 注意:R語言中很多函數都可以使用向量做參數
t <- as.Date(szDate)
# sort()函數可以對日期序列做排序操作
t <- sort(t);print(t)


# rev()函數對向量做逆序處理
x <- c(3,5,2,8,6,9,7,4)
print(x);print(rev(x))


# 上例中的日期型數據同樣可以逆序排列
print(t);print(rev(t))


# 獲取遊程的信息
x <- c(1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1)
y <- rle(x)
print(mode(y))
str(y)


# 按照大小對向量數據做分類處理,可以用於繪製直方圖
x <- rnorm(n=10,mean=10,5)
print(x)
breaks <- c(-20,-10,0,10,20)   # 分割數據的邊界數值向量
y <- cut(x,breaks)
print(summary(y))


# 在向量中查找指定數據(數據可用向量形式給出),此函數返回一個和原向量等長的向量
# 存在待匹配數據的位置上標記爲N(第N個待匹配數據就標記N)
x <- c(2,5,1,4,6,4,3)
print(match(x,4))
print(match(x,c(4,5)))


# 計算組合數/排列數
print(choose(5,2))
print(factorial(3))


# 符號函數
# 每日股市上漲下跌收益率有正有負可以用sign()函數生成1,-1,0組成的遊程序列
cat("sign()函數運算結果:",sign(0),",",sign(3.14159),",",sign(-1024),sep="")



# 刪除向量、矩陣、數據框中的NA值
x <- c(1,2,NA,4,5,NA,7,6,8,9)

y <- na.omit(x);print(y);
print(length(y));print(class(y))

dim(x) <- c(5,2)
print(x)
print(na.omit(x)) # 刪除數組中的NA值的規則是刪除含有NA值的整行數據

# 交易品的歷史數據中可能存在NA數值,使用na.omit()函數將會刪除整條歷史記錄


# 檢測向量、矩陣、數據框中是否包含NA數值,如果包含返回錯誤信息
x <- c(1,2,NA,4,5,NA,7,6,8,9)
y <- na.omit(x)
na.fail(x)
na.fail(y)

dim(x) <- c(2,5)
na.fail(x)


# 去除向量中的重複數據
x <- c(1,2,NA,2,5,NA,4,3,4,9)
print(unique(x))


# subset()從數據框中取出滿足條件的子集
# 對於歷史行情數據、歷史交易記錄可以很方便的取出其中感興趣的數據
data(airquality)
head(airquality)
newset <- subset(airquality,Temp > 80 & Month == 5,select = c(Ozone:Day))
head(newset)


}





# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   06、R基礎繪圖技術 ##############################################################################################

# 課程內容: 詳細介紹基礎的R繪圖技術

{

x <- 1:100
y <- 100 + x*5
windows(300,200);plot(y)

windows(300,200);plot(y,type="l")


# 生成100個正態分佈隨機數並繪圖
x <- rnorm(100,10,5)
plot(x)


# 繪製1000個正態分佈隨機數的頻數直方圖
x <- rnorm(1000,30,10)
hist(x)



# 使用核密度估計函數density(),在直方圖上繪製密度曲線
# hist()函數必須設置freq參數爲F才能顯示密度曲線
x <- rnorm(1000,30,10)
hist(x,freq=F)
lines(density(x),col="blue")
box()


# 莖葉圖很直觀的表現出數據的分佈情況
x <- rnorm(100,5,1)
stem(x)


# 繪製10個正態分佈隨機數的條形圖
x <- rnorm(10,30,10);barplot(x)
box() # 在當前圖上加個方框


# 繪製餅圖
x <-1:5;pie(x,col=rainbow(5))
box()


# 繪製箱線圖
# 中間黑線爲中位數位置;上下框線爲上下四分位數位置;上下觸鬚爲1.5倍四分位數間距;如果有孤立點表示異常值
x <-rnorm(10,10,3);boxplot(x)


# 繪製向日葵圖
data(iris)
sunflowerplot(iris[,3:4])


# 繪製矩陣或數據框的二元圖
data(iris)
pairs(iris[1:4], main = "Anderson's Iris Data -- 3 species",pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])



# 繪製QQ圖
# 如果向量爲正態分佈則數據點基本在一條直線上
x <- rnorm(500,10,5);qqnorm(x)



# 根據指定函數繪製指定範圍的曲線圖
curve(sin, -2*pi, 2*pi, xname = "t")




# 低水平繪圖函數:在高水平繪圖函數繪製的圖形上做補充和修飾

# 生成50個正態分佈隨機數並繪圖
x <- 1:50
y <- rnorm(50,10,5)
plot(x,y,type="n",xlab="數據索引",ylab="隨機數點",xlim=c(1,50),ylim=c(-20,20),main="實驗圖",sub="隨機數繪圖")
points(x,y,col="blue")
lines(x,y,col="red")

text(5,max(y),"隨機數據點")           # 在指定座標位置放置文本

mtext("橫軸下方文字",side=1)          # 橫軸、縱軸上放置文字
mtext("縱軸左方文字",side=2)
mtext("橫軸上方文字",side=3)
mtext("縱軸右方文字",side=4)

segments(10,10,50,-10)                # 根據起點、終點座標繪製線段

arrows(10,-10,40,20,angle=15,code=1) # 繪製帶箭頭線段,可以設置箭頭角度,有幾個箭頭(1起點箭頭、2終點箭頭,3雙箭頭)

abline(-20,.5) # 在圖上繪製直線,第一個參數爲截距,第二個參數爲斜率

abline(h=0,col="red") # 在圖上繪製水平線或垂直線,可以標示臨界位置,很好用的功能

legend(0,max(y),"隨機點連線")




# 座標定位模式獲得鼠標點擊位置的座標
x <- 1:50
y <- rnorm(50,10,5)
plot(x,y,type="n",xlab="數據索引",ylab="隨機數點",xlim=c(1,50),ylim=c(-20,20),main="實驗圖")
print(locator(3,type="p")) # 圖像進入定位模式,第一個參數決定獲取幾個點的座標信息,第二個參數決定繪圖方式

rect(5,5,20,20) # 在已經成功繪製的圖形內部繪製一個長方形

polygon(c(20,10,30,40,45),c(-10,0,15,4,-10)) # 在高級圖形內部繪製多邊形




# 生成一個繪圖窗口在其中繪製圖形後用savePlot()函數保存
windows()
plot(1:10)
rect(1, 5, 3, 7, col="blue")
savePlot("test01", type="jpg",device=dev.cur(),restoreConsole=TRUE)



# 直接在jpeg設備上繪製圖形,完成後使用dev.off()關閉設備,存盤退出
jpeg(file="myplot.jpeg")
plot(1:10)
rect(1, 5, 3, 7, col="blue")
dev.off()

}





# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   07、金融數據獲取 ###############################################################################################

# 課程內容:從雅虎金融等數據網站獲取:各國股票、股指、債券、ETF基金、匯率、金屬、期權等交易品種歷史數據和上市公司年報數據

{

library(quantmod)


# 不設置來源則默認從雅虎金融下載;
# 雅虎金融上大量指數品種都以"^"開頭
# from,to參數設置讀取歷史數據的時間段
getSymbols("^GSPC",src="yahoo",from="1994-1-1",to=Sys.Date()) 
print(head(GSPC));print(tail(GSPC))
print(class(GSPC))
print(is.OHLC(GSPC))
print(is.OHLCV(GSPC))


# 從雅虎金融讀取著名的蘋果公司的全部股票數據
getSymbols("AAPL",src="yahoo",from="1900-1-1",to=Sys.Date()) 
print(head(AAPL));print(tail(AAPL))


# 從雅虎金融讀取著名港股長江實業的股票數據
# 港股和大陸A股類似使用數字編號,雅虎金融上面有全球幾十個市場的數據需要進行區分
# 美股不使用後綴而其他國家或地區的股票需要使用後綴:大陸滬市使用:".SS",深市使用:".SZ",香港使用:".HK"
setSymbolLookup(CJSY=list(name="0001.HK",src="yahoo"))   # 在函數內部用列表指明股票代碼和查詢網站並指定一個變量名便於保存
getSymbols("CJSY",from="1900-1-1",to=Sys.Date()) 
print(head(CJSY));print(tail(CJSY))



# 用字符串向量保存股票代碼一次下載一組股票數據
# 下載股票數量超過5種時系統會自動暫停1秒
szSymbols <- c("MSFT","ORCL","GOOG","INTL","AAPL","CSCO","SYMC","TSLA")
getSymbols(szSymbols,src="yahoo",from="2008-1-1",to=Sys.Date()) 


# 美國10年期債券收益率
getSymbols("^TNX",src="yahoo",from="1900-1-1",to=Sys.Date()) 
print(head(TNX));print(tail(TNX))



# ETF基金,伊斯蘭地區ETF基金,2008-03-28
getSymbols("ACWI",src="yahoo",from="1900-1-1",to=Sys.Date()) 
print(head(ACWI));print(tail(ACWI))



# 獲取美元兌日元匯率數據
# 只能獲取最近1年多的匯率歷史數據,並且只有收盤價
getFX("USD/JPY")
print(head(USDJPY));print(tail(USDJPY))



# 獲取歐元兌美元匯率數據
getSymbols("EUR/USD",src="oanda")
print(head(EURUSD));print(tail(EURUSD))



# 運行這一段代碼會出現錯誤,該數據源每次請求只能獲取500天以內的數據
# 外匯是極其重要的交易品種,每天成交量超過5.3萬億美金,大型對衝基金都要操作
# 獲取超過30年,每天OHLC歷史數據的方法在第9課中詳細介紹
getSymbols("EUR/USD",src="oanda",from="2005-01-01")


# 獲取交易品當前最新的詳細報價數據信息
tmp <- getQuote("AAPL");print(tmp);print(class(tmp))


# 獲取財報信息
getFinancials("TSLA")
viewFin(TSLA.f)

viewFin(TSLA.f,"CF","A")    #  每年的現金流


# 獲得股票的股息歷史數據
getDividends("AAPL")


# 獲得股票的拆分信息
getSplits("BIDU")



# 對股票進行除權除息調整
# 除權除息對於早期歷史數據影響更明顯
getSymbols("BIDU", from="2005-01-01", src="yahoo")
head(BIDU)
head(BIDU.a  <- adjustOHLC(BIDU))   # 默認調整方式不使用Adjusted列的數據
head(BIDU.uA <- adjustOHLC(BIDU, use.Adjusted=T)) 


# 計算除權除息之後的開盤價收盤價收益率和收盤價收益率,保持不變
head(cbind(OpCl(BIDU),OpCl(BIDU.a),OpCl(BIDU.uA)))
head(cbind(ClCl(BIDU),ClCl(BIDU.a),ClCl(BIDU.uA)))



# 獲取期權信息
# 期權是極爲重要的交易品種

BIDU.OPT <- getOptionChain("BIDU")
print(class(BIDU.OPT))  # 獲取的期權鏈數據保存在列表中
print(BIDU.OPT)         # 顯示全部期權鏈數據量非常大
print(BIDU.OPT$symbol)  # 顯示期權鏈列表中的symbol數據
print(BIDU.OPT$calls)   # 顯示期權鏈列表中的看漲期權數據


}





# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   08、金融數據繪圖與技術指標 #####################################################################################

# 課程內容:金融時間序列的繪圖、quantmod軟件包中的專用函數繪圖、把常用技術指標、成交量等內容加入圖形

{

  # 
  getSymbols("^GSPC",src="yahoo",from="2004-1-1",to="2014-1-1")

  tail(GSPC)

  GSPCClose <- Cl(GSPC)

  tail(GSPCClose)  

  # plot()是泛型函數能夠根據輸入自變量的類型不同調用不同模塊繪製圖形
  # 只能對收盤價這樣的單個數據點繪圖
  windows()
  plot(GSPCClose)


  # chartSeries() 繪圖
  # 函數可以直接接受OHLCV時間序列作爲輸入
  windows()
  chartSeries(GSPC)


  # 只用收盤價數據也沒問題
  windows()
  chartSeries(GSPCClose)  


  # chartSeries()詳細參數使用
  windows()
  chartSeries(GSPC,
              name="標普500走勢圖",
              type="candlesticks",
              subset="2012/2013",        # ISO8601風格的字符串用於表示時間範圍
              TA=NULL,                   # 默認使用"addVo()"將成交量顯示在圖形底部,設置爲NULL增加顯示範圍
              theme=chartTheme("white")) # 使用名爲"white"的繪圖主題

  # 獲取white繪圖主題的參數
  theme.white <- chartTheme("white")

  # 查看繪圖主題所有參數
  names(theme.white)

  theme.white$up.col <- "red"
  theme.white$dn.col <- "white"
  theme.white$border <- "lightgray"


  windows()
  chartSeries(GSPC,
              name="標普500走勢圖",
              type="candlesticks",
              subset="2013-6/",        # 2013年6月到最後一個數據
              TA=NULL,     
              theme=theme.white)       # 使用參數經過修改的繪圖主題


  # 使用文字描述的取子集功能
  windows()
  chartSeries(GSPC,
              name="標普500走勢圖",
              show.grid = T,           # 無論是否使用此參數都看到
              type="candlesticks",
              subset="last 3 months",  # 使用文字描述,最後3個月時間序列值
              TA="addVo()",            # 加入成交量數據
              theme=theme.white)       



  # reChart()的大多數參數和chartSeries()相似用於對最新繪製的圖形做修改
  reChart(theme=chartTheme("black"),
          subset="last 6 months")  


  # 加入多個技術指標
  windows()
  chartSeries(GSPC,
              name="標普500走勢圖",
              show.grid = T,             # 無論是否使用此參數都看到
              type="candlesticks",
              subset="last 2 quarters",  # 使用文字描述,最後2個季度的時間序列值
              TA="addVo();addSMA(20);addBBands(20,3)", # 加入簡單移動平均線和布林線指標,不是指標函數
              theme=theme.white)         # 使用參數經過修改的繪圖主題


  # chartSeries()函數繪製出的圖形通過zooom()函數做縮放操作
  # n   每次調用函數時交互圖形變化的倍數
  # eps 點擊鼠標幾次圖形發生改變
  zooom(n=1,eps=2)


  # 放大2012年的歷史數據
  zoomChart("2012")

  # 放大2012年9月的歷史數據,第三輪QE啓動
  zoomChart("2012-9")

  # 直接使用addCCI()函數在當前圖形上添加新技術指標
  addCCI(20)


  windows()
  chartSeries(GSPC,
              name="標普500走勢圖",
              show.grid = T,             # 無論是否使用此參數都看到
              type="candlesticks",
              subset="last 2 quarters",  # 使用文字描述,最後2個季度的時間序列值
              TA="addVo();addSMA(20);addBBands(20,3)", # 加入簡單移動平均線和布林線指標,不是指標函數
              theme=theme.white)         # 使用參數經過修改的繪圖主題  


  # 默認使用的是"pdf"參數,圖形被保存在當前目錄下
  # 運行時經常出錯
  saveChart(.type="jpeg",dev=dev.cur())



  # 使用jpeg()和dev.off()函數配合保存繪製的圖形到JPEG文件中
  jpeg("GSPC.jpeg")
  chartSeries(GSPC,
              name="標普500走勢圖",
              show.grid = T,             # 無論是否使用此參數都看到
              type="candlesticks",
              subset="last 2 quarters",  # 使用文字描述,最後2個季度的時間序列值
              TA="addVo();addSMA(20);addBBands(20,3)", # 加入簡單移動平均線和布林線指標,不是指標函數
              theme=theme.white)         # 使用參數經過修改的繪圖主題  
  dev.off()

}





# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   09、金融數據文件讀寫 ##########################################################################################

# 課程內容:將獲取到的金融數據寫入多種不同的文件;讀取大智慧導出數據文件;讀取MT4導出數據文件

{

   getSymbols("^GSPC",src="yahoo",from="2004-1-1",to="2014-1-1")
   tail(GSPC)

   # 將保存歷史記錄的數據框直接寫入本地RDATA文件
   save(GSPC,file="GSPC.RDATA")

   # 刪除變量GSPC之後,內存中無內容無法訪問
   rm(GSPC)
   tail(GSPC)

   # load()函數可以裝載save()函數保存的歷史數據
   load("GSPC.RDATA")
   tail(GSPC)   



   # 讀取CSV文件
   # header=T,表示文件存在表示數據含義的數據頭部
   # skip=0,表示數據中沒有需要跳過的行
   TRData <- read.csv("TradeRecord.csv",header=T,skip=0)
   head(TRData)


   # 將csv數據寫入文件
   # 如果這樣直接寫入會保留行號不利於後續分析,並增加文件大小
   write.csv(TRData,file="WriteTR.csv")   

   # 設置參數不寫入
   write.csv(TRData,file="WriteTR.csv",row.names=F)



   # 讀取內存數據文件
   # 打開Excel文件,拷貝相關交易數據
   # read.table()具備從內存剪貼板中讀取數據
   TRData <- read.table("clipboard", header = T, sep = "\t")
   head(TRData)



   # 從普通文本中讀取數據
   # 打開大智慧軟件查找EURUSD品種,找到歐元兌美元匯率
   # 將數據拷貝到剪貼板中並保存到文本文件中
   # 使用read.table()讀取文件
   EURUSD <- read.table("DZHEURUSD.txt", header = T, skip=1,sep = "\t")
   head(EURUSD);tail(EURUSD)


   # 1989-7-17以來的英鎊兌美元歷史數據
   GBPUSD <- read.table("DZHGBPUSD.txt", header = T, skip=1,sep = "\t")
   head(GBPUSD);tail(GBPUSD)   



   # 從網站上讀取所有表格文件
   library(XML)
   url <- "http://en.wikipedia.org/wiki/world_population"
   tbls <- readHTMLTable(url)

   # 分析tbls的類型爲列表
   print(class(tbls))
   str(tbls)
   print(length(tbls))

   # 輸出表格列表中的第一個元素
   tbls[[1]]


   # 從MT4平臺導出數據的方法
   # MT4也是外盤重要的交易平臺,當我們沒有特定品種數據時可以從MT4中導出文本文件
   # 注意:MT4表示時間時使用"."做分割如:2014.4.18,這種格式R語言無法直接讀取
   # 要麼編寫一個MT4腳本讀取到歷史數據之後提取年月日信息然後轉換成標準的2014/4/18字符串形式
   # 要麼明確日期字符串格式類型,然後轉換
   as.Date("2014.4.18",format="%Y.%m.%d")


   # MT4中導出HKG33數據寫爲文本文件然後讀取
   HKG33 <- read.table("HKG33.TXT", header = T,sep = "\t")
   head(HKG33);tail(HKG33)      

}





# 加百力諮詢: 《R語言與金融大數據處理》 - 《基礎篇》 (v1.0)
# 主講人:加百力

###   10、加百力的R語言、金融大數據處理學習建議 #######################################################################

# 課程內容:介紹加百力總結的深入學習R語言,提升開發功力、金融大數據處理能力的方法 

# R語言的特點是:功能極其強大;各種輔助軟件包千差萬別(多達數千種);
# 函數功能豐富(每個包中常有幾十甚至上百個高價值函數)

# 基於R語言的特點有以下幾條建議

# 1、規避陷阱:慎入羣、慎入論壇、慎提問、慎寫代碼

# 2、學習策略:循序漸進、多讀經典圖書;多讀系統幫助;多寫測試代碼;
#    站在巨人的肩膀上(不是自己慢慢寫代碼實現已存在功能)

# 3、初級階段:制訂長遠學習計劃;堅持讀書、成體系、成系統的學習R語言

# 4、中高級階段:以軟件包爲核心。加百力曰:不學擴展包,腦袋就長包

# 5、高級方法:掃描式學習軟件包;建立自己的示例代碼庫;翻譯擴展軟件包;製作電子檔(學習筆記)發佈



# 提升金融大數據處理能力的幾條建議

# 1、多積累交易品基礎知識:外匯、股指、能源、金屬、農產品、信用產品、ETF基金
#    瞭解的越多,交易盈利的機會越多,風險越小

# 2、多積累極端市場行情的案例:1987年股災、1994年債券市場崩潰、1997年亞洲金融危機
#    1998年俄羅斯債務危機、2008年次級債危機

# 3、多積累前輩成功、失敗的案例。前輩遇到的情況我們也會遇到,模型是否能夠扛住

# 4、多思考成功案例背後的通用模式、模型:很多案例有類似的模式如公司危機模式、季節模式、
#    計劃事件模式都可以總結成數學模型

# 5、多積累跨學科模型:氣候模型、天體物理模型、神經網絡、小波分析等都有可能應用於投資實戰,
#    積累的模型越多越能發現新規律

# 6、多積累代碼經驗、多思考、多測試。不滿足於拍腦門、想當然的下結論,而是用實際歷史數據說話
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章