财务数据为什么有修正财务数据?
修正财务数据是指上市公司在年报发布之前对这年的季度报和半年报数据进行修正的一种合法操作。
修正财务数据会产生什么麻烦?
原生python中使用xtdata.get_financial_data时,获取的三大财务报表的数据中,会默认有修正过的财务数据,这会导致财务数据的DataFrame中会有很多重复的披露时间(m_anntime)。比如,A公司在2012年4月12日披露了2011年的年报,并修正了2011年的一季度报、半年报和三季度报,那么,原生python获取财务数据时,你会发现有披露时间有4个'20120412',分别对应一季度报修正的披露时间、半年报修正的披露时间、三季度报披露修正的时间和年报披露时间。这种情况对于需要把财报数据和量价数据结合进行回溯的交易员是一件头疼的事情,因为我们不知道历史上的2012年4月12日这天,A公司实际的财务数据是哪个。因此,为了保证回溯的真实性,必须要删除掉修正的财务数据。
修改xtdata.get_financial_data中的report_type参数是否能删除掉修正数据?
试过了,不管是设为'report_time'还是'announce_time'都会有修正数据。
如何删掉修正的数据?
好在财务数据中还有一个截止时间(m_timetag),这个时间是指财务数据针对的时间段的结尾是哪天。比如一季度报的财务数据针对的就是20XX0331这个时间。
证监会、上交所和深交所规定,上市公司的一季度、三季度报需要在季度结束后的1个月内披露,半年报需要在上半年结束的2个月内披露,年报需要在年底结束的4个月内披露。如果不披露,后果还是挺严重的,罚款是其次,主要是对上市公司的声誉影响很大,所以上市公司都严格遵守这规定。
根据这个规则,以及截止时间(m_timetag)的含义,我们就可以清洗掉修正的财务数据。
清洗程序的逻辑
先通过截止日期判断这行财务数据是针对季报、半年报还是年报,如果披露日期减去截止日期大于规定时间,那么这个数据就是修正财务数据,删除不要。
代码实现
# 获取股票池从2000年以来的财务数据
dict = xtdata.get_financial_data(stock_num_list, table_list=['Balance', 'Income', 'Capital'], start_time='20000101', end_time='', report_type='announce_time')
# 以资产负债表为例,提取我们关心的数据,这里要包括披露时间和截止时间
dict_balance = {}
for stock_num in tqdm(stock_num_list):
dict_balance[stock_num] = pd.DataFrame()
dict_balance[stock_num][['财报公布日期', '财报截止日期', '净资产', '总资产']] = dict[stock_num]['Balance'][['m_anntime', 'm_timetag', 'total_equity', 'tot_liab_shrhldr_eqy']]
# 清洗资产负债表
for stock_num in tqdm(stock_num_list):
index_list = []
for i in range(len(dict_balance[stock_num])):
if dict_balance[stock_num]['财报截止日期'][i][4:6] == '03' or dict_balance[stock_num]['财报截止日期'][i][4:6] == '09':
if (datetime.strptime(dict_balance[stock_num]['财报公布日期'][i],"%Y%m%d")-datetime.strptime(dict_balance[stock_num]['财报截止日期'][i],"%Y%m%d")).days <= 31:
index_list.append(i)
if dict_balance[stock_num]['财报截止日期'][i][4:6] == '06':
if (datetime.strptime(dict_balance[stock_num]['财报公布日期'][i],"%Y%m%d")-datetime.strptime(dict_balance[stock_num]['财报截止日期'][i],"%Y%m%d")).days <= 62:
index_list.append(i)
if dict_balance[stock_num]['财报截止日期'][i][4:6] == '12':
if (datetime.strptime(dict_balance[stock_num]['财报公布日期'][i],"%Y%m%d")-datetime.strptime(dict_balance[stock_num]['财报截止日期'][i],"%Y%m%d")).days <= 124:
index_list.append(i)
dict_balance[stock_num] = dict_balance[stock_num].loc[index_list].reset_index(drop=True)
# 清洗完毕
|