概念
财政年度
:公司运行的财政年,可以和日历年不一样。比如BABA.N的财政年是日历上年4月1日~日历本年3月31日,即虽然日历上本年才到3月31日,但本年财政上已经结束了。
年节日
:财政年度结束时在日历上的截止日期,比如刚才说的AAPL.O的报表年节日是9月30日,超过了这个日期就属于下一个财年。因此AAPL.O披露的截止日期为2022年12月31日的这份报表实际上是2023财年的一季报。
通常,如何识别当前公司在哪个财政年度,只需要看当前日期和年节日的大小,若日期<=年节日,则是当天的财年=日历年,否则当天的财年=日历年+1。
比如年节日为0630,当天日期为2019年6月1日,则当天属于2019财年;当天日期为2019年7月日,则当天属于2020财年。
中国等国家的财年和日历年是匹配的,美国、英国、日本等国家的财年和日历年是不匹配的。
三个比较重要日期
-
报告期,指财务报表所属的财政年度的报告期,比如2019财年年报
-
报告期截止日期,指财务报表披露的内容是日历日上在某个日期点上的数据;或者从某个开始日期至某个截止日期,属于这个范围的数据。
-
报告公告日期,指这份财务报告报送到证监会并向公众披露的日历日期。
例:600000.SH 在2020年4月20日披露了2019财年年报的财务报告,该报告的截止日期为2019年12月31日;AAPL.O 在2023年2月1日公布了2023财年1季报的财务报告,该报告的截止日期为2022年12月31日。
目前,上交所、深交所和北交所中的上市公司,报告期和报告期截止日期都是匹配的,即日历年度就是财政年度。但是在港交所、美交所、纳斯达克交易所等,很多上市公司的财政年度和日历年度不一样,可以自行设定报表年节日。
年节日调整
在美国等国家的证券交易所,年节日是可以调整的。
向后调整,比如之前是0331作为年节日,2020年10月发布了截止日期为20200930的2021财年中报,2020年11月发布公告,调整为0630作为年节日。那么2021年1月发布截止日期为20201231的报告则也属于2021财年中报,这样因为年节日的修改导致出现了两份2021财年中报。
向前调整,比如之前是0930作为年节日,2020年1月20日发布了2019财年年报,截止日期为2019年9月30日,2020年1月21日发布公告,调整为0630作为年节日。那么2020年1月30日发布截止日期为2019年12月31日的报告则属于2020财年中报,这样因为年节日的修改导致漏掉了一个报告期。
总结:向后调整,会导致出现重复的报告期;向前调整,会导致遗漏报告期。
最新报告期的概念
如何知道某个公司的最新报告期是哪个报告期。
理论情况,拿到公司的所有财务报告,按报表截止日期排序,找到最大的截止日期的那个报告期,就是最新报告期。
现实情况,会考虑以下几点:
1、在哪个时间点的最新报告期,理论情况是讨论都是当前时间点的最新报告期,如何取历史时间点的最新报告期?
2、在考虑历史时间点时,拿所有财务报告,是要根据截止日期拿,还是按公告日期拿,即基准日是截止日期还是公告日期?
-
按截止日期拿,即筛选出所有历史时间点 >= 报表截止日期的财务报告
-
按公告日期拿,即筛选出所有历史时间点 >= 报表公告日期的财务报告
-
两者区别:按截止日期拿是指以现有所有数据来筛选,即使公告日期在历史时间点之后,也认为是有效数据;按公告日期拿是以历史数据来筛选,即认为需要完全站在历史时间点上考虑问题,在那个时间点,没有公布的报告是不能使用的。
3、如何解决年节日调整的问题
4、如何解决披露往年调整的问题
通常流行的取值方法:
先按基准日选项筛选数据,基准日为截止日期,则筛选截止日期小于历史时间点的所有财务报告;基准日为公告日期,则筛选公告日期小于历史时间点的所有财务报告。
再对筛选出来的数据按截止日期从大到小、公告日期从大到小排序,取截止日期最大、公告日期最大的报告所属的报告期为这个历史时间点上的最新报告期。
现实中,通常多使用以截止日期为基准日,认为所有已知数据对历史也是有效的。
以上解决取值方式可以完全解决问题1、2、4,对于问题3,取出来的确实也是最新报告期,只是因为年节日调整导致的缺报告期或重复报告期问题需要按照业务需求自行处理。
程序实现
sql代码
表结构:
证券代码 | 截止日期 | 公告日期 | 财政年度 | 报告期
secid | enddate | declaredate | year | reporttype
基准日为截止日期:
with v as (
select
enddate, declaredate, year, reporttype,
row_number() over (partition by secid order by enddate desc, declaredate desc) as sorted
from table
where secid = 'AAPL.O'
and enddate <= '2020-12-31'::date
)
select year, reporttype
from v
where sorted = 1;
基准日为公告日期时,只需要将sql中的 enddate <= '2020-12-31'::date
修改为 declaredate <= '2020-12-31'::date
缓存设计
对于一个证券代码,取值还是比较快的,当要取大量代码,或者多个时间点时,循环执行这个sql,就会比较耗时,因此需要设计缓存。
redis缓存:使用zset数据结构,写入redis时使用sql查询完整数据,获取key、score、value,最后依次全部塞入redis中(最后要按score desc顺序,大score先写入,若有重复value,用小score覆盖)。
-- 基准日为截止日期
with v as (
select
t1.secid, t1.enddate, t1.year, t1.reporttype,
row_number() over (partition by t1.secid order by t1.enddate desc, t1.declaredate desc) as sorted
from table t1, table t2
where t1.secid = t2.secid
and t1.enddate <= t2.enddate
)
select secid as key, enddate as score, (year || reporttype) as value
from v
where sorted = 1
order by key, score desc;
-- 基准日为公告日期
with v as (
select
t1.secid, t1.declaredate, t1.year, t1.reporttype,
row_number() over (partition by t1.secid order by t1.enddate desc, t1.declaredate desc) as sorted
from table t1, table t2
where t1.secid = t2.secid
and t1.declaredate <= t2.declaredate
)
select secid as key, declaredate as score, (year || reporttype) as value
from v
where sorted = 1
order by key, score desc;
redis取值:
zrange targetKey targetDate MIN_DATE BYSCORE REV LIMIT 0 1
标签:节日,财务数据,t1,财年,日期,报告期,截止
From: https://www.cnblogs.com/yury757/p/17175885.html