量化策略四财务数据处理

1、财报处理

1.1 PIT(Point in Time):指数据的时序正确性。历史数据的获得有时限性。

解决方法:1.1.1使用满足PIT条件的数据库。

1.1.2通过数据采集规则

>>> import pandas as pd

>>> ticker_symbol = ‘000651’

T = pd.to_datetime(‘2018-03-20’)

income = DataAPI.FdmtISGet(ticker=ticker_symbol

,secID=u””,reportType=u””,endDate=u””,beginDate=u””,publishDateEnd=u””,publishDateBegin=u””,endDateRep=””,beginDateRep=””,beginYear=””,endYear=””,fiscalPeriod=””,field=u”ticker,publishDate,endDate,fiscalPeriod,NIncome”,pandas=”1″)

#统一为datatime格式

income[‘publishDate’] = pd.to_datetime(income[‘publishDate’])

income[‘endDate’] = pd.to_datetime(income[‘endDate’])

#统一财报期月份和会计期月份

income = income.loc[income[‘endDate’].dt.month == income[‘fiscalPeriod’].astype(int)]

#选取’publishDate’为T日以前的行(删除T日以后发布的数据)

df = income.loc[income[‘publishDate’] <= T]

#选择会计结束日为20171231的数据(2017年报数据)并排序

df = df.sort_values(‘publishDate’,ascending=False)

df = df.loc[df[‘endDate’] == pd.to_datetime(‘20171231’)]

#检查是否有数据并发布

if len(df)>0:

n_income = df.iloc[0].loc[‘NIncome’]

print(‘截至T日最新的2017年净利润数据为:%s’%n_income)

else:

print(‘截至T日还未发布2017年净利润数据’)

截至T日还未发布2017年净利润数据

>>> T = pd.to_datetime(‘2018-11-20’)

截至T日最新的2017年净利润数据为:22508599044.1

 

1.2 TTM(Trailing Twelve Months)

>>> ticker_symbol = ‘000651’

T = pd.to_datetime(‘2018-11-20’)

income = DataAPI.FdmtISGet(ticker=ticker_symbol

,secID=u””,reportType=u””,endDate=u””,beginDate=u””,publishDateEnd=u””,publishDateBegin=u””,endDateRep=””,beginDateRep=””,beginYear=””,endYear=””,fiscalPeriod=””,field=u”ticker,publishDate,endDate,fiscalPeriod,NIncome”,pandas=”1″)

#统一为datatime格式

income[‘publishDate’] = pd.to_datetime(income[‘publishDate’])

income[‘endDate’] = pd.to_datetime(income[‘endDate’])

#统一财报期月份和会计期月份

income = income.loc[income[‘endDate’].dt.month == income[‘fiscalPeriod’].astype(int)]

#选取’publishDate’为T日以前的行(删除T日以后发布的数据)

df = income.loc[income[‘publishDate’] <= T]

#选最近一个财报期的财报,记为A

df = df.sort_values([‘publishDate’,’endDate’],ascending=[False,False])

latest_date = df.iloc[0].loc[‘endDate’]

print(‘最近一个已发布的财报期:%s’%latest_date)

#记A之前一年的年报为B,B年与A同周期的财报为C

year = latest_date.year

month = latest_date.month

if month in [6,9]:

day = ’30’

else:

day = ’31’

if month<10:

month = ‘0’+str(month)

else:

month = str(month)

last_year_end_date = pd.to_datetime(str(year-1)+’1231′)

last_same_reason_end_date = pd.to_datetime(str(year-1)+month+day)

print(‘最近一个已发布的财报期上一年财报期为:%s’%last_year_end_date)

print(‘最近一个已发布的财报的上一年同期财报期为:%s’%last_same_reason_end_date)

#获得各期数据

df = df.sort_values(‘publishDate’,ascending=False)

income_A = df.loc[df[‘endDate’] == latest_date].iloc[0].loc[‘NIncome’]

income_B = df.loc[df[‘endDate’] == last_year_end_date].iloc[0].loc[‘NIncome’]

income_C = df.loc[df[‘endDate’] == last_same_reason_end_date].iloc[0].loc[‘NIncome’]

#截至T日的TTM净利润=A+B-C

income_TTM = income_A+income_B-income_C

print(‘A中净利润:%s’%income_A)

print(‘B中净利润:%s’%income_B)

print(‘C中净利润:%s’%income_C)

print(‘TTM净利润:%s’%income_TTM)

最近一个已发布的财报期:2018-09-30 00:00:00

最近一个已发布的财报期上一年财报期为:2017-12-31 00:00:00

最近一个已发布的财报的上一年同期财报期为:2017-09-30 00:00:00

A中净利润:21241006641.3

B中净利润:22508599044.1

C中净利润:15533022140.9

TTM净利润:28216583544.5

 

1.3缺失值

常见处理方式:保留缺失值,设置为NAN、填上上一期的值(fillna(method=’ffill’)(下一期为’bfill’))、填上行业均值。

 

2、ACCA因子构造

ACCA因子:现金流资产比和资产回报率之差。

(TTM经营活动产生的现金流量净额-TTM净利润)/最新总资产

量化策略一Python          量化策略二几种Python工具包          量化策略三企业基本面分析

 

《量化策略》系列文章的部分内容来自于优矿网(UQER)的量化学堂和量化社区。