@Comen 有一个用了很久的函数,需要的话直接拿去。
会自动统计每个股票最近4个季度的数字。
(先by 股票查最新财报,再往前推 4 个季度)
调用方法如下。
输入参数有三个,表、字段、截止日期(变更截止日期,可以统计历史上任何一个时间节点往前看,最近 4 个季度的数字)
df = get_fundamentals_sum('cash_flow', cash_flow.net_operate_cash_flow, statsDate)
```
def get_fundamentals_sum(self, table_name=indicator, search=indicator.adjusted_profit, statsDate=None):
# 取最近的五个季度财报的日期
def __get_quarter(table_name, statsDate):
'''
返回最近 n 个财报的日期
返回每个股票最近一个财报的日期
'''
# 取最新一季度的统计日期
if table_name == 'indicator':
q = query(indicator.code, indicator.statDate)
elif table_name == 'income':
q = query(income.code, income.statDate)
elif table_name == 'cash_flow':
q = query(cash_flow.code, cash_flow.statDate)
elif table_name == 'balance':
q = query(balance.code, balance.statDate)
df = get_fundamentals(q, date = statsDate)
stock_last_statDate = {}
tmpDict = df.to_dict()
for i in range(len(tmpDict['statDate'].keys())):
# 取得每个股票的代码,以及最新的财报发布日
stock_last_statDate[tmpDict['code'][i]] = tmpDict['statDate'][i]
df = df.sort(columns='statDate', ascending=False)
# 取得最新的财报日期
last_statDate = df.iloc[0,1]
this_year = int(str(last_statDate)[0:4])
this_month = str(last_statDate)[5:7]
if this_month == '12':
last_quarter = str(this_year) + 'q4'
last_two_quarter = str(this_year) + 'q3'
last_three_quarter = str(this_year) + 'q2'
last_four_quarter = str(this_year) + 'q1'
last_five_quarter = str(this_year - 1) + 'q4'
elif this_month == '09':
last_quarter = str(this_year) + 'q3'
last_two_quarter = str(this_year) + 'q2'
last_three_quarter = str(this_year) + 'q1'
last_four_quarter = str(this_year - 1) + 'q4'
last_five_quarter = str(this_year - 1) + 'q3'
elif this_month == '06':
last_quarter = str(this_year) + 'q2'
last_two_quarter = str(this_year) + 'q1'
last_three_quarter = str(this_year - 1) + 'q4'
last_four_quarter = str(this_year - 1) + 'q3'
last_five_quarter = str(this_year - 1) + 'q2'
else: #this_month == '03':
last_quarter = str(this_year) + 'q1'
last_two_quarter = str(this_year - 1) + 'q4'
last_three_quarter = str(this_year - 1) + 'q3'
last_four_quarter = str(this_year - 1) + 'q2'
last_five_quarter = str(this_year - 1) + 'q1'
return last_quarter, last_two_quarter, last_three_quarter, last_four_quarter, last_five_quarter, stock_last_statDate
# 查财报,返回指定值
def __get_fundamentals_value(table_name, search, myDate):
'''
输入查询日期
返回指定的财务数据,格式 dict
'''
if table_name == 'indicator':
q = query(indicator.code, search, indicator.statDate)
elif table_name == 'income':
q = query(income.code, search, income.statDate)
elif table_name == 'cash_flow':
q = query(cash_flow.code, search, cash_flow.statDate)
elif table_name == 'balance':
q = query(balance.code, search, balance.statDate)
df = get_fundamentals(q, statDate = myDate).fillna(value=0)
tmpDict = df.to_dict()
stock_dict = {}
name = str(search).split('.')[-1]
for i in range(len(tmpDict['statDate'].keys())):
tmpList = []
tmpList.append(tmpDict['statDate'][i])
tmpList.append(tmpDict[name][i])
stock_dict[tmpDict['code'][i]] = tmpList
return stock_dict
# 得到最近 n 个季度的统计时间
last_quarter, last_two_quarter, last_three_quarter, last_four_quarter, last_five_quarter, stock_last_statDate = __get_quarter(table_name, statsDate)
last_quarter_dict = __get_fundamentals_value(table_name, search, last_quarter)
last_two_quarter_dict = __get_fundamentals_value(table_name, search, last_two_quarter)
last_three_quarter_dict = __get_fundamentals_value(table_name, search, last_three_quarter)
last_four_quarter_dict = __get_fundamentals_value(table_name, search, last_four_quarter)
last_five_quarter_dict = __get_fundamentals_value(table_name, search, last_five_quarter)
tmp_list = []
stock_list = stock_last_statDate.keys()
for stock in stock_list:
tmp_dict = {}
tmp_dict['code'] = stock
value_list = []
if stock in last_quarter_dict:
if stock_last_statDate[stock] == last_quarter_dict[stock][0]:
value_list.append(last_quarter_dict[stock][1])
if stock in last_two_quarter_dict:
value_list.append(last_two_quarter_dict[stock][1])
if stock in last_three_quarter_dict:
value_list.append(last_three_quarter_dict[stock][1])
if stock in last_four_quarter_dict:
value_list.append(last_four_quarter_dict[stock][1])
if stock in last_five_quarter_dict:
value_list.append(last_five_quarter_dict[stock][1])
for i in range(4 - len(value_list)):
value_list.append(0)
tmp_dict['0Q'] = value_list[0]
tmp_dict['1Q'] = value_list[1]
tmp_dict['2Q'] = value_list[2]
tmp_dict['3Q'] = value_list[3]
tmp_dict['sum_value'] = value_list[0] + value_list[1] + value_list[2] + value_list[3]
tmp_list.append(tmp_dict)
df = pd.DataFrame(tmp_list)
return df
```
2017-07-15