以下示範用R套件來做:



載入套件

options(digits=4, scipen=100)
rm(list=ls(all=T))
Sys.setlocale('LC_ALL', 'C')
library(fPortfolio)
library(tseries)
library(quantmod)

下載線上交易資料

getSymbols('MSFT',from=as.Date('2016-07-01'),to=as.Date('2017-01-01'))
[1] "MSFT"

畫線圖、加趨勢線

chartSeries(MSFT)

addMACD() ; addBBands() 

下載道瓊成分股的歷史股價

DJIA = c('MMM',  'AXP',  'AAPL', 'BA',  'CAT', 'CVX',
         'CSCO', 'KO',   'DD',   'XOM', 'GE',  'GS',
         'HD',   'IBM',  'INTC', 'JNJ', 'JPM', 'MCD',
         'MRK',  'MSFT', 'NKE',  'PFE', 'PG',  'TRV',
         'UNH',  'UTX',  'VZ',   'V',   'WMT', 'DIS')
dd = as.Date(c('2015-04-01','2017-03-31'))

算出道瓊成分股的報酬率

mx =  sapply(DJIA, function(x) {
  G = getSymbols(x,from=dd[1],to=dd[2],auto.assign=F)
  as.numeric(Delt(G[,6])) })[-1,]
names(mx) = DJIA
ts = as.timeSeries(mx)

設定投資限制條件

cons = c('LongOnly')
spec = portfolioSpec()
setNFrontierPoints(spec) = 25
setSolver(spec) = "solveRquadprog"
frontier = portfolioFrontier(ts, spec, cons)

畫出效率前緣 (Efficient Frontier)

par(cex=0.7)
tailoredFrontierPlot(frontier)

算出最佳投資組合

par(cex=0.8)
weightsPlot(frontier,col=rainbow(length(DJIA)))

從投資網站下載個股評論

#library(devtools)
#install_github("mannau/tm.plugin.sentiment")
#install.package("tm.plugin.webmining")
library(tm.plugin.sentiment)
library(tm.plugin.webmining)
aapl = WebCorpus(GoogleFinanceSource("AAPL"))

對個股評論做情緒分析

aapl <- score(aapl)
sentixts <- metaXTS(aapl)
chartSentiment(sentixts)

