主页 > 企业信息 > 公司中山人才网

上市公司年度报告的过程是?

269 2024-04-18 17:06

一、上市公司年度报告的过程是?

一、上市公司出具年报到底要经历多少程序

  1、准备年结。

  一般来说,为了准备年报,在12月25日前后,公司的非核心业务都会停下来,比如出差报销、小供应商的付款等等,开始进行年结。

  2、出具快报。

  12月31日起,核心业务开始年结,根据公司的规模,一般1月1日-5日能够结完,快报会在3-5号出具。快报体现公司的主要经营指标,一年的大致经营情况就很清晰了。

  3、匡算调整数据。

  财务负责人会将数据报给财务或总会计师,并给领导班子进行汇报。如果和之前的预期偏差较大,班子会进行讨论,确定财报调整方向。

  需要说明的是,财报调整并非造假,通常是在会计准则许可范围之内的修饰。

  财务人员拿到调整指令后,开始对财务报表进行调整,并开始出具正式年报。这个过程,一般是以报表人员为主的全体财务人员通宵达旦。因为实施了ERP的企业,报表数据不能单独调整的,必须调整凭证数据甚至业务数据。

  为了尽量给投资者一个好看的数据,同时还要考虑到事务所的接受程度,有些调整可能会反复多次,工作量非常庞大。

  4、生成年报。

  大约在8号之前,所有分子公司的报表数据汇总、抵消生成全套年报。以毕马威、普华永道的审计报表为例,年报规模通常在300张以上,当然了,披露主要是披露资产负债、利润表、现金流量表和股东权益变动表四张主表。

  5、事务所进场审计。

  年报出具完成后,事务所开始进场审计。审计的主要依据就是财务人员出具的年报,并对一些会计事项进行抽样取证。比如应收账款事项,会对大客户发送询证函;比如存货情况,会到仓库现场抽查盘点… …

  这个过程,通常会持续一到两个月。

  6、管理层确认审计结果。

  审计报告出具过程中,双方会有不断的交锋过程。许多财务专家都是在这个过程中成长起来的,根据事务所的建议,会计人员还会对报表进行最后一次大规模调整,同时调整账务和业务数据。

  管理层签字确认后,发布公告,进行披露。

  由此可见,出具年报是一个漫长的过程,大部分上市公司都会在3-4月份出具,这是正常时间。

二、如何用PYTHON爬到巨潮资讯里几个上市公司的年度报告?

1.引言

笔者之前已经写过一篇关于爬取年报的文章,但代码尚不完善,这段时间也一直有读者咨询一些问题,因此专门再发一篇更加详细的帖子,欢迎大家互相交流学习。

凌小添:【Python爬虫实战】爬取A股上市公司年报链接并存入Excel

本文更新了爬虫程序的调用接口对现有问题进行修正,主要更新如下:

  • ✅更加全面的年报数据,突破了旧接口的2000页限制
  • ✅内存占用更小,运行速度更快
  • ✅封装函数,提供方便的参数修改
  • ✅更详细的功能说明,便于二次开发
  • ✅更完整的免费成品资源,含2022年最新年报(2003-2022年报Excel表格)

代码目前存在的问题:

  • 进度显示功能存在溢出
  • 若公司发布修正后的年报,代码无法去重,需手动处理
  • 若干不影响主功能的小缺陷…

2.具体步骤

2.1 网页分析

图为巨潮资讯网公告发布页面,在右侧可以选择要查询的相关参数。 包括**板块分类、公告类型分类、行业分类、时间范围**等。 我们选择沪深两市,公告选择年报进行查询,并按公司代码进行排列,如下图所示。

不难发现,基本已经得到了我们需要的内容,但是网站中多出了一行我们并不需要的年报摘要内容,我们在之后可以用正则表达式去除。

2.2 网络抓包

对网站内容分析完成后,就可以开始抓包。按F12打开开发者工具,切换到网络选项卡。 我们切换一下页面,发现多出了一个query请求,这就是我们需要的访问接口。

根据信息显示,这是一个POST请求,负载的参数为查询时的相关参数,我们解析一下,结果如下图所示。

这个请求最后返回了一个json文件,包含30条公司数据,当然也包括我们需要的年报链接。

到这里基本的抓包和分析就已经完成,我们可以直接开始这部分代码的编写。

'''
@Project :PycharmProjects
@File    :巨潮资讯年报2.0.py
@IDE     :PyCharm
@Author  :lingxiaotian
@Date    :2023/5/20 12:38
'''

