原文鏈接:http://tecdat.cn/?p=16453
金融市場上最重要的任務之一就是分析各種投資的歷史收益。要執行此分析,我們需要資產的歷史數據。數據提供者很多,有些是免費的,大多數是付費的。在本文中,我們將使用Yahoo金融網站上的數據。
在這篇文章中,我們將:
- 下載收盤價
- 計算收益率
- 計算收益的均值和標准差
讓我們先加載庫。
-
library(tidyquant)
-
library(timetk)
我們將獲得Netflix價格的收盤價。
-
netflix <- tq_get("NFLX",
-
from = '2009-01-01',
-
to = "2018-03-01",
-
get = "stock.prices")
接下來,我們將繪制Netflix的調整后收盤價。
-
netflix %>%
-
ggplot(aes(x = date, y = adjusted)) +
-
geom_line() +
-
ggtitle("Netflix since 2009") +
-
labs(x = "Date", "Price") +
-
scale_x_date(date_breaks = "years", date_labels = "%Y") +
-
labs(x = "Date", y = "Adjusted Price") +
-
theme_bw()

計算單個股票的每日和每月收益率
一旦我們從Yahoo Finance下載了收盤價,下一步便是計算收益。我們將再次使用tidyquant包進行計算。我們已經在上面下載了Netflix的價格數據,如果您還沒有下載,請參見上面的部分。
-
# 計算每日收益
-
-
netflix_daily_returns <- netflix %>%
-
tq_transmute(select = adjusted, 這指定要選擇的列
-
mutate_fun = periodReturn, # 這指定如何處理該列
-
period = "daily", # 此參數計算每日收益
-
col_rename = "nflx_returns") # 重命名列
-
-
#計算每月收益
-
netflix_monthly_returns <- netflix %>%
-
tq_transmute(select = adjusted,
-
mutate_fun = periodReturn,
-
period = "monthly", # 此參數計算每月收益
-
col_rename = "nflx_returns")
繪制Netflix的每日和每月收益圖表
-
# 我們將使用折線圖獲取每日收益
-
-
-
ggplot(aes(x = date, y = nflx_returns)) +
-
geom_line() +
-
theme_classic() +

查看Netflix的每日收益圖表后,我們可以得出結論,收益波動很大,並且股票在任何一天都可以波動+/- 5%。為了了解收益率的分布,我們可以繪制直方圖。
-
netflix_daily_returns %>%
-
ggplot(aes(x = nflx_returns)) +
-
geom_histogram(binwidth = 0.015) +
-
theme_classic() +

接下來,我們可以繪制自2009年以來Netflix的月度收益率。我們使用條形圖來繪制數據。
-
# 繪制Netflix的月度收益圖表。 使用條形圖
-
-
-
ggplot(aes(x = date, y = nflx_returns)) +
-
geom_bar(stat = "identity") +
-
theme_classic() +

計算Netflix股票的累計收益
繪制每日和每月收益對了解投資的每日和每月波動很有用。要計算投資的增長,換句話說,計算投資的總收益,我們需要計算該投資的累積收益。要計算累積收益,我們將使用 cumprod() 函數。
-
-
mutate(cr = cumprod(1 + nflx_returns)) %>% # 使用cumprod函數
-
-
ggplot(aes(x = date, y = cumulative_returns)) +
-
geom_line() +
-
theme_classic() +

該圖表顯示了自2009年以來Netflix的累計收益。有了事后分析的力量, 自2009年以來,可以用1美元的投資賺取85美元。但據我們所知,說起來容易做起來難。在10年左右的時間里,在Qwickster慘敗期間投資損失了其價值的50%。在這段時期內,很少有投資者能夠堅持投資。
-
ggplot(aes(x = date, y = cumulative_returns)) +
-
geom_line() +
-
theme_classic() +

