热点复现|谁是最赚钱的港股企业?

举报
darkpard 发表于 2021/06/06 13:02:20 2021/06/06
【摘要】 最近,各种介绍爬虫的文章火爆公众号。让我们在ModelArts上做些复现,来看看谁是最赚钱的港股企业吧。一方面,爬虫也能爬取A股交易信息;另一方面,财务数据也是量化投资应该考虑的重要方面。因此,本文可以与上一期结合,进行更多维度的量化研究。考虑到A股财务数据来源广泛,本文以港股为例,有兴趣做A股量化研究的小伙伴可以自己去尝试。

最近,各种介绍爬虫的文章火爆公众号。让我们在ModelArts上做些复现,来看看谁是最赚钱的港股企业吧。一方面,爬虫也能爬取A股交易信息;另一方面,财务数据也是量化投资应该考虑的重要方面。因此,本文可以与上一期结合,进行更多维度的量化研究。考虑到A股财务数据来源广泛,本文以港股为例,有兴趣做A股量化研究的小伙伴可以自己去尝试。

1. 网页分析

首先,让我们进入东方财务网站并点击港股 选择港股市场下的全部港股 可以看到港股的代码是5位的数字 任选一个股票,点击财务分析 按Crtl+Shift+i打开开发者工具 点击资产负债表 再点击按年度 可以看到年度资产负债表的数据来源于以下get方法 可以看到url里有一个五位数的港股代码,只需要将它改成另一个代码,就能获得另一家港股的资产负债数据 利润表和现金流量表也有同样的情况,小伙伴们可以自己尝试。

2. 数据爬取

接下来是代码时刻,让我们在ModelArts上把2019年年度财务数据爬下来

2.1. 爬取案例

先让我们用衍生集团来尝试下最近一个年度财务数据的爬取
导入需要的包

import urllib.request
import json
import pandas as pd

初始化代码

scode = '06893'

生成get方法需要的url

url ='http://emweb.securities.eastmoney.com/PC_HKF10/NewFinancialAnalysis/GetZCFZB?code=' + scode + '&startdate=&ctype=4&rtype=6'

调用get

a = urllib.request.urlopen(url)

解码、转化为DataFrame格式并打印

html = a.read().decode('utf-8')
result = json.loads(html)
if len(result1['data']):
    data = pd.DataFrame(result['data'][1:], columns = result['data'][0])
data

可以看到衍生集团居然还没有公布20年年报。

让我们换一家,以新焦点为样本。我们先重复以上操作

scode = '00360'
url ='http://emweb.securities.eastmoney.com/PC_HKF10/NewFinancialAnalysis/GetZCFZB?code=' + scode + '&startdate=&ctype=4&rtype=6'
html = urllib.request.urlopen(url).read().decode('utf-8')
result = json.loads(html)
if len(result['data']):
    data = pd.DataFrame(result['data'][1:], columns = result['data'][0])
data

可以看到新焦点已经公布了20年年报,我们写入代码并截取年报

data['scode'] = scode
data = data.loc[0:0, :]
data

将上述过程包装成函数,并且只考虑已经发布20年年报的港股

def getdata(url, seccode):
    try:
        html = urllib.request.urlopen(url % seccode).read().decode('utf-8')
    except:
        return '代码不存在'
    result = json.loads(html)
    if result['data'] is None or not len(result['data']):
        return '还没有数据'
    data = pd.DataFrame(result['data'][1:], columns = result['data'][0])
    data['scode'] = seccode
    data = data.loc[data['截止日期']=='20-12-31', :]
    if len(data):
        return data
    return '没有20年报表'

2.2. 爬取所有港股财务数据

直接上代码

#初始化三个财务表DataFrame
#每个股票需要爬取三个报表,所以初始化url列表
urls = ['http://emweb.securities.eastmoney.com/PC_HKF10/NewFinancialAnalysis/GetZCFZB?code=%s&startdate=&ctype=4&rtype=6', 
       'http://emweb.securities.eastmoney.com/PC_HKF10/NewFinancialAnalysis/GetLRB?code=%s&startdate=&ctype=4&rtype=6', 
       'http://emweb.securities.eastmoney.com/PC_HKF10/NewFinancialAnalysis/GetXJLLB?code=%s&startdate=&ctype=4&rtype=6']
#初始化三表
zcfzb = pd.DataFrame()
lrb = pd.DataFrame()
xjllb = pd.DataFrame()
#初始化港股代码表,虽然可以找到接口或爬取到列表,我们也可以简单罗列1-99999,通过尝试性爬取来去掉不正确的代码
for seccode in range(1, 100000):
    seccode = str(seccode).zfill(5)
    #获取资产负债表数据
    data = getdata(urls[0], seccode)
    #如果获取到资产负债表数据,写入zcfzb
    if not isinstance(data, str):
        #如果资产负债表没有数据,初始化列名
        if not len(zcfzb):
            zcfzb = data[data['截止日期']=='']
        zcfzb.loc[len(zcfzb), :] = data.loc[0, :]
    #获取利润表数据
    data = getdata(urls[1], seccode)
    #如果获取到数据,写入lrb
    if not isinstance(data, str):
        #如果利润表没有数据,初始化列名
        if not len(lrb):
            lrb = data[data['截止日期']=='']
        lrb.loc[len(lrb), :] = data.loc[0, :]
    #获取现金流量表数据
    data = getdata(urls[2], seccode)
    #如果获取到数据,写入xjllb
    if not isinstance(data, str):
        #如果现金流量表没有数据,初始化列名
        if not len(xjllb):
            xjllb = data[data['截止日期']=='']
        xjllb.loc[len(xjllb), :] = data.loc[0, :]

3. 数据分析

先来观察下港股代码

','.join(list(lrb.scode.astype(str)))

可以看到,除了80737,港股代码实际上在1-9999之间。而进一步分析也可以发现80737实际上并不是港股代码。 观察营业收入的数据

lrb_data = lrb[['营业收入(计算)', 'scode']]
lrb_data

可以发现营业收入是string型,且单位并不统一。因此首先统一单位

def str2float(s):
    if isinstance(s, str):
        if s.endswith('万亿'):
            return float(s[:-2]) * 1000000000000
        if s.endswith('亿'):
            return float(s[:-1]) * 100000000
        if s.endswith('万'):
            return float(s[:-1]) * 10000
    return float(s)
lrb_data['营业收入'] = lrb_data['营业收入(计算)'].apply(str2float)
lrb_data

很遗憾的是这种写法会造成内存不足,除了升级内存,只能改写代码。

只需要将

lrb_data['营业收入'] = lrb_data['营业收入(计算)'].apply(str2float)

改写成

lrb_data['营业收入'] = 0
for i in lrb_data.index:
    lrb_data.loc[i, '营业收入'] = str(lrb_data.loc[i, '营业收入(计算)'])

接下来,用一行代码我们就能看到谁是最赚钱的港股企业了

lrb_data.sort_values(by='营业收入', ascending=False).reset_index()


至此,我们爬取并简单分析了港股财务数据,找到了2020年最赚钱的港股企业,做量化研究的时候可以尝试把各种财务指标引入量化模型。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。