社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Stata+Python:爬取创历史新高股票列表

连享会 • 1 年前 • 687 次点击  

👇 连享会 · 推文导航 | 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.request
import execjs
import gzip
import xlwt
from bs4 import BeautifulSoup
import os
import 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(00'序号')
worksheet.write(01'股票代码')
worksheet.write(02'股票简称')
worksheet.write(03'涨跌幅')
worksheet.write(04'换手率')
worksheet.write(05'最新价(元)')
worksheet.write(06'前期高点')
worksheet.write(07'前期高点日期')

先对第一页进行解析到表格中,如果有第二页可以继续解析到表格中。

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.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))
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月
  • ⚽助教招聘:文本分析-爬虫-机器学习
  • 助教入选结果 - 连享会 文本分析与爬虫直播课
  • 专题:数据分享
    • 知乎热议:经济-金融大佬从哪里获得数据?如何处理?
    • 金融数据哪里找:Tushare数据平台
    • Stata:CHFS中国家庭金融调查数据库清洗和处理-D121
  • 专题:论文写作
    • 金融领域引用率最高的50篇论文
    • 会计和金融领域Top期刊分类
  • 专题:文本分析-爬虫
    • Stata爬虫:爬取地区宏观数据
    • Stata爬虫:爬取A股公司基本信息
    • 下载:金融领域中文情绪词典
    • Stata爬虫-正则表达式:爬取必胜客
    • Python爬虫: 《经济研究》研究热点和主题分析
  • 专题:Python-R-Matlab
    • Python爬虫:爬取华尔街日报的全部历史文章并翻译
    • Python爬虫:从SEC-EDGAR爬取股东治理数据-Shareholder-Activism
  • 专题:机器学习
    • 机器学习如何用?金融+能源经济学文献综述

课程推荐:计量和因果推断 · 强基班
主讲老师:司继春
课程时间:2023 年 11 月 5/12/19 (三个周日)
🍓 课程主页https://www.lianxh.cn/news/b8936ea77cced.html

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/161742
 
687 次点击