👇 连享会 · 推文导航 | www.lianxh.cn
连享会课程 · 文本分析专题
作者: 李青塬 (广东工业大学)邮箱: qingyuanli95@gmail.com
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」 。或直接长按/扫描如下二维码,直达原文:
目录
1. 引言
2. 过程简介
3. 数据爬取
4. 基本面对比图
5. 所有代码
6. 相关推文
1. 引言
股票投资两大问题:择股与择时。在选择投资标的方面,有一类投资者偏好投资创历史新高的股票。其逻辑是股价创新高有创新高的道理,可能有很好的业绩支撑或者公司业务有突破性发展,只是当前消息还没有公布。本文尝试利用 Stata 爬取同花顺数据中心提供的创历史新高股票数据,实现自动爬取每个交易日的数据,然后对所爬取的个股近10年历史基本面数据进行对比图示,不过需要 Stata 中配置 Python 环境才可运行。
2. 过程简介 该爬虫难度不大,只需要把网页数据抓取得到即可。一共需要编写 3 个函数,主函数、请求函数和解析函数。随后,把请求得到的数据写入文件中。爬取的目标网址是同花顺金融中心技术选股创新高栏目,具体网址是:
http://data.10jqka.com.cn/rank/cxg/###
图 1 网址图片
3. 数据爬取 在具体执行程序前,需要设定文件路径,以及提前下载可以自动生成 Cookie 的 js 文件到本地。本文数据爬取日期为 2022 年 3 月 10 日的交易数据。
global s 20220310 //此处根据交易日期自行修改 global root= "E:\high" global raw_data= "$root\Raw_data" cap !mkdir "$raw_data" cd $raw_data copy https://gitee.com/qingyuanlee/data-center/raw/master/aes.min.js "$raw_data\"
在 Stata 中设定好可以运行 Python 的环境,此处根据安装路径自行修改。设定好后,打开 Python 环境 。
set python_exec D:\Python\python.exe //此处根据安装路径自行修改 python
该项目需要综合利用 Python 不同工具箱的工具,需要导入以下的工具包。
import urllib.requestimport execjsimport gzipimport xlwtfrom bs4 import BeautifulSoupimport osimport datetime as dtm
接下来开始编写请求函数,使用刚刚开始下载的 js 文件生成 Cookie ,注入 Cookie 到请求头,并发送请求。
def ask(requestUrl) : with open('./aes.min.js' , 'r' ) as f: jsContent = f.read() context = execjs.compile(jsContent) header = { "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3" , 'Accept-Encoding' : 'gzip, deflate' , "Accept-Language" : "zh-CN,zh;q=0.9" , 'Cache-Control' : 'max-age=0' , 'Cookie' : '' , 'Host' : 'data.10jqka.com.cn' , 'Upgrade-Insecure-Requests' : '1' , 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' } header['Cookie' ] = 'v={}' .format(context.call("v" )) req = urllib.request.Request(url=requestUrl, headers=header) response = urllib.request.urlopen(req) return response
编写解析函数,将获取的数据进行解析。
def analyzing(response) : html = gzip.decompress(response.read()).decode("gbk" ) soups = BeautifulSoup(html, "html.parser" ) return soups
编写主函数,访问目标链接。
url = "http://data.10jqka.com.cn/rank/cxg/board/1/field/stockcode/order/asc/page/1/ajax/1/free/1/" soup = analyzing(ask(url))
有时候,创历史新高股票较多,有好几页,所以我们需要获取爬取的总页面数。
item = soup.findAll("a" , class_="changePage" ) lens = 0 if len(item) != 0 : lens = item[len(item) - 1 ].attrs["page" ] lens = int(lens)
创建待写入的表格形式。
workbook = xlwt.Workbook(encoding="UTF-8" ) worksheet = workbook.add_sheet("sheet1" ) worksheet.write(0 , 0 , '序号' ) worksheet.write(0 , 1 , '股票代码' ) worksheet.write(0 , 2 , '股票简称' ) worksheet.write(0 , 3 , '涨跌幅' ) worksheet.write(0 , 4 , '换手率' ) worksheet.write(0 , 5 , '最新价(元)' ) worksheet.write(0 , 6 , '前期高点' ) worksheet.write(0 , 7 , '前期高点日期' )
先对第一页进行解析到表格中,如果有第二页可以继续解析到表格中。
i = 0 for item in soup.findAll("tr" ): j = 0 for data in item.findAll("td" ): worksheet.write(i, j, data.string) j = j + 1 i = i + 1 if lens != 0 : url = "http://data.10jqka.com.cn/rank/cxg/board/1/field/stockcode/order/asc/page/" ed = "/ajax/1/free/1/" for p in range(2 , lens+1 ): soup = analyzing(ask(url + str(p) + ed)) i = i-1 for item in soup.findAll("tr" ): j = 0 for data in item.findAll("td" ): worksheet.write(i, j, data.string) j = j + 1 i = i + 1
按交易日期格式保存表格到相应文件夹中。
a=dtm.date.today() endtime=a.strftime('%Y-%m-%d' ) b=endtime.split('-' ) day=b[0 ]+b[1 ]+b[2 ] workbook.save("E:/high/Raw_data/high_%s.xlsx" %(day))
数据爬取结果如下。当日共有 7 只股票创历史新高。
图 2 爬取结果图
4. 基本面对比图 数据爬取到本地后,可以进行分析与绘制基本面对比图。导入爬虫爬取的数据,再利用 cnar 命令下载这些股票的历史年报数据,生成基本面指标(净资产收益率)。
import excel "E:/high/Raw_data/high_$s.xlsx", sheet("sheet1") firstrow clear levelsof 股票代码,local(levels) foreach 股票代码 of local levels{ cap cnar `股票代码' } openall tostring stkcd,replace ren stkcd 股票代码 replace 股票代码=substr("000000"+股票代码,-6,6) save 财报$s,replace import excel "E:/high/Raw_data/high_$s.xlsx", sheet("sheet1") firstrow clear merge 1:m 股票代码 using 财报$s keep if _merg==3 drop _merge keep if year>2010 gen 净资产收益率=归属于母公司所有者的净利润/归属母公司所有者权益(或股东权益)
利用 fabplot 与 addplot 绘图,绘制当日创历史新高股票的净资产收益率对比图,并保存。
fabplot line 净资产收益率 year, by(股票简称) scheme(s1color) front(connect) frontopts(mc(red) lc(red)) addplot : , xline(2017, lp(dash)) yline(0.2, lp(dash) lc(blue)) norescaling addplot : , xline(2017, lp(dash)) yline(0.1, lp(dash) lc(blue) ) norescaling graph export "净资产收益率$s.emf", as(emf) name("净资产收益率") replace
绘图结果如下。从基本面看,不难发现,浙江建投、海达股份、尖峰集团和合富中国近几年资产收益率较为稳定,且都位于 10% 至 20% 之间。
图 3 创历史新高股票净资产收益率
5. 所有代码 以下代码需要 Stata 中配置 Python 环境,需修改 Python 运行环境路径和当日交易日期,即可运行代码。
global s 20220310 //此处根据交易日期自行修改 global root= "E:\high" global raw_data= "$root\Raw_data" cap !mkdir "$raw_data" cd $raw_data copy https://gitee.com/qingyuanlee/data-center/raw/master/aes.min.js "$raw_data\" set python_exec D:\Python\python.exe //此处根据安装路径自行修改 python import urllib.request import execjs import gzip import xlwt from bs4 import BeautifulSoup import os import datetime as dtm def ask(requestUrl): with open('./aes.min.js', 'r') as f: jsContent = f.read() context = execjs.compile(jsContent) header = { " Accept": " text/html,application/xhtml+xml,application/xml;q=0.9 ,image/webp,image/apng,*/*;q=0.8 ,application/signed-exchange;v=b3", 'Accept-Encoding': 'gzip, deflate', " Accept-Language": " zh-CN,zh;q=0.9 ", 'Cache-Control': 'max-age=0', 'Cookie': '', 'Host': 'data.10jqka.com.cn', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' } header['Cookie'] = 'v={}'.format(context.call(" v")) req = urllib.request.Request(url=requestUrl, headers=header) response = urllib.request.urlopen(req) return response def analyzing(response): html = gzip.decompress(response.read()).decode(" gbk") soups = BeautifulSoup(html, " html.parser") return soups url = " http://data.10j qka.com.cn/rank/cxg/board/1 /field/stockcode/order/asc/page/1 /ajax/1 /free/1 /" soup = analyzing(ask(url)) item = soup.findAll(" a", class_=" changePage") lens = 0 if len(item) != 0: lens = item[len(item) - 1].attrs[" page"] lens = int(lens) workbook = xlwt.Workbook(encoding=" UTF-8 ") worksheet = workbook.add_sheet(" sheet1") worksheet.write(0, 0, '序号') worksheet.write(0, 1, '股票代码') worksheet.write(0, 2, '股票简称') worksheet.write(0, 3, '涨跌幅') worksheet.write(0, 4, '换手率') worksheet.write(0, 5, '最新价(元)') worksheet.write(0, 6, '前期高点') worksheet.write(0, 7, '前期高点日期') i = 0 for item in soup.findAll(" tr"): j = 0 for data in item.findAll(" td"): worksheet.write(i, j, data.string) j = j + 1 i = i + 1 if lens != 0: url = " http://data.10j qka.com.cn/rank/cxg/board/1 /field/stockcode/order/asc/page/" ed = " /ajax/1 /free/1 /" for p in range(2, lens+1): soup = analyzing(ask(url + str(p) + ed)) i = i-1 for item in soup.findAll(" tr"): j = 0 for data in item.findAll(" td"): worksheet.write(i, j, data.string) j = j + 1 i = i + 1 a=dtm.date.today() endtime=a.strftime('%Y-%m-%d') b=endtime.split('-') day=b[0]+b[1]+b[2] workbook.save(" E:/high/Raw_data/high_%s.xlsx"%(day)) end import excel " E:/high/Raw_data/high_$s.xlsx", sheet(" sheet1") firstrow clear levelsof 股票代码,local(levels) foreach 股票代码 of local levels{ cap cnar `股票代码' } openall tostring stkcd,replace ren stkcd 股票代码 replace 股票代码=substr(" 000000 "+股票代码,-6,6) save 财报$s,replace import excel " E:/high/Raw_data/high_$s.xlsx", sheet(" sheet1") firstrow clear merge 1:m 股票代码 using 财报$s keep if _merg==3 drop _merge keep if year>2010 gen 净资产收益率=归属于母公司所有者的净利润/归属母公司所有者权益(或股东权益) fabplot line 净资产收益率 year, by(股票简称) scheme(s1color) front(connect) frontopts(mc(red) lc(red)) addplot : , xline(2017, lp(dash)) yline(0.2, lp(dash) lc(blue)) norescaling addplot : , xline(2017, lp(dash)) yline(0.1, lp(dash) lc(blue) ) norescaling graph export " 净资产收益率$s.emf", as(emf) name(" 净资产收益率") replace
6. 相关推文
Note:产生如下推文列表的命令为:lianxh 金融 爬虫 , m
安装最新版 lianxh
命令:ssc install lianxh, replace
⏩ 专题课:文本分析-爬虫-机器学习-2022年4月 知乎热议:经济-金融大佬从哪里获得数据?如何处理? Stata:CHFS中国家庭金融调查数据库清洗和处理-D121 Python爬虫: 《经济研究》研究热点和主题分析 Python爬虫:爬取华尔街日报的全部历史文章并翻译 Python爬虫:从SEC-EDGAR爬取股东治理数据-Shareholder-Activism
课程推荐:计量和因果推断 · 强基班 主讲老师:司继春 课程时间:2023 年 11 月 5/12/19 (三个周日) 🍓 课程主页 :https://www.lianxh.cn/news/b8936ea77cced.html
New! Stata 搜索神器:lianxh
和 songbl
GIF 动图介绍 搜: 推文、数据分享、期刊论文、重现代码 …… 👉 安装: . ssc install lianxh
. ssc install songbl
👉 使用: . lianxh DID 倍分法
. songbl all
🍏 关于我们 直通车: 👉【百度一下: 连享会 】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。