我們可以直觀地看到,月收益表比日圖表要平滑得多。
多只股票
下載多只股票的股票市場數據。
-
#將我們的股票代碼設置為變量
-
-
tickers <- c("FB", "AMZN", "AAPL", "NFLX", "GOOG")
-
-
# 下載股價數據
-
-
multpl_stocks <- tq_get(tickers,
繪制多只股票的股價圖
接下來,我們將繪制多只股票的價格圖表
-
multpl_stocks %>%
-
ggplot(aes(x = date, y = adjusted,

這不是我們預期的結果。由於這些股票具有巨大的價格差異(FB低於165,AMZN高於1950),因此它們的規模不同。我們可以通過按各自的y比例繪制股票來克服此問題。
-
-
facet_wrap(~symbol, scales = "free_y") + # facet_wrap用於制作不同的頁面
-
theme_classic() +

計算多只股票的收益
計算多只股票的收益與單只股票一樣容易。這里只需要傳遞一個附加的參數。我們需要使用參數 group_by(symbol) 來計算單個股票的收益。
-
#計算多只股票的每日收益
-
-
tq_transmute(select = adjusted,
-
mutate_fun = periodReturn,
-
period = 'daily',
-
col_rename = 'returns')
-
-
#計算多只股票的月收益
-
-
-
tq_transmute(select = adjusted,
-
mutate_fun = periodReturn,
-
period = 'monthly',
-
col_rename = 'returns')
繪制多只股票的收益圖表
一旦有了收益計算,就可以在圖表上繪制收益。
-
multpl_stock_daily_returns %>%
-
ggplot(aes(x = date, y = returns)) +
-
geom_line() +
-
geom_hline(yintercept = 0) +

-
multpl_stock_monthly_returns %>%
-
ggplot(aes(x = date, y = return
-
scale_fill_brewer(palette = "Set1", # 我們會給他們不同的顏色,而不是黑色

在FAANG股票中,蘋果的波動最小,而Facebook和Netflix的波動最大。對於他們從事的業務而言,這是顯而易見的。Apple是一家穩定的公司,擁有穩定的現金流量。它的產品受到數百萬人的喜愛和使用,他們對Apple擁有極大的忠誠度。Netflix和Facebook也是令人難以置信的業務,但它們處於高增長階段,任何問題(收益或用戶增長下降)都可能對股票產生重大影響。
計算多只股票的累計收益
通常,我們希望看到過去哪種投資產生了最佳效果。為此,我們可以計算累積結果。下面我們比較自2013年以來所有FAANG股票的投資結果。哪項是自2013年以來最好的投資?
-
multpl_stock_monthly_returns %>%
-
mutate(returns e_returns = cr - 1) %>%
-
ggplot(aes(x = date, y = cumulative_returns, color = symbol)) +
-
geom_line() +
-
labs(x = "Date"

毫不奇怪,Netflix自2013年以來獲得了最高的收益。亞馬遜和Facebook位居第二和第三。
統計數據
計算單個股票的均值,標准差
我們已經有了Netflix的每日和每月收益數據。現在我們將計算收益的每日和每月平均數和標准差。 為此,我們將使用 mean() 和 sd()函數。
-
# 計算平均值
-
-
.[[1]] %>%
-
mean(na.rm = TRUE)
-
-
nflx_monthly_mean_ret <- netfl turns) %>%
-
.[[1]] %>%
-
mean(na.rm = TRUE)
-
-
# 計算標准差
-
-
nflx_daily_sd_ret <- netflirns) %>%
-
.[[1]] %>%
-
sd()
-
-
nflx_monthly_sd_ret <- netflix_rns) %>%
-
.[[1]] %>%
-
sd()
-
nflx_stat
-
## # A tibble: 2 x 3
-
## period mean sd
-
## <chr> <dbl> <dbl>
-
## 1 Daily 0.00240 0.0337
-
## 2 Monthly 0.0535 0.176
我們可以看到Netflix的平均每日收益為0.2%,標准差為3.3%。它的月平均回報率是5.2%和17%標准差。該數據是自2009年以來的整個時期。如果我們要計算每年的均值和標准差,該怎么辦。我們可以通過按年份對Netflix收益數據進行分組並執行計算來進行計算。
-
netflix %>%
-
summarise(Monthly_Mean_Returns = mean(nflx_returns),
-
MOnthly_Standard_Deviation = sd(nflx_returns)
-
## # A tibble: 10 x 3
-
## year Monthly_Mean_Returns MOnthly_Standard_Deviation
-
## <dbl> <dbl> <dbl>
-
## 1 2009 0.0566 0.0987
-
## 2 2010 0.110 0.142
-
## 3 2011 -0.0492 0.209
-
## 4 2012 0.0562 0.289
-
## 5 2013 0.137 0.216
-
## 6 2014 0.00248 0.140
-
## 7 2015 0.0827 0.148
-
## 8 2016 0.0138 0.126
-
## 9 2017 0.0401 0.0815
-
## 10 2018 0.243 0.233
我們還可以繪制結果更好地理解。
-
netflix_monthly_returns %>%
-
mutate(year = rns, Standard_Deviation, keyistic)) +
-
geom_bar(stat = "identity", position = "dodge") +
-
scale_y_continuous(b ) +
-
theme_bw() +

我們可以看到,自2009年以來,每月收益和標准差波動很大。2011年,平均每月收益為-5%。
計算多只股票的均值,標准差
接下來,我們可以計算多只股票的均值和標准差。
-
-
group_by(symbol) %>%
-
summarise(mean = mean(returns),
-
sd = sd(returns))
-
## # A tibble: 5 x 3
-
## symbol mean sd
-
## <chr> <dbl> <dbl>
-
## 1 AAPL 0.00100 0.0153
-
## 2 AMZN 0.00153 0.0183
-
## 3 FB 0.00162 0.0202
-
## 4 GOOG 0.000962 0.0141
-
## 5 NFLX 0.00282 0.0300
-
group_by(symbol) %>%
-
summarise(mean = mean(returns),
-
sd = sd(returns))
-
## # A tibble: 5 x 3
-
## symbol mean sd
-
## <chr> <dbl> <dbl>
-
## 1 AAPL 0.0213 0.0725
-
## 2 AMZN 0.0320 0.0800
-
## 3 FB 0.0339 0.0900
-
## 4 GOOG 0.0198 0.0568
-
## 5 NFLX 0.0614 0.157
計算收益的年均值和標准差。
-
%>%
-
group_by(symbol, year) %>%
-
summarise(mean = mean(returns),
-
sd = sd(returns))
-
## # A tibble: 30 x 4
-
## # Groups: symbol [?]
-
## symbol year mean sd
-
## <chr> <dbl> <dbl> <dbl>
-
## 1 AAPL 2013 0.0210 0.0954
-
## 2 AAPL 2014 0.0373 0.0723
-
## 3 AAPL 2015 -0.000736 0.0629
-
## 4 AAPL 2016 0.0125 0.0752
-
## 5 AAPL 2017 0.0352 0.0616
-
## 6 AAPL 2018 0.0288 0.0557
-
## 7 AMZN 2013 0.0391 0.0660
-
## 8 AMZN 2014 -0.0184 0.0706
-
## 9 AMZN 2015 0.0706 0.0931
-
## 10 AMZN 2016 0.0114 0.0761
-
## # ... with 20 more rows
我們還可以繪制此統計數據。
-
multpl_stock_monthly_returns %>%
-
mutate(year = year(date)) %>%
-
group_by(symbol, yea s = seq(-0.1,0.4,0.02),
-
labels = scales::percent) +
-
scale_x_continuous(breaks = seq(2009,2018,1)) +
-
labs(x = "Year", y = Stocks") +
-
ggtitle

-
multpl_stock_monthly_returns %>%
-
mutate(year = year(date)) %>%
-
ggplot(aes(x = year, y = sd, fill = symbol)) +
-
geom_bar(stat = "identity", position = "dodge", width = 0.7) +
-
scale_y_continuous(breaks = seq(-0.1,0.4,0.02),
-
labels = scales::p
-
scale_fill_brewer(palette = "Set1",

計算多只股票的協方差和相關性
另一個重要的統計計算是股票的相關性和協方差。為了計算這些統計數據,我們需要修改數據。我們將其轉換為xts對象。
協方差表
-
#計算協方差
-
-
tk_xts(silent = TRUE) %>%
-
cov()
-
## AAPL AMZN FB GOOG NFLX
-
## AAPL 5.254736e-03 0.001488462 0.000699818 0.0007420307 -1.528193e-05
-
## AMZN 1.488462e-03 0.006399439 0.001418561 0.0028531565 4.754894e-03
-
## FB 6.998180e-04 0.001418561 0.008091594 0.0013566480 3.458228e-03
-
## GOOG 7.420307e-04 0.002853157 0.001356648 0.0032287790 3.529245e-03
-
## NFLX -1.528193e-05 0.004754894 0.003458228 0.0035292451 2.464202e-02
相關表
-
# 計算相關系數
-
-
%>%
-
tk_xts(silent = TRUE) %>%
-
cor()
-
## AAPL AMZN FB GOOG NFLX
-
## AAPL 1.000000000 0.2566795 0.1073230 0.1801471 -0.001342964
-
## AMZN 0.256679539 1.0000000 0.1971334 0.6276759 0.378644485
-
## FB 0.107322952 0.1971334 1.0000000 0.2654184 0.244905437
-
## GOOG 0.180147089 0.6276759 0.2654184 1.0000000 0.395662114
-
## NFLX -0.001342964 0.3786445 0.2449054 0.3956621 1.000000000
我們可以使用corrplot() 包來繪制相關矩陣圖。
## corrplot 0.84 loaded
-
-
cor() %>%
-
corrplot()


最受歡迎的見解
1.用機器學習識別不斷變化的股市狀況—隱馬爾科夫模型(HMM)的應用
