@@ -1097,24 +1097,70 @@ def get_pit_financials_ex(order_book_ids, fields, count, statements='latest'):
10971097 if isinstance (order_book_ids , str ):
10981098 order_book_ids = [order_book_ids ]
10991099 env = Environment .get_instance ()
1100- dt = env .calendar_dt .date ()
1101- year = dt .year
1102- mon = dt .month
1103- q = (mon - 4 ) // 3 + 1
1104- y = year
1105- if q <= 0 :
1106- y -= 1
1107- q = 4
1108- end_quarter = str (y ) + 'q' + str (q )
11091100
1110- q_num = y * 4 + q - count
1111- start_y = q_num // 4
1112- start_q = q_num % 4 + 1
1101+ if count < 0 :
1102+ user_log .warn ("function get_pit_financials_ex : count must >= 0" )
1103+ return None
1104+
1105+ # 退市和未退市池
1106+ de_listed_list , active_list = [], []
1107+
1108+ # 遍历每个标的划分池子
1109+ for order_book_id in order_book_ids :
1110+ instrument = env .get_instrument (order_book_id )
1111+ if env .calendar_dt > instrument .de_listed_date :
1112+ de_listed_list .append (instrument )
1113+ else :
1114+ active_list .append (order_book_id )
1115+
1116+ # 需要的数量,传入的 0 代表 1个
1117+ count += 1
1118+
1119+ def _get_data (symbol_list , start_dt ):
1120+ dt = start_dt .date ()
1121+ year = dt .year
1122+ mon = dt .month
1123+ q = (mon - 4 ) // 3 + 1
1124+ y = year
1125+ if q <= 0 :
1126+ y -= 1
1127+ q = 4
1128+ end_quarter = str (y ) + 'q' + str (q )
1129+
1130+ # 多获取4个季度的财报,以防因为财报未发布导致数量不够
1131+ q_num = y * 4 + q - count - 4
1132+
1133+ start_y = q_num // 4
1134+ start_q = q_num % 4 + 1
1135+ start_quarter = "{}q{}" .format (start_y , start_q )
1136+
1137+ if start_quarter > end_quarter :
1138+ start_quarter = end_quarter
1139+
1140+ result = rqdatac .get_pit_financials_ex (
1141+ fields = fields , start_quarter = start_quarter , end_quarter = end_quarter , order_book_ids = symbol_list ,
1142+ statements = statements , market = 'cn' , date = env .calendar_dt .date ()
1143+ )
1144+
1145+ return result
1146+
1147+ # 保存结果
1148+ result_list = []
1149+
1150+ # 获取未退市标的的数据
1151+ result = _get_data (active_list , env .calendar_dt )
1152+
1153+ if isinstance (result , pd .DataFrame ):
1154+ result_list = [group_df .iloc [- count :] for _ , group_df in result .groupby ("order_book_id" )]
1155+
1156+ # 获取退市的数据
1157+ for instrument in de_listed_list :
1158+ result = _get_data ([instrument .order_book_id ], instrument .de_listed_date )
1159+ if isinstance (result , pd .DataFrame ):
1160+ result_list .append (result .iloc [- count :])
11131161
1114- start_quarter = "{}q{}" . format ( start_y , start_q )
1162+ result = pd . concat ( result_list ) if len ( result_list ) > 0 else None
11151163
1116- result = rqdatac .get_pit_financials_ex (fields = fields , start_quarter = start_quarter , end_quarter = end_quarter ,
1117- order_book_ids = order_book_ids , statements = statements , market = 'cn' , date = dt )
11181164 return result
11191165
11201166
0 commit comments