My Github Pages
by Yeung Ka Ming, CFA
66 constituent stocks in Hang Seng Index. Stock prices can be downloaded and plot by below.
library(quantmod)
library(tidyverse)
library(ggplot2)
Direct download by getSymbols
tickers <- c('0001.HK','0002.HK','0003.HK','0005.HK',
'0006.HK','0011.HK','0012.HK','0016.HK',
'0017.HK','0027.HK','0066.HK','0101.HK',
'0175.HK','0241.HK','0267.HK','0288.HK',
'0291.HK','0386.HK','0388.HK','0669.HK',
'0688.HK','0700.HK','0762.HK','0823.HK',
'0857.HK','0868.HK','0883.HK','0939.HK',
'0941.HK','0960.HK','0968.HK','0992.HK',
'1038.HK','1044.HK','1093.HK','1109.HK',
'1113.HK','1177.HK','1211.HK','1299.HK',
'1398.HK','1810.HK','1876.HK','1928.HK',
'1997.HK','2007.HK','2018.HK','2020.HK',
'2269.HK','2313.HK','2318.HK','2319.HK',
'2331.HK','2382.HK','2388.HK','2628.HK',
'2688.HK','3690.HK','3968.HK','3988.HK',
'6098.HK','6862.HK','9618.HK','9633.HK',
'9988.HK','9999.HK')
hkport <- new.env()
getSymbols(tickers,
env=hkport,
src = "yahoo",
index.class = "POSIXct",
from = "2022-01-01")
## [1] "0001.HK" "0002.HK" "0003.HK" "0005.HK" "0006.HK" "0011.HK" "0012.HK" "0016.HK" "0017.HK" "0027.HK" "0066.HK" "0101.HK" "0175.HK" "0241.HK"
## [15] "0267.HK" "0288.HK" "0291.HK" "0386.HK" "0388.HK" "0669.HK" "0688.HK" "0700.HK" "0762.HK" "0823.HK" "0857.HK" "0868.HK" "0883.HK" "0939.HK"
## [29] "0941.HK" "0960.HK" "0968.HK" "0992.HK" "1038.HK" "1044.HK" "1093.HK" "1109.HK" "1113.HK" "1177.HK" "1211.HK" "1299.HK" "1398.HK" "1810.HK"
## [43] "1876.HK" "1928.HK" "1997.HK" "2007.HK" "2018.HK" "2020.HK" "2269.HK" "2313.HK" "2318.HK" "2319.HK" "2331.HK" "2382.HK" "2388.HK" "2628.HK"
## [57] "2688.HK" "3690.HK" "3968.HK" "3988.HK" "6098.HK" "6862.HK" "9618.HK" "9633.HK" "9988.HK" "9999.HK"
# auto.assign is FALSE, so an environment is used here.
# Unlike US stocks, # the tickers in HK stock market is
# by number, which cannot be the variable
# name in R. Further fine tune in next step.
head(Ad(hkport$`0001.HK`))
## 0001.HK.Adjusted
## 2022-01-03 51.30
## 2022-01-04 51.40
## 2022-01-05 52.55
## 2022-01-06 52.55
## 2022-01-07 52.95
## 2022-01-10 54.05
head(Cl(hkport$`0001.HK`))
## 0001.HK.Close
## 2022-01-03 51.30
## 2022-01-04 51.40
## 2022-01-05 52.55
## 2022-01-06 52.55
## 2022-01-07 52.95
## 2022-01-10 54.05
head(Op(hkport$`0001.HK`))
## 0001.HK.Open
## 2022-01-03 50.95
## 2022-01-04 51.60
## 2022-01-05 51.75
## 2022-01-06 52.65
## 2022-01-07 52.55
## 2022-01-10 53.25
head(Hi(hkport$`0001.HK`))
## 0001.HK.High
## 2022-01-03 51.70
## 2022-01-04 51.70
## 2022-01-05 52.95
## 2022-01-06 52.80
## 2022-01-07 53.00
## 2022-01-10 54.10
head(Lo(hkport$`0001.HK`))
## 0001.HK.Low
## 2022-01-03 50.50
## 2022-01-04 51.10
## 2022-01-05 51.30
## 2022-01-06 51.85
## 2022-01-07 52.15
## 2022-01-10 52.80
Prepare dataframe
## To get all the adjusted close prices
## into a single xts object
ad.HSI.xts <- Reduce(merge,eapply(hkport, Ad))
colnames(ad.HSI.xts) <- sub('X','',colnames(ad.HSI.xts))
ad.HSI.tbl <- as_tibble(fortify(ad.HSI.xts))
ad.HSI.long.tbl <- ad.HSI.tbl %>%
pivot_longer(!Index,
names_to = "tickers",
values_to = "Adjusted.Close")
ad.HSI.long.tbl
## # A tibble: 3,102 x 3
## Index tickers Adjusted.Close
## <dttm> <chr> <dbl>
## 1 2022-01-03 00:00:00 6098.HK.Adjusted 44.6
## 2 2022-01-03 00:00:00 3988.HK.Adjusted 2.83
## 3 2022-01-03 00:00:00 3690.HK.Adjusted 223.
## 4 2022-01-03 00:00:00 2628.HK.Adjusted 13
## 5 2022-01-03 00:00:00 0175.HK.Adjusted 21.3
## 6 2022-01-03 00:00:00 0012.HK.Adjusted 33.2
## 7 2022-01-03 00:00:00 0003.HK.Adjusted 12.3
## 8 2022-01-03 00:00:00 0823.HK.Adjusted 68.7
## 9 2022-01-03 00:00:00 0968.HK.Adjusted 13.2
## 10 2022-01-03 00:00:00 0288.HK.Adjusted 4.93
## # ... with 3,092 more rows
Plot graph
p3 <- ggplot(ad.HSI.long.tbl,
aes(x = Index,
y = Adjusted.Close,
color=tickers))
p3 +
geom_line(size = 1) +
xlab("Date") +
ylab("Adjusted Close")