#首先引入第三方库
import requests
import re
import openpyxl
import time

#定义一个访问接口的函数
def get_report(page_num,date):
    url = "http://www.cninfo.com.cn/new/hisAnnouncement/query"
    headers = {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
        "Content-Length": "195",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Host": "www.cninfo.com.cn",
        "Origin": "http://www.cninfo.com.cn",
        "Proxy-Connection": "keep-alive",
        "Referer": "http://www.cninfo.com.cn/new/commonUrl/pageOfSearch?url=disclosure/list/search&checkedCategory=category_ndbg_szsh",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.42",
        "X-Requested-With": "XMLHttpRequest"
    }
    '''
    参数信息
     plate: sz;sh, 表示沪深两市
     seDate:查询时间
    '''
    data = {
        "pageNum": page_num,
        "pageSize": 30,
        "column": "szse",
        "tabName": "fulltext",
        "plate": "sz;sh",
        "searchkey": "",
        "secid": "",
        "category": "category_ndbg_szsh",
        "trade": "",
        "seDate": date,
        "sortName": "code",
        "sortType": "asc",
        "isHLtitle": "false"
    }
    response = requests.post(url, data=data, headers=headers)
    return response

这个函数包含两个参数page_numdate,我们可以控制当前页码来遍历整个json文件,并用date来控制需要查询的时间范围。

2.3 数据获取

这部分主要就是为了实现本文的主要目的:获取指定年份的上市公司报告链接 首先我们需要循环遍历整个所有页面,那么如何确定遍历次数呢? 仔细研究返回的json文件我们发现文件最后会包含一个totalpapges的参数,即总页数。

那么,有了这个数字,我们便可以先请求一次获取总页数,从而设定好循环次数进行获取。 ⚠️然而,笔者最后生成的excel表格中存在数千条重复项,对于这个问题,笔者在研究后发现该接口每次获取的页数上限最多为100页!超过这个页数后返回的内容完全一致。 从网页上看结果也是如此,最大显示范围为100页,之后便无法获取。

针对这一问题,笔者通过划分时间范围进行处理,稍后进行介绍,此处先给出循环访问获取数据函数的完整代码,代码中的重试机制此前已经介绍,本文不再赘述。

def downlaod_report(date):
    global counter
    all_results = []
    page_num = 1
    response_test = get_report(page_num,date)
    data_test = response_test.json()
    total_pages = data_test["totalpages"]
    max_retries = 3 #最大重试次数
    retry_count = 0 #当前重试次数
    while page_num <= total_pages:
        response = None

        # 重试机制
        while retry_count <= max_retries:
            # 发送请求
            try:
                # response = requests.post(url, data=data,headers=headers)
                response = get_report(page_num,date)
                response.raise_for_status()
                break
            except requests.exceptions.RequestException as e:
                print(f"出现错误!: {e}")
                print(f"5秒后重试...")
                time.sleep(5)
                retry_count += 1

        if retry_count > max_retries:
            print(f"{max_retries} 次重试后均失败. 跳过第 {page_num}页.")
            page_num += 1
            retry_count = 0
            continue
        else:
            # 解析数据
            try:
                data = response.json()
                # print(f"正在下载第 {page_num}/{total_pages} 页")
                print(f"\r正在下载第 {counter}/{sum} 页",end='')
                # 尝试解析公告数据,如果解析失败则重试
                retry_count = 0
                while True:
                    try:
                        if data["announcements"] is None:
                            raise Exception("公告数据为空")
                        else:
                            all_results.extend(data["announcements"])
                        break
                    except (TypeError, KeyError) as e:
                        print(f"解析公告数据失败: {e}")
                        print(f"5秒后重试...")
                        time.sleep(5)
                        retry_count += 1
                        if retry_count > max_retries:
                            raise Exception("达到最大重试次数,跳过此页")
                        continue
                page_num += 1
                counter +=1
            except (ValueError, KeyError) as e:
                print(f"解析响应数据失败: {e}")
                print(f"5秒后重试...")
                time.sleep(5)
                retry_count += 1
                if retry_count > max_retries:
                    raise Exception("达到最大重试次数,跳过此页")
                continue
    return all_results

2.4 数据保存