LS0tDQp0aXRsZTogIlIg6LKh6YeR5aWX5Lu256S656+EIg0KYXV0aG9yOiAiVG9ueSBDaHVvIg0KZGF0ZTogIjIwMTflubQ15pyIMTbml6UiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQo8YnI+DQoNCuS7peS4i+ekuuevhOeUqFLlpZfku7bkvoblgZrvvJoNCg0KKyDkuIvovInlgIvogqHnmoTkuqTmmJPos4fmlpkNCisg55Wr57ea5ZyW44CB5Yqg6Lao5Yui57eaDQorIOS4i+i8ieafkOS4gOe+pOiCoeelqOeahOatt+WPsuiCoeWDuQ0KKyDnrpflh7rmn5DkuIDnvqTogqHnpajnmoTloLHphaznjocNCisg6Kit5a6a5oqV6LOH6ZmQ5Yi25qKd5Lu2DQorIOeVq+WHuuaViOeOh+WJjee3oyAoRWZmaWNpZW50IEZyb250aWVyKQ0KKyDnrpflh7rmnIDkvbPmipXos4fntYTlkIgNCisg5b6e5oqV6LOH57ay56uZ5LiL6LyJ5YCL6IKh6KmV6KuWDQorIOWwjeWAi+iCoeipleirluWBmuaDhee3kuWIhuaekA0KDQotIC0gLQ0KPGJyPg0KDQoNCiMjIyDovInlhaXlpZfku7YNCg0KYGBge3J9DQpvcHRpb25zKGRpZ2l0cz00LCBzY2lwZW49MTAwKQ0Kcm0obGlzdD1scyhhbGw9VCkpDQpTeXMuc2V0bG9jYWxlKCdMQ19BTEwnLCAnQycpDQpsaWJyYXJ5KGZQb3J0Zm9saW8pDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KHF1YW50bW9kKQ0KYGBgDQoNCiMjIyDkuIvovInnt5rkuIrkuqTmmJPos4fmlpkNCg0KYGBge3J9DQpnZXRTeW1ib2xzKCdNU0ZUJyxmcm9tPWFzLkRhdGUoJzIwMTYtMDctMDEnKSx0bz1hcy5EYXRlKCcyMDE3LTAxLTAxJykpDQpgYGANCg0KIyMjIOeVq+e3muWcluOAgeWKoOi2qOWLoue3mg0KDQpgYGB7cn0NCmNoYXJ0U2VyaWVzKE1TRlQpDQphZGRNQUNEKCkgOyBhZGRCQmFuZHMoKSANCmBgYA0KDQojIyMg5LiL6LyJ6YGT55OK5oiQ5YiG6IKh55qE5q235Y+y6IKh5YO5DQoNCmBgYHtyfQ0KREpJQSA9IGMoJ01NTScsICAnQVhQJywgICdBQVBMJywgJ0JBJywgICdDQVQnLCAnQ1ZYJywNCiAgICAgICAgICdDU0NPJywgJ0tPJywgICAnREQnLCAgICdYT00nLCAnR0UnLCAgJ0dTJywNCiAgICAgICAgICdIRCcsICAgJ0lCTScsICAnSU5UQycsICdKTkonLCAnSlBNJywgJ01DRCcsDQogICAgICAgICAnTVJLJywgICdNU0ZUJywgJ05LRScsICAnUEZFJywgJ1BHJywgICdUUlYnLA0KICAgICAgICAgJ1VOSCcsICAnVVRYJywgICdWWicsICAgJ1YnLCAgICdXTVQnLCAnRElTJykNCmRkID0gYXMuRGF0ZShjKCcyMDE1LTA0LTAxJywnMjAxNy0wMy0zMScpKQ0KYGBgDQoNCiMjIyDnrpflh7rpgZPnk4rmiJDliIbogqHnmoTloLHphaznjocNCg0KYGBge3J9DQpteCA9ICBzYXBwbHkoREpJQSwgZnVuY3Rpb24oeCkgew0KICBHID0gZ2V0U3ltYm9scyh4LGZyb209ZGRbMV0sdG89ZGRbMl0sYXV0by5hc3NpZ249RikNCiAgYXMubnVtZXJpYyhEZWx0KEdbLDZdKSkgfSlbLTEsXQ0KbmFtZXMobXgpID0gREpJQQ0KdHMgPSBhcy50aW1lU2VyaWVzKG14KQ0KYGBgDQoNCiMjIyDoqK3lrprmipXos4fpmZDliLbmop3ku7YNCg0KYGBge3J9DQpjb25zID0gYygnTG9uZ09ubHknKQ0Kc3BlYyA9IHBvcnRmb2xpb1NwZWMoKQ0Kc2V0TkZyb250aWVyUG9pbnRzKHNwZWMpID0gMjUNCnNldFNvbHZlcihzcGVjKSA9ICJzb2x2ZVJxdWFkcHJvZyINCmZyb250aWVyID0gcG9ydGZvbGlvRnJvbnRpZXIodHMsIHNwZWMsIGNvbnMpDQpgYGANCg0KIyMjIOeVq+WHuuaViOeOh+WJjee3oyAoRWZmaWNpZW50IEZyb250aWVyKQ0KDQpgYGB7cn0NCnBhcihjZXg9MC43KQ0KdGFpbG9yZWRGcm9udGllclBsb3QoZnJvbnRpZXIpDQpgYGANCg0KIyMjIOeul+WHuuacgOS9s+aKleizh+e1hOWQiA0KDQpgYGB7cn0NCnBhcihjZXg9MC44KQ0Kd2VpZ2h0c1Bsb3QoZnJvbnRpZXIsY29sPXJhaW5ib3cobGVuZ3RoKERKSUEpKSkNCmBgYA0KDQojIyMg5b6e5oqV6LOH57ay56uZ5LiL6LyJ5YCL6IKh6KmV6KuWDQoNCmBgYHtyfQ0KI2xpYnJhcnkoZGV2dG9vbHMpDQojaW5zdGFsbF9naXRodWIoIm1hbm5hdS90bS5wbHVnaW4uc2VudGltZW50IikNCiNpbnN0YWxsLnBhY2thZ2UoInRtLnBsdWdpbi53ZWJtaW5pbmciKQ0KbGlicmFyeSh0bS5wbHVnaW4uc2VudGltZW50KQ0KbGlicmFyeSh0bS5wbHVnaW4ud2VibWluaW5nKQ0KYWFwbCA9IFdlYkNvcnB1cyhHb29nbGVGaW5hbmNlU291cmNlKCJBQVBMIikpDQpgYGANCg0KIyMjIOWwjeWAi+iCoeipleirluWBmuaDhee3kuWIhuaekA0KDQpgYGB7cn0NCmFhcGwgPC0gc2NvcmUoYWFwbCkNCnNlbnRpeHRzIDwtIG1ldGFYVFMoYWFwbCkNCmNoYXJ0U2VudGltZW50KHNlbnRpeHRzKQ0KYGBgDQoNCg0KDQo=