最近国内A股走势不错,又有听到周边有不少同事打算入市了。那么咱们IT人员如果相关金融知识不多,又不想买基金交管费的话,跟着券商的推荐买行不行呢?
如果是零基础的朋友请参考https://blog.csdn.net/BEYONDMA/article/details/87902276文中的前四章节,装好R语言、RTOOLS、JAVA环境和selenmium,做好前期准备工作。
接下来我们就要开始抓取券商荐股报告的工作了,特别提示为了合法爬取数据,笔者目前全部使用浏览器自动化的操作方式来操作,避免由程序框架直接爬取带来的风险,毕竟所有国内券商推荐报告的量每天最多也就是几百篇的量级,再算上行业的报告也不过千,这是没什么去冒险的,具体代码如下:
library(rvest)
library(httr)
library(RSelenium)
remDr<-remoteDriver(browserName = "chrome",remoteServerAddr = "localhost",port = 4444L)
remDr$open()
#以国泰君安为例url填写为国泰君安地址
url='http://www.gtja.com/content/default/info/jpyj/hyyj.html'
remDr$navigate(url)
#读取网页信息
webpage <- read_html(remDr$getPageSource()[[1]][1])
#找到标题元素的xpath,券商股票的推荐页都很简单,直接在浏览器中点F12,选择element选项即可找到。
xpath='/html/body/div[3]/div/div[2]/div[1]/div/div/div/ul/li'
pMax=20
nodesets=html_nodes(webpage,xpath=xpath)
#一般来说title当中都有股票的名称及代码,通过笔者研究回测,个股的推荐意义不大,所以本文以行业研究为例,其中并没有包含具体股票信息并不影响其参考价值
title=vector(mode="character",length(nodesets)*pMax)
contents=vector(mode="character",length(nodesets)*pMax)
#以事件驱动回测必须要获取具体的推荐日期
recoDate=vector(mode='character',length(nodesets))
xpathtmp='/html/body/div[3]/div/div[2]/div[1]/div/div/div/ul/li['
#清洗数据使用的正则表达式
regxcon="[^(\u4e00-\u9fa5|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5|Q|0|1|2|3|9|%|.|,)]+"
pNow=0
while(T)
{
for(i in 1:length(nodesets))
{
xpath=paste(xpathtmp,as.character(i),']/a',sep='')
xnode=html_node(webpage,xpath=xpath)
#清洗数据使用的正则表达式
title[i+(pNow*10)]=html_text(xnode)
#找到研报文本的URL
contentUrl=paste('www.gtja.com',html_attr(xnode,'href'),sep='')
#获取推荐日期,此例中的推荐日期恰巧是url后缀
recoDate[i+(pNow*10)]=substring(contentUrl,(nchar(contentUrl)-12),(nchar(contentUrl)-5))
#打开研报文本的网页
contentWeb=read_html(GET(contentUrl))
#找到正文对应的元素,并选中
contentPath='/html/body/div[4]/div'
nodeContent=html_node(contentWeb,xpath=contentPath)
#抓取研报文本
content=html_text(nodeContent)
contents[i+(pNow*10)]=gsub(pattern=regxcon,replacement='',content,fixed=F)
}
#自动点击下一页按钮
nextElement=remDr$findElement(using="xpath",value='/html/body/div[3]/div/div[2]/div[1]/div/div/div/div/ul/li[4]')
nextElement$clickElement()
Sys.sleep(1)
pNow=pNow+1
webpage <- read_html(remDr$getPageSource()[[1]][1])
if(pNow>pMax)
{
break
}
}
代码运行的效果如下:看浏览器自动点击下一页也是种享受吧:0
抓取其它券商的代码类似不再一一说明了。有了数据就可以着手分析了
一、这里先复习一下文本分词和词云制作的知识点https://blog.csdn.net/BEYONDMA/article/details/85400923。
咱们先要把所有的推荐文本进行分词,
seg=qseg[contents]
cat(seg,file='wor2vec.txt')
library(wordcloud2)
seg <- seg[nchar(seg)>1] #去除字符长度小于2的词
seg <- sort(seg, decreasing = TRUE)[1:40]#取出现最多的40个词做词云即可
seg <- table(seg)#转换类型
wordcloud2(seg, size = 1, shape = 'circle',color = 'random-light',fontFamily = "微软雅黑")
词云大概是下面这个效果。
二、当然这里还可以再加一个知识点,那就是https://blog.csdn.net/BEYONDMA/article/details/85345831参考此文,将分词后各地方出现的频率将热力图做出来。当然这个与本文关系不大,不多说了。
三、分词之后就可以做回测了,首先在接下来就可以注册一个tushare帐号https://tushare.pro/,根据官方指引拿到你的token参考https://tushare.pro/register?reg=229559
install.packages('Tushare')
library(Tushare)
api <- Tushare::pro_api(token = '你的token')
api(api_name = 'stock_basic')
依据股票列表和推荐的股票进行比对,获取股票代码。然后可以参考https://blog.csdn.net/BEYONDMA/article/details/88081261
四、接下来咱们要重点说word2vec了,其实R语言是支持word2vec的,只要读者按照之前的步骤装好Rtools,那么执行以下语句就可以安装rword2vec包了。
library('devtools')
install_github('mukul13/rword2vec')
library(rword2vec)
model<-word2vec(layer1_size=200,train_file='d:/zhengwen.txt',save_vocab_file='d:/beyondma.txt',binary=1,cbow=0,alpha=0,output_file='d:/beyondma.bin',window=5,sample=0.0001,min_count=6,num_threads=2)
以上是word2vec的训练模型,这个比较重要我详细解释下,简单来说word2vec其实是词转变成向量的算法,本质上他有两个约束条件,一是要求常在一起出现的词(键盘和鼠标)距离要近,且词与词的相互关系要尽量保持,比如丈夫和妻子的距离,尽量和国王和王后的距离一样,他其实是用一个固定长度的窗口,逐个去学习整个语料库,并生成每个词的词向量。
重要参数解释如下:
layer1_size是词向量的维度一般是300,在这里我们这个专门的语料库不需要这么长的维度,200就能表示清楚了。
train_file:也就是我们要让机器学习的研报的所有文本。
save_vocab_file:生成的词频文件
window:窗口的大小
在训练完成之后,你就可以看看这些文本中,距离比较近的词有哪些。
dist<-distance(file_name='d:/beyondma.bin',search_word='推荐',num=10)
dist
word dist
1 强烈推荐 0.991746842861176
2 买入 0.983411431312561
3 给予 0.982171237468719
4 维持 0.979804515838623
5 评级 0.977733969688416
#这里距离比较近其实就是我刚刚说的上面这些词会经常在一起出现。
ana=word_analogy(file_name="d:/beyondma.bin",search_words="推荐 维持 买入",num=10)
然后我们通过
bin_to_txt("beyondma.bin","beyondmavec.txt")
方法将词向量转为文本可读的方式。打开beyondmavec.txt我们可以看到rword2vec会把每个词向量存在这个文本中,读取每个词所对应向量后可以轻松做文本分类。
共享一下目前笔者的回测成果,具体的个股研报价值十分有限,但是某些行业的研报还是很有价值的,比如安信证券发表在1月10日的银行业研究《银行行业深度分析:宽信用浪潮裹挟下的民企与商业银行》就明确指出“未来修复的难点,是如何在保证依法合规经营的前提下,逐渐恢复影子银行的融资功能。可行的措施包括:适当延长资管新规过渡期、对理财子公司投资非标的可操作性作出进一步优化等”这相当于先于市场一个月的时间指出,国家要恢复影子银行的功能。此类文章的特点就是与同期推荐报告的相关度不高,但是与后期的推荐报告相关度就高了。如何发现此类推荐报告也是笔者的研究方向。