上文我们提到,json文件的最大获取范围为100页,因此我们根据年报发布的分布特点,将每年的1月1日-4月30日作为时间范围。 然后将其细化,1-4月为一组,4月内部分为5组,保证每组获取到的总页数均小于100,并将本列表作为函数参数进行遍历,将获取到的数据汇总。

    time_segments = [
        f"{year}-01-01~{year}-04-01",
        f"{year}-04-02~{year}-04-15",
        f"{year}-04-16~{year}-04-22",
        f"{year}-04-23~{year}-04-26",
        f"{year}-04-27~{year}-04-28",
        f"{year}-04-29~{year}-04-30"
    ]

既然已经获取到了所有数据,我们不可能将所有数据直接保存为不易阅读的json那么接下来就是将得到的数据进行解析。 我们首先分析了json文件中的具体参数,选择解析如图所示的几个变量,包括股票代码,公司名称,报告名称,年报链接等内容,并将年报链接拼串补充完整。

接着创建一个excel表格,按这些变量的顺序创建表格,并存入表格,注意在存入表格时,需要对内容进行筛选,如“英文版,摘要”这类年报并不是我们所需要的。 以下是主函数的完整代码。

def main(year):
    # 计数器
    global sum
    date_count = f"{year}-01-01~{year}-04-30"
    response = get_report(1,date_count)
    data = response.json()
    sum = data["totalpages"]
    year = year+1
    all_results = []
    time_segments = [
        f"{year}-01-01~{year}-04-01",
        f"{year}-04-02~{year}-04-15",
        f"{year}-04-16~{year}-04-22",
        f"{year}-04-23~{year}-04-26",
        f"{year}-04-27~{year}-04-28",
        f"{year}-04-29~{year}-04-30"
    ]
    for i in time_segments:
        results = downlaod_report(i)
        all_results.extend(results)


    # 创建Excel文件并添加表头
    workbook = openpyxl.Workbook()
    worksheet = workbook.active
    worksheet.title = "公众号 凌小添"
    worksheet.append(["公司代码", "公司简称", "标题", "年份", "年报链接"])

    # 解析搜索结果并添加到Excel表格中
    for item in all_results:
        company_code = item["secCode"]
        company_name = item["secName"]
        title = item["announcementTitle"].strip()
        # 剔除不需要的样式和特殊符号,并重新组合标题
        title = re.sub(r"<.*?>", "", title)
        title = title.replace(":", "")
        title = f"《{title}》"

        adjunct_url = item["adjunctUrl"]
        year = re.search(r"\d{4}", title)
        if year:
            year = year.group()
        else:
            year = setYear
        time = f"{year}"
        announcement_url = f"http://static.cninfo.com.cn/{adjunct_url}"

        # 检查标题是否包含排除关键词
        exclude_flag = False
        for keyword in exclude_keywords:
            if keyword in title:
                exclude_flag = True
                break

        # 如果标题不包含排除关键词,则将搜索结果添加到Excel表格中
        if not exclude_flag:
            worksheet.append([company_code, company_name, title, time, announcement_url])
    workbook.save(f"年报链接_{setYear}【公众号:凌小添】.xlsx")

2.5 开始运行

到这一步基本就大功告成了!只需要设置相关参数,就可以选择下载特定年份的年报,或者用循环遍历下载指定范围的年报。

if __name__ == '__main__':
    # 全局变量
    # 排除列表可以加入'更正后','修订版'来规避数据重复或公司发布之前年份的年报修订版等问题,
    exclude_keywords = ['英文', '摘要','已取消','公告']
    global counter
    global sum
    counter = 1  # 计数器
    setYear = 2016 #设置下载年份

    # for setYear in range(2004,2022):
    main(setYear)
    #     print(f"{setYear}年年报下载完成")

3.小结

经过测试,基本上可以获取绝大部分年报,你可以通过调整请求参数来控制具体的公司行业,或者所属板块,但代码仍然有部分小问题,如进度显示会溢出、获取到的数据需要手动去除重复项等。

⭐️笔者已将2003-2022年报链接打包,以及2010-2021年txt年报,关注公众号“凌小添”回复年报即可免费获取。

另外,笔者目前在整理2022年的年报数据以及参考吴非教授所做的2010-2022年上市企业的数字化转型词频,感兴趣可以先关注哦~整理好后第一时间更新。

如果您喜欢自己动手,定制自己需要的词频,可以参考往期文章,欢迎大家交流学习~

凌小添:【python实战】2.批量从表格提取链接多线程下载并实现pdf转txt(附2010-2021年上市公司TXT版年报)凌小添:【Python爬虫实战】3.A股上市公司年报关键词词频分析

三、比亚迪年度报告?

中国汽车制造商比亚迪正式公示了公司2020年度财报,根据财报相关数据显示,2020年比亚迪品牌实现营业总收入1566亿元人民币,同比增长22.59%。

数据显示,2020年,比亚迪实现归母净利润42.3亿元人民币,同比增长162.27%。公司毛利率为19.4%,同比提高3.1个百分点,净利率为3.8%,同比提高2.2个百分点。财报还显示,比亚迪实现每股收益1.47元,截至3月29日收盘,比亚迪沪市报收168.10元人民币每股,总市值达4749亿元人民币。

此外,2020年比亚迪公司营业成本1262.5亿元人民币,同比增长18.1%,低于营业收入22.6%的增速,导致毛利率上升3.1%。期间费用率为13.2%,同去年相比变化不大。经营性现金流大幅上升207.9%至453.9亿。

四、什么企业年度报告?

企业年报是企业整个会计年度的财务报告及其他相关文件。

企业提交年报的时间为每年的1月1号至6月30号。过期未按时申报公示的,将会被列入经营异常名录。在企业日常的工作中,提交年报是每年必经的工作程序。

企业逾期不报送公示年报的,将被列入经营异常名录并向社会公示;个体工商户逾期不报送年报的,将被标记经营异常状态并向社会公示。

凡在去年12月31日前登记注册,领取营业执照的公司、非公司企业法人、合伙企业、个人独资企业、分支机构、个体工商户。

具体登录方式:既可以通过工商行政管理局门户网站“公示系统”进入,也可以直接通过搜索“国家企业信用信息公示系统”进入。按照系统所列内容完整填报、提交成功后,年报完成同时对外公示(企业选择不公示的信息除外)。

五、年度报告查看方法?

年度报告的查看方法如下:访问公司官网:大多数公司都会在其官方网站上发布年度报告。可以在网站上搜索公司名称,找到官网链接,进入官网后,通常可以在“投资者关系”或“财务报告”等子栏目下找到年度报告。查询公司公告:公司通常会在交易所网站上发布公告,其中包括年度报告的链接或摘要。可以登录交易所网站,在“上市公司公告”或“定期报告”等栏目下查询公司公告,获取年度报告。在线数据库查询:一些在线数据库或金融信息提供商(如彭博、路透等)会提供公司年度报告的查询和下载服务。可以通过这些数据库或平台查询年度报告。图书馆或机构资源:如果无法通过上述途径获取年度报告,可以尝试联系当地图书馆或学术机构,其通常拥有一定的资源可以提供帮助。在查看年度报告时,需要注意报告的发布日期和有效期。此外,由于年度报告通常比较长,建议先了解报告的结构和内容,以便更好地理解和分析报告。如有疑问,可以咨询专业的财务顾问或会计师。

六、年度报告怎么写?

写年度报告需要注意以下几个步骤和要点:

1. 总结与分析:首先,需要对公司全年的经营情况进行总结,并分析业绩变化、市场竞争情况、公司运营效率、员工管理等方面的情况。可以基于这些情况制定下一年的目标。

2. 突出重点:根据公司业务特点,将本年度发生的重大事件、成果、亮点进行归纳概括,并深入剖析数量、质量、利润、收益等指标。

3. 优化营销方案: 根据市场需求和客户反馈,优化营销方案,推出新产品并改进已有的服务。

4. 强化管理制度:针对本年度发现的问题和不足的地方,加强公司的内部管理制度,建立健全规章制度。

5. 展望未来:在年度报告中展望未来是个很重要的环节。通过阐述今后的公司愿景、发展方向和战略计划,为股东和投资者提供一个清晰的风险评估和市场竞争预警的参考。

6. 附加信息: 在报告中附上其他相关文件和信息,如审计报告、联营企业的合并财务报表等。

最后,年度报告需要真实、客观地反映公司全年的经营状况,不应掩盖实情,而要为投资者提供真实、全面的信息。这样可以让股东和投资者更好地了解公司的经营状况和未来计划,为公司未来发展打下基础。

七、怎么申报年度报告?

申报年度报告:通过登录“国家企业信用信息公示系统(上海)”(http://cq.gsxt.gov.cn/)报送年度报告并向社会公示

点击“企业信息填报”按钮,进入提示页面。选择“企业联络员登录”,首次登录的点击下方红色字体“企业联络员注册”进行注册;注册信息发生变化的,请点击“企业联络员变更”;忘记联络员登录信息的,请与属地市场监管所或企业监督管理科联系,进行联络员失效后重新注册

八、如何评价 bilibili 2019 年度报告?

这是一个当代女大学生沉迷大SAO 日渐肥胖的悲伤故事!

九、excel相对引用,绝对引用和混合引用的区别?

Excel中的相对引用、绝对引用和混合引用是在使用公式时用于定位单元格的三种不同的引用方式。它们之间的区别如下:

1. 相对引用:相对引用是默认的引用方式,公式中单元格的地址没有加上任何符号。在复制公式时,相对引用会自动调整单元格地址,以适应新的位置。例如,在公式=A1+B1中,A1和B1就是相对引用,如果将这个公式复制到C1单元格中,则会变成C1+D1。

2. 绝对引用:绝对引用使用“$”符号来表示单元格地址,用于在公式中指定某个单元格地址不随复制而改变。例如,在公式中使用$A$1表示单元格A1的绝对地址。无论这个公式复制到哪个单元格,其引用的单元格地址始终是A1。

3. 混合引用:混合引用是相对引用和绝对引用的混合使用。混合引用中,使用“$”符号来锁定单元格地址的行或列。例如,在公式中使用A$1表示单元格A1的行是绝对的,列是相对的。如果将这个公式复制到B1单元格中,则会变成B$1,其中B的列是绝对的,$1的行是相对的。

总之,相对引用、绝对引用和混合引用可以帮助Excel用户更好地控制公式中引用的单元格地址,以便在复制和填充公式时准确地应用到每个单元格。

十、Excel相对引用,绝对引用和混合引用的区别?

Excel中相对引用、绝对引用和混合引用是在使用公式或函数时相对定位和绝对定位单元格的三种不同方式。

相对引用是指在Excel公式或函数中使用相对位置来引用一个单元格的值。举个例子,如果在A1单元格中输入一个公式= B1 + C1,在拖动该公式到A2单元格时,公式会自动调整为= B2 + C2,此时公式中的单元格引用相对位置发生了改变,这种引用就是相对引用。

绝对引用是指Excel公式或函数中使用绝对位置来引用一个单元格的值。在单元格的列字母前加上$符号,行数字前加上$符号,就可以将其转换为绝对引用。举个例子,如果在A1单元格中输入一个公式= $B$1 + $C$1,在拖动该公式到A2单元格时,公式不会发生变化,并仍然是= $B$1 + $C$1,这种引用就是绝对引用。

混合引用结合了相对引用和绝对引用的特点。通过在单元格的行或列中只加上一个$符号,就可以将其转换成混合引用。比如,$B1表示列B是绝对的,行1是相对的;B$1表示行1是绝对的,列B是相对的。在拖动或复制公式或函数时,只有相对位置会发生变化,其他位置会保持不变。

总结起来,相对引用是Excel默认的单元格引用方式,它根据移动单元格位置而自动调整,而绝对引用则是完全固定的单元格引用方式,混合引用则是相对与绝对引用结合的方式,可以根据情况灵活选择使用。Excel中相对引用、绝对引用和混合引用是在使用公式或函数时相对定位和绝对定位单元格的三种不同方式。

相对引用是指在Excel公式或函数中使用相对位置来引用一个单元格的值。举个例子,如果在A1单元格中输入一个公式= B1 + C1,在拖动该公式到A2单元格时,公式会自动调整为= B2 + C2,此时公式中的单元格引用相对位置发生了改变,这种引用就是相对引用。

绝对引用是指Excel公式或函数中使用绝对位置来引用一个单元格的值。在单元格的列字母前加上$符号,行数字前加上$符号,就可以将其转换为绝对引用。举个例子,如果在A1单元格中输入一个公式= $B$1 + $C$1,在拖动该公式到A2单元格时,公式不会发生变化,并仍然是= $B$1 + $C$1,这种引用就是绝对引用。

混合引用结合了相对引用和绝对引用的特点。通过在单元格的行或列中只加上一个$符号,就可以将其转换成混合引用。比如,$B1表示列B是绝对的,行1是相对的;B$1表示行1是绝对的,列B是相对的。在拖动或复制公式或函数时,只有相对位置会发生变化,其他位置会保持不变。

总结起来,相对引用是Excel默认的单元格引用方式,它根据移动单元格位置而自动调整,而绝对引用则是完全固定的单元格引用方式,混合引用则是相对与绝对引用结合的方式,可以根据情况灵活选择使用。