mns-scheduler 1.0.4.7__py3-none-any.whl → 1.0.4.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mns-scheduler might be problematic. Click here for more details.

@@ -0,0 +1,39 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import pandas as pd
9
+ import akshare as ak
10
+ from mns_common.db.MongodbUtil import MongodbUtil
11
+
12
+ mongodb_util = MongodbUtil('27017')
13
+ import mns_common.constant.db_name_constant as db_name_constant
14
+
15
+
16
+ # 同步退市股票
17
+ def sync_de_list_stock():
18
+ sh_de_list_df = ak.stock_info_sh_delist(symbol="全部")
19
+ sh_de_list_df = sh_de_list_df.rename(columns={"公司代码": "symbol",
20
+ "公司简称": "name",
21
+ "上市日期": "list_date",
22
+ "暂停上市日期": "de_list_date"
23
+ })
24
+
25
+ sz_de_list_df = ak.stock_info_sz_delist(symbol="终止上市公司")
26
+ sz_de_list_df = sz_de_list_df.rename(columns={"证券代码": "symbol",
27
+ "证券简称": "name",
28
+ "上市日期": "list_date",
29
+ "终止上市日期": "de_list_date"
30
+ })
31
+ all_de_list_df = pd.concat([sz_de_list_df, sh_de_list_df])
32
+ all_de_list_df['_id'] = all_de_list_df['symbol']
33
+ all_de_list_df['list_date'] = all_de_list_df['list_date'].astype(str)
34
+ all_de_list_df['de_list_date'] = all_de_list_df['de_list_date'].astype(str)
35
+ mongodb_util.save_mongo(all_de_list_df, db_name_constant.DE_LIST_STOCK)
36
+
37
+
38
+ if __name__ == '__main__':
39
+ sync_de_list_stock()
@@ -7,8 +7,11 @@ project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
  import akshare as ak
9
9
  from mns_common.db.MongodbUtil import MongodbUtil
10
-
10
+ import mns_scheduler.finance.finance_common_api as finance_common_api
11
+ import mns_common.constant.db_name_constant as db_name_constant
11
12
  mongodb_util = MongodbUtil('27017')
13
+ from loguru import logger
14
+ import mns_common.utils.data_frame_util as data_frame_util
12
15
 
13
16
 
14
17
  #
@@ -337,8 +340,15 @@ mongodb_util = MongodbUtil('27017')
337
340
 
338
341
  # 资产负债表
339
342
  # https://emweb.securities.eastmoney.com/PC_HSF10/NewFinanceAnalysis/Index?type=web&code=sh600519#zcfzb-0
340
- def get_em_debt_api(symbol):
341
- stock_balance_sheet_by_report_em_df = ak.stock_balance_sheet_by_report_em(symbol)
343
+ def get_em_asset_liability_api(symbol):
344
+ sec_code = finance_common_api.get_sec_code(symbol)
345
+ try:
346
+ stock_balance_sheet_by_report_em_df = ak.stock_balance_sheet_by_report_em(sec_code)
347
+ except Exception as e:
348
+ logger.error("同步利润表异常:{},{}", symbol, e)
349
+ return None
350
+ if data_frame_util.is_empty(stock_balance_sheet_by_report_em_df):
351
+ return None
342
352
  stock_balance_sheet_by_report_em_df = stock_balance_sheet_by_report_em_df[[
343
353
  'SECUCODE',
344
354
  'SECURITY_CODE',
@@ -403,276 +413,24 @@ def get_em_debt_api(symbol):
403
413
  'USERIGHT_ASSET',
404
414
  'OPINION_TYPE'
405
415
  ]]
406
- print(stock_balance_sheet_by_report_em_df)
407
- mongodb_util.insert_mongo(stock_balance_sheet_by_report_em_df, 'stock_balance_sheet_by_report_em_df')
408
-
416
+ stock_balance_sheet_by_report_em_df['_id'] = (stock_balance_sheet_by_report_em_df['SECURITY_CODE']
417
+ + "_" + stock_balance_sheet_by_report_em_df['REPORT_DATE'])
409
418
 
410
- # 利润表
411
- # "_id" : ObjectId("6644085f608b7737dee21a3a"),
412
- # "SECUCODE" : "600519.SH",
413
- # "SECURITY_CODE" : "600519",
414
- # "SECURITY_NAME_ABBR" : "贵州茅台",
415
- # "ORG_CODE" : "10002602",
416
- # "ORG_TYPE" : "通用",
417
- # "REPORT_DATE" : "2023-12-31 00:00:00",
418
- # "REPORT_TYPE" : "年报",
419
- # "REPORT_DATE_NAME" : "2023年报",
420
- # "SECURITY_TYPE_CODE" : "058001001",
421
- # "NOTICE_DATE" : "2024-04-03 00:00:00",
422
- # "UPDATE_DATE" : "2024-04-03 00:00:00",
423
- # "CURRENCY" : "CNY",
424
- # "TOTAL_OPERATE_INCOME" : 150560330316.45, 营业总收入
425
- # "TOTAL_OPERATE_INCOME_YOY" : 18.0365792459, 总运营收入修正
426
- # "OPERATE_INCOME" : 147693604994.14, 营业收入
427
- # "OPERATE_INCOME_YOY" : 19.0119185529, 营业收入修正
428
- # "INTEREST_INCOME" : 2866725322.31, 利息收入
429
- # "INTEREST_INCOME_YOY" : 利息收入修正
430
- # "EARNED_PREMIUM" : NaN,
431
- # "EARNED_PREMIUM_YOY" : NaN,
432
- # "FEE_COMMISSION_INCOME" : NaN,
433
- # "FEE_COMMISSION_INCOME_YOY" : NaN,
434
- # "OTHER_BUSINESS_INCOME" : NaN,
435
- # "OTHER_BUSINESS_INCOME_YOY" : NaN,
436
- # "TOI_OTHER" : NaN,
437
- # "TOI_OTHER_YOY" : NaN,
438
- # "TOTAL_OPERATE_COST" : 46960889468.54, 营业总成本
439
- # "TOTAL_OPERATE_COST_YOY" : 18.1456266222,
440
- # "OPERATE_COST" : 11867273851.78, 营业成本
441
- # "OPERATE_COST_YOY" : 17.5737925437,
442
- # "INTEREST_EXPENSE" : 113500129.93, 利息支出
443
- # "INTEREST_EXPENSE_YOY" : 7.4972611642,
444
- # "FEE_COMMISSION_EXPENSE" : 68578.57, 手续费及佣金支出
445
- # "FEE_COMMISSION_EXPENSE_YOY" : -52.0903684752,
446
- # "RESEARCH_EXPENSE" : 157371873.01, 研发费用
447
- # "RESEARCH_EXPENSE_YOY" : 16.4116440028,
448
- # "SURRENDER_VALUE" : NaN,
449
- # "SURRENDER_VALUE_YOY" : NaN,
450
- # "NET_COMPENSATE_EXPENSE" : NaN,
451
- # "NET_COMPENSATE_EXPENSE_YOY" : NaN,
452
- # "NET_CONTRACT_RESERVE" : NaN,
453
- # "NET_CONTRACT_RESERVE_YOY" : NaN,
454
- # "POLICY_BONUS_EXPENSE" : NaN,
455
- # "POLICY_BONUS_EXPENSE_YOY" : NaN,
456
- # "REINSURE_EXPENSE" : NaN,
457
- # "REINSURE_EXPENSE_YOY" : NaN,
458
- # "OTHER_BUSINESS_COST" : NaN,
459
- # "OTHER_BUSINESS_COST_YOY" : NaN,
460
- # "OPERATE_TAX_ADD" : 22234175898.6, 税金及附加
461
- # "OPERATE_TAX_ADD_YOY" : 20.2119055043,
462
- # "SALE_EXPENSE" : 4648613585.82, 销售费用
463
- # "SALE_EXPENSE_YOY" : 40.9642928475,
464
- # "MANAGE_EXPENSE" : 9729389252.31, 管理费用
465
- # "MANAGE_EXPENSE_YOY" : 7.9580889133,
466
- # "ME_RESEARCH_EXPENSE" : NaN,
467
- # "ME_RESEARCH_EXPENSE_YOY" : NaN,
468
- # "FINANCE_EXPENSE" : -1789503701.48, 财务费用
469
- # "FINANCE_EXPENSE_YOY" : -28.5742355094,
470
- # "FE_INTEREST_EXPENSE" : 12624628.35, 利息费用
471
- # "FE_INTEREST_EXPENSE_YOY" : 5.0021902771,
472
- # "FE_INTEREST_INCOME" : 1942301920.98, 利息收入
473
- # "FE_INTEREST_INCOME_YOY" : 31.6437955552,
474
- # "ASSET_IMPAIRMENT_LOSS" : NaN,
475
- # "ASSET_IMPAIRMENT_LOSS_YOY" : NaN,
476
- # "CREDIT_IMPAIRMENT_LOSS" : NaN,
477
- # "CREDIT_IMPAIRMENT_LOSS_YOY" : NaN,
478
- # "TOC_OTHER" : NaN,
479
- # "TOC_OTHER_YOY" : NaN,
480
- # "FAIRVALUE_CHANGE_INCOME" : 3151962.5, :公允价值变动收益
481
- # "FAIRVALUE_CHANGE_INCOME_YOY" : NaN,
482
- # "INVEST_INCOME" : 34025967.82, 投资收益
483
- # "INVEST_INCOME_YOY" : -46.7011782268,
484
- # "INVEST_JOINT_INCOME" : NaN,
485
- # "INVEST_JOINT_INCOME_YOY" : NaN,
486
- # "NET_EXPOSURE_INCOME" : NaN,
487
- # "NET_EXPOSURE_INCOME_YOY" : NaN,
488
- # "EXCHANGE_INCOME" : NaN,
489
- # "EXCHANGE_INCOME_YOY" : NaN,
490
- # "ASSET_DISPOSAL_INCOME" : -479736.97, 资产处置收益
491
- # "ASSET_DISPOSAL_INCOME_YOY" : -324.9796785895,
492
- # "ASSET_IMPAIRMENT_INCOME" : NaN,
493
- # "ASSET_IMPAIRMENT_INCOME_YOY" : NaN,
494
- # "CREDIT_IMPAIRMENT_INCOME" : 37871293.26, 信用减值损失(新)
495
- # "CREDIT_IMPAIRMENT_INCOME_YOY" : 357.8638477375,
496
- # "OTHER_INCOME" : 34644873.86, 其他收益
497
- # "OTHER_INCOME_YOY" : 41.3767542405,
498
- # "OPERATE_PROFIT_OTHER" : NaN,
499
- # "OPERATE_PROFIT_OTHER_YOY" : NaN,
500
- # "OPERATE_PROFIT_BALANCE" : 0.0,
501
- # "OPERATE_PROFIT_BALANCE_YOY" : NaN,
502
- # "OPERATE_PROFIT" : 103708655208.38, 营业利润
503
- # "OPERATE_PROFIT_YOY" : 18.0123117479,
504
- # "NONBUSINESS_INCOME" : 86779655.95, 加:营业外收入
505
- # "NONBUSINESS_INCOME_YOY" : 22.4796849672,
506
- # "NONCURRENT_DISPOSAL_INCOME" : NaN,
507
- # "NONCURRENT_DISPOSAL_INCOME_YOY" : NaN,
508
- # "NONBUSINESS_EXPENSE" : 132881174.52, 减:营业外支出
509
- # "NONBUSINESS_EXPENSE_YOY" : -46.6092621953,
510
- # "NONCURRENT_DISPOSAL_LOSS" : NaN,
511
- # "NONCURRENT_DISPOSAL_LOSS_YOY" : NaN,
512
- # "EFFECT_TP_OTHER" : NaN,
513
- # "EFFECT_TP_OTHER_YOY" : NaN,
514
- # "TOTAL_PROFIT_BALANCE" : 0.0,
515
- # "TOTAL_PROFIT_BALANCE_YOY" : NaN,
516
- # "TOTAL_PROFIT" : 103662553689.81, 利润总额
517
- # "TOTAL_PROFIT_YOY" : 18.1993076599,
518
- # "INCOME_TAX" : 26141077412.01, 减:所得税
519
- # "INCOME_TAX_YOY" : 17.0909328034,
520
- # "EFFECT_NETPROFIT_OTHER" : NaN,
521
- # "EFFECT_NETPROFIT_OTHER_YOY" : NaN,
522
- # "EFFECT_NETPROFIT_BALANCE" : NaN,
523
- # "EFFECT_NETPROFIT_BALANCE_YOY" : NaN,
524
- # "UNCONFIRM_INVEST_LOSS" : NaN,
525
- # "UNCONFIRM_INVEST_LOSS_YOY" : NaN,
526
- # "NETPROFIT" : 77521476277.8, 净利润
527
- # "NETPROFIT_YOY" : 18.5778097415,
528
- # "PRECOMBINE_PROFIT" : NaN,
529
- # "PRECOMBINE_PROFIT_YOY" : NaN,
530
- # "CONTINUED_NETPROFIT" : 77521476277.8, 持续经营净利润
531
- # "CONTINUED_NETPROFIT_YOY" : 18.5778097415,
532
- # "DISCONTINUED_NETPROFIT" : NaN,
533
- # "DISCONTINUED_NETPROFIT_YOY" : NaN,
534
- # "PARENT_NETPROFIT" : 74734071550.75, 归属于母公司股东的净利润
535
- # "PARENT_NETPROFIT_YOY" : 19.1598992892,
536
- # "MINORITY_INTEREST" : 2787404727.05, 少数股东损益
537
- # "MINORITY_INTEREST_YOY" : 4.8459336455,
538
- # "DEDUCT_PARENT_NETPROFIT" : 74752564425.52, 扣除非经常性损益后的净利润
539
- # "DEDUCT_PARENT_NETPROFIT_YOY" : 19.0462109566,
540
- # "NETPROFIT_OTHER" : NaN,
541
- # "NETPROFIT_OTHER_YOY" : NaN,
542
- # "NETPROFIT_BALANCE" : NaN,
543
- # "NETPROFIT_BALANCE_YOY" : NaN,
544
- # "BASIC_EPS" : 59.49, 基本每股收益
545
- # "BASIC_EPS_YOY" : 19.1468055277,
546
- # "DILUTED_EPS" : 59.49, 稀释每股收益
547
- # "DILUTED_EPS_YOY" : 19.1468055277,
548
- # "OTHER_COMPRE_INCOME" : 4715179.82, 其他综合收益
549
- # "OTHER_COMPRE_INCOME_YOY" : 110.40766101,
550
- # "PARENT_OCI" : 4715179.82, 归属于母公司股东的其他综合收益
551
- # "PARENT_OCI_YOY" : 110.40766101,
552
- # "MINORITY_OCI" : NaN,
553
- # "MINORITY_OCI_YOY" : NaN,
554
- # "PARENT_OCI_OTHER" : NaN,
555
- # "PARENT_OCI_OTHER_YOY" : NaN,
556
- # "PARENT_OCI_BALANCE" : NaN,
557
- # "PARENT_OCI_BALANCE_YOY" : NaN,
558
- # "UNABLE_OCI" : NaN,
559
- # "UNABLE_OCI_YOY" : NaN,
560
- # "CREDITRISK_FAIRVALUE_CHANGE" : NaN,
561
- # "CREDITRISK_FAIRVALUE_CHANGE_YOY" : NaN,
562
- # "OTHERRIGHT_FAIRVALUE_CHANGE" : NaN,
563
- # "OTHERRIGHT_FAIRVALUE_CHANGE_YOY" : NaN,
564
- # "SETUP_PROFIT_CHANGE" : NaN,
565
- # "SETUP_PROFIT_CHANGE_YOY" : NaN,
566
- # "RIGHTLAW_UNABLE_OCI" : NaN,
567
- # "RIGHTLAW_UNABLE_OCI_YOY" : NaN,
568
- # "UNABLE_OCI_OTHER" : NaN,
569
- # "UNABLE_OCI_OTHER_YOY" : NaN,
570
- # "UNABLE_OCI_BALANCE" : NaN,
571
- # "UNABLE_OCI_BALANCE_YOY" : NaN,
572
- # "ABLE_OCI" : 4715179.82,
573
- # "ABLE_OCI_YOY" : 110.40766101,
574
- # "RIGHTLAW_ABLE_OCI" : NaN,
575
- # "RIGHTLAW_ABLE_OCI_YOY" : NaN,
576
- # "AFA_FAIRVALUE_CHANGE" : NaN,
577
- # "AFA_FAIRVALUE_CHANGE_YOY" : NaN,
578
- # "HMI_AFA" : NaN,
579
- # "HMI_AFA_YOY" : NaN,
580
- # "CASHFLOW_HEDGE_VALID" : NaN,
581
- # "CASHFLOW_HEDGE_VALID_YOY" : NaN,
582
- # "CREDITOR_FAIRVALUE_CHANGE" : NaN,
583
- # "CREDITOR_FAIRVALUE_CHANGE_YOY" : NaN,
584
- # "CREDITOR_IMPAIRMENT_RESERVE" : NaN,
585
- # "CREDITOR_IMPAIRMENT_RESERVE_YOY" : NaN,
586
- # "FINANCE_OCI_AMT" : NaN,
587
- # "FINANCE_OCI_AMT_YOY" : NaN,
588
- # "CONVERT_DIFF" : 4715179.82,
589
- # "CONVERT_DIFF_YOY" : 110.40766101,
590
- # "ABLE_OCI_OTHER" : NaN,
591
- # "ABLE_OCI_OTHER_YOY" : NaN,
592
- # "ABLE_OCI_BALANCE" : NaN,
593
- # "ABLE_OCI_BALANCE_YOY" : NaN,
594
- # "OCI_OTHER" : NaN,
595
- # "OCI_OTHER_YOY" : NaN,
596
- # "OCI_BALANCE" : NaN,
597
- # "OCI_BALANCE_YOY" : NaN,
598
- # "TOTAL_COMPRE_INCOME" : 77526191457.62, 综合收益总额
599
- # "TOTAL_COMPRE_INCOME_YOY" : 18.5809573963,
600
- # "PARENT_TCI" : 74738786730.57, 归属于母公司股东的综合收益总额
601
- # "PARENT_TCI_YOY" : 19.1631595692,
602
- # "MINORITY_TCI" : 2787404727.05, 归属于少数股东的综合收益总额
603
- # "MINORITY_TCI_YOY" : 4.8459336455,
604
- # "PRECOMBINE_TCI" : NaN,
605
- # "PRECOMBINE_TCI_YOY" : NaN,
606
- # "EFFECT_TCI_BALANCE" : NaN,
607
- # "EFFECT_TCI_BALANCE_YOY" : NaN,
608
- # "TCI_OTHER" : NaN,
609
- # "TCI_OTHER_YOY" : NaN,
610
- # "TCI_BALANCE" : NaN,
611
- # "TCI_BALANCE_YOY" : NaN,
612
- # "ACF_END_INCOME" : NaN,
613
- # "ACF_END_INCOME_YOY" : NaN,
614
- # "OPINION_TYPE" : "标准无保留意见" 审计意见(境内)
615
- # https://emweb.securities.eastmoney.com/PC_HSF10/NewFinanceAnalysis/Index?type=web&code=sh600519#lrb-0
616
- def get_em_benefit_api(symbol):
617
- stock_financial_benefit_ths_df = ak.stock_profit_sheet_by_report_em(symbol)
618
- stock_financial_benefit_ths_df = stock_financial_benefit_ths_df[[
619
- "SECUCODE",
620
- "SECURITY_CODE",
621
- "SECURITY_NAME_ABBR",
622
- "ORG_CODE",
623
- "ORG_TYPE",
624
- "REPORT_DATE",
625
- "REPORT_TYPE",
626
- "REPORT_DATE_NAME",
627
- "SECURITY_TYPE_CODE",
628
- "NOTICE_DATE",
629
- "UPDATE_DATE",
630
- "CURRENCY",
631
- "TOTAL_OPERATE_INCOME",
632
- "OPERATE_INCOME",
633
- "INTEREST_INCOME",
634
- "TOTAL_OPERATE_COST",
635
- "OPERATE_COST",
636
- "INTEREST_EXPENSE",
637
- "FEE_COMMISSION_EXPENSE",
638
- "RESEARCH_EXPENSE",
639
- "OPERATE_TAX_ADD",
640
- "SALE_EXPENSE",
641
- "MANAGE_EXPENSE",
642
- "FINANCE_EXPENSE",
643
- "FE_INTEREST_EXPENSE",
644
- "FE_INTEREST_INCOME",
645
- "FAIRVALUE_CHANGE_INCOME",
646
- "INVEST_INCOME",
647
- "ASSET_DISPOSAL_INCOME",
648
- "CREDIT_IMPAIRMENT_INCOME",
649
- "OTHER_INCOME",
650
- "OPERATE_PROFIT",
651
- "NONBUSINESS_INCOME",
652
- "NONBUSINESS_EXPENSE",
653
- "TOTAL_PROFIT",
654
- "INCOME_TAX",
655
- "NETPROFIT",
656
- "CONTINUED_NETPROFIT",
657
- "PARENT_NETPROFIT",
658
- 'MINORITY_INTEREST',
659
- 'DEDUCT_PARENT_NETPROFIT',
660
- 'BASIC_EPS',
661
- 'DILUTED_EPS',
662
- 'OTHER_COMPRE_INCOME',
663
- 'PARENT_OCI',
664
- 'TOTAL_COMPRE_INCOME',
665
- 'PARENT_TCI',
666
- 'MINORITY_TCI',
667
- 'OPINION_TYPE'
668
- ]]
669
- mongodb_util.insert_mongo(stock_financial_benefit_ths_df, 'stock_financial_benefit_ths_df')
670
- return stock_financial_benefit_ths_df
419
+ query = {'SECURITY_CODE': symbol}
420
+ exist_asset_em_df = mongodb_util.find_query_data(db_name_constant.EM_STOCK_ASSET_LIABILITY, query)
421
+ if data_frame_util.is_not_empty(exist_asset_em_df):
422
+ new_asset_df = stock_balance_sheet_by_report_em_df.loc[
423
+ ~(stock_balance_sheet_by_report_em_df['SECURITY_CODE'].isin(list(exist_asset_em_df['SECURITY_CODE'])))]
424
+ else:
425
+ new_asset_df = stock_balance_sheet_by_report_em_df
426
+ if data_frame_util.is_empty(new_asset_df):
427
+ return None
428
+ new_asset_df.fillna(0, inplace=True)
429
+ mongodb_util.insert_mongo(new_asset_df, db_name_constant.EM_STOCK_ASSET_LIABILITY)
671
430
 
672
431
 
673
432
  if __name__ == '__main__':
674
- get_em_benefit_api('SH600519')
675
- get_em_debt_api('SH600519')
433
+ get_em_asset_liability_api('832876')
676
434
 
677
435
  stock_cash_flow_sheet_by_report_em_df = ak.stock_cash_flow_sheet_by_report_em(symbol="SH600519")
678
436
  print(stock_cash_flow_sheet_by_report_em_df)
@@ -0,0 +1,342 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+
9
+ import akshare as ak
10
+ from mns_common.db.MongodbUtil import MongodbUtil
11
+ import mns_common.utils.data_frame_util as data_frame_util
12
+
13
+ mongodb_util = MongodbUtil('27017')
14
+ import mns_common.constant.db_name_constant as db_name_constant
15
+ import mns_scheduler.finance.finance_common_api as finance_common_api
16
+ from loguru import logger
17
+
18
+
19
+ # 利润表
20
+ # "_id" : ObjectId("6644085f608b7737dee21a3a"),
21
+ # "SECUCODE" : "600519.SH",
22
+ # "SECURITY_CODE" : "600519",
23
+ # "SECURITY_NAME_ABBR" : "贵州茅台",
24
+ # "ORG_CODE" : "10002602",
25
+ # "ORG_TYPE" : "通用",
26
+ # "REPORT_DATE" : "2023-12-31 00:00:00",
27
+ # "REPORT_TYPE" : "年报",
28
+ # "REPORT_DATE_NAME" : "2023年报",
29
+ # "SECURITY_TYPE_CODE" : "058001001",
30
+ # "NOTICE_DATE" : "2024-04-03 00:00:00",
31
+ # "UPDATE_DATE" : "2024-04-03 00:00:00",
32
+ # "CURRENCY" : "CNY",
33
+ # "TOTAL_OPERATE_INCOME" : 150560330316.45, 营业总收入
34
+ # "TOTAL_OPERATE_INCOME_YOY" : 18.0365792459, 总运营收入修正
35
+ # "OPERATE_INCOME" : 147693604994.14, 营业收入
36
+ # "OPERATE_INCOME_YOY" : 19.0119185529, 营业收入修正
37
+ # "INTEREST_INCOME" : 2866725322.31, 利息收入
38
+ # "INTEREST_INCOME_YOY" : 利息收入修正
39
+ # "EARNED_PREMIUM" : NaN,
40
+ # "EARNED_PREMIUM_YOY" : NaN,
41
+ # "FEE_COMMISSION_INCOME" : NaN,
42
+ # "FEE_COMMISSION_INCOME_YOY" : NaN,
43
+ # "OTHER_BUSINESS_INCOME" : NaN,
44
+ # "OTHER_BUSINESS_INCOME_YOY" : NaN,
45
+ # "TOI_OTHER" : NaN,
46
+ # "TOI_OTHER_YOY" : NaN,
47
+ # "TOTAL_OPERATE_COST" : 46960889468.54, 营业总成本
48
+ # "TOTAL_OPERATE_COST_YOY" : 18.1456266222,
49
+ # "OPERATE_COST" : 11867273851.78, 营业成本
50
+ # "OPERATE_COST_YOY" : 17.5737925437,
51
+ # "INTEREST_EXPENSE" : 113500129.93, 利息支出
52
+ # "INTEREST_EXPENSE_YOY" : 7.4972611642,
53
+ # "FEE_COMMISSION_EXPENSE" : 68578.57, 手续费及佣金支出
54
+ # "FEE_COMMISSION_EXPENSE_YOY" : -52.0903684752,
55
+ # "RESEARCH_EXPENSE" : 157371873.01, 研发费用
56
+ # "RESEARCH_EXPENSE_YOY" : 16.4116440028,
57
+ # "SURRENDER_VALUE" : NaN,
58
+ # "SURRENDER_VALUE_YOY" : NaN,
59
+ # "NET_COMPENSATE_EXPENSE" : NaN,
60
+ # "NET_COMPENSATE_EXPENSE_YOY" : NaN,
61
+ # "NET_CONTRACT_RESERVE" : NaN,
62
+ # "NET_CONTRACT_RESERVE_YOY" : NaN,
63
+ # "POLICY_BONUS_EXPENSE" : NaN,
64
+ # "POLICY_BONUS_EXPENSE_YOY" : NaN,
65
+ # "REINSURE_EXPENSE" : NaN,
66
+ # "REINSURE_EXPENSE_YOY" : NaN,
67
+ # "OTHER_BUSINESS_COST" : NaN,
68
+ # "OTHER_BUSINESS_COST_YOY" : NaN,
69
+ # "OPERATE_TAX_ADD" : 22234175898.6, 税金及附加
70
+ # "OPERATE_TAX_ADD_YOY" : 20.2119055043,
71
+ # "SALE_EXPENSE" : 4648613585.82, 销售费用
72
+ # "SALE_EXPENSE_YOY" : 40.9642928475,
73
+ # "MANAGE_EXPENSE" : 9729389252.31, 管理费用
74
+ # "MANAGE_EXPENSE_YOY" : 7.9580889133,
75
+ # "ME_RESEARCH_EXPENSE" : NaN,
76
+ # "ME_RESEARCH_EXPENSE_YOY" : NaN,
77
+ # "FINANCE_EXPENSE" : -1789503701.48, 财务费用
78
+ # "FINANCE_EXPENSE_YOY" : -28.5742355094,
79
+ # "FE_INTEREST_EXPENSE" : 12624628.35, 利息费用
80
+ # "FE_INTEREST_EXPENSE_YOY" : 5.0021902771,
81
+ # "FE_INTEREST_INCOME" : 1942301920.98, 利息收入
82
+ # "FE_INTEREST_INCOME_YOY" : 31.6437955552,
83
+ # "ASSET_IMPAIRMENT_LOSS" : NaN,
84
+ # "ASSET_IMPAIRMENT_LOSS_YOY" : NaN,
85
+ # "CREDIT_IMPAIRMENT_LOSS" : NaN,
86
+ # "CREDIT_IMPAIRMENT_LOSS_YOY" : NaN,
87
+ # "TOC_OTHER" : NaN,
88
+ # "TOC_OTHER_YOY" : NaN,
89
+ # "FAIRVALUE_CHANGE_INCOME" : 3151962.5, :公允价值变动收益
90
+ # "FAIRVALUE_CHANGE_INCOME_YOY" : NaN,
91
+ # "INVEST_INCOME" : 34025967.82, 投资收益
92
+ # "INVEST_INCOME_YOY" : -46.7011782268,
93
+ # "INVEST_JOINT_INCOME" : NaN,
94
+ # "INVEST_JOINT_INCOME_YOY" : NaN,
95
+ # "NET_EXPOSURE_INCOME" : NaN,
96
+ # "NET_EXPOSURE_INCOME_YOY" : NaN,
97
+ # "EXCHANGE_INCOME" : NaN,
98
+ # "EXCHANGE_INCOME_YOY" : NaN,
99
+ # "ASSET_DISPOSAL_INCOME" : -479736.97, 资产处置收益
100
+ # "ASSET_DISPOSAL_INCOME_YOY" : -324.9796785895,
101
+ # "ASSET_IMPAIRMENT_INCOME" : NaN,
102
+ # "ASSET_IMPAIRMENT_INCOME_YOY" : NaN,
103
+ # "CREDIT_IMPAIRMENT_INCOME" : 37871293.26, 信用减值损失(新)
104
+ # "CREDIT_IMPAIRMENT_INCOME_YOY" : 357.8638477375,
105
+ # "OTHER_INCOME" : 34644873.86, 其他收益
106
+ # "OTHER_INCOME_YOY" : 41.3767542405,
107
+ # "OPERATE_PROFIT_OTHER" : NaN,
108
+ # "OPERATE_PROFIT_OTHER_YOY" : NaN,
109
+ # "OPERATE_PROFIT_BALANCE" : 0.0,
110
+ # "OPERATE_PROFIT_BALANCE_YOY" : NaN,
111
+ # "OPERATE_PROFIT" : 103708655208.38, 营业利润
112
+ # "OPERATE_PROFIT_YOY" : 18.0123117479,
113
+ # "NONBUSINESS_INCOME" : 86779655.95, 加:营业外收入
114
+ # "NONBUSINESS_INCOME_YOY" : 22.4796849672,
115
+ # "NONCURRENT_DISPOSAL_INCOME" : NaN,
116
+ # "NONCURRENT_DISPOSAL_INCOME_YOY" : NaN,
117
+ # "NONBUSINESS_EXPENSE" : 132881174.52, 减:营业外支出
118
+ # "NONBUSINESS_EXPENSE_YOY" : -46.6092621953,
119
+ # "NONCURRENT_DISPOSAL_LOSS" : NaN,
120
+ # "NONCURRENT_DISPOSAL_LOSS_YOY" : NaN,
121
+ # "EFFECT_TP_OTHER" : NaN,
122
+ # "EFFECT_TP_OTHER_YOY" : NaN,
123
+ # "TOTAL_PROFIT_BALANCE" : 0.0,
124
+ # "TOTAL_PROFIT_BALANCE_YOY" : NaN,
125
+ # "TOTAL_PROFIT" : 103662553689.81, 利润总额
126
+ # "TOTAL_PROFIT_YOY" : 18.1993076599,
127
+ # "INCOME_TAX" : 26141077412.01, 减:所得税
128
+ # "INCOME_TAX_YOY" : 17.0909328034,
129
+ # "EFFECT_NETPROFIT_OTHER" : NaN,
130
+ # "EFFECT_NETPROFIT_OTHER_YOY" : NaN,
131
+ # "EFFECT_NETPROFIT_BALANCE" : NaN,
132
+ # "EFFECT_NETPROFIT_BALANCE_YOY" : NaN,
133
+ # "UNCONFIRM_INVEST_LOSS" : NaN,
134
+ # "UNCONFIRM_INVEST_LOSS_YOY" : NaN,
135
+ # "NETPROFIT" : 77521476277.8, 净利润
136
+ # "NETPROFIT_YOY" : 18.5778097415,
137
+ # "PRECOMBINE_PROFIT" : NaN,
138
+ # "PRECOMBINE_PROFIT_YOY" : NaN,
139
+ # "CONTINUED_NETPROFIT" : 77521476277.8, 持续经营净利润
140
+ # "CONTINUED_NETPROFIT_YOY" : 18.5778097415,
141
+ # "DISCONTINUED_NETPROFIT" : NaN,
142
+ # "DISCONTINUED_NETPROFIT_YOY" : NaN,
143
+ # "PARENT_NETPROFIT" : 74734071550.75, 归属于母公司股东的净利润
144
+ # "PARENT_NETPROFIT_YOY" : 19.1598992892,
145
+ # "MINORITY_INTEREST" : 2787404727.05, 少数股东损益
146
+ # "MINORITY_INTEREST_YOY" : 4.8459336455,
147
+ # "DEDUCT_PARENT_NETPROFIT" : 74752564425.52, 扣除非经常性损益后的净利润
148
+ # "DEDUCT_PARENT_NETPROFIT_YOY" : 19.0462109566,
149
+ # "NETPROFIT_OTHER" : NaN,
150
+ # "NETPROFIT_OTHER_YOY" : NaN,
151
+ # "NETPROFIT_BALANCE" : NaN,
152
+ # "NETPROFIT_BALANCE_YOY" : NaN,
153
+ # "BASIC_EPS" : 59.49, 基本每股收益
154
+ # "BASIC_EPS_YOY" : 19.1468055277,
155
+ # "DILUTED_EPS" : 59.49, 稀释每股收益
156
+ # "DILUTED_EPS_YOY" : 19.1468055277,
157
+ # "OTHER_COMPRE_INCOME" : 4715179.82, 其他综合收益
158
+ # "OTHER_COMPRE_INCOME_YOY" : 110.40766101,
159
+ # "PARENT_OCI" : 4715179.82, 归属于母公司股东的其他综合收益
160
+ # "PARENT_OCI_YOY" : 110.40766101,
161
+ # "MINORITY_OCI" : NaN,
162
+ # "MINORITY_OCI_YOY" : NaN,
163
+ # "PARENT_OCI_OTHER" : NaN,
164
+ # "PARENT_OCI_OTHER_YOY" : NaN,
165
+ # "PARENT_OCI_BALANCE" : NaN,
166
+ # "PARENT_OCI_BALANCE_YOY" : NaN,
167
+ # "UNABLE_OCI" : NaN,
168
+ # "UNABLE_OCI_YOY" : NaN,
169
+ # "CREDITRISK_FAIRVALUE_CHANGE" : NaN,
170
+ # "CREDITRISK_FAIRVALUE_CHANGE_YOY" : NaN,
171
+ # "OTHERRIGHT_FAIRVALUE_CHANGE" : NaN,
172
+ # "OTHERRIGHT_FAIRVALUE_CHANGE_YOY" : NaN,
173
+ # "SETUP_PROFIT_CHANGE" : NaN,
174
+ # "SETUP_PROFIT_CHANGE_YOY" : NaN,
175
+ # "RIGHTLAW_UNABLE_OCI" : NaN,
176
+ # "RIGHTLAW_UNABLE_OCI_YOY" : NaN,
177
+ # "UNABLE_OCI_OTHER" : NaN,
178
+ # "UNABLE_OCI_OTHER_YOY" : NaN,
179
+ # "UNABLE_OCI_BALANCE" : NaN,
180
+ # "UNABLE_OCI_BALANCE_YOY" : NaN,
181
+ # "ABLE_OCI" : 4715179.82,
182
+ # "ABLE_OCI_YOY" : 110.40766101,
183
+ # "RIGHTLAW_ABLE_OCI" : NaN,
184
+ # "RIGHTLAW_ABLE_OCI_YOY" : NaN,
185
+ # "AFA_FAIRVALUE_CHANGE" : NaN,
186
+ # "AFA_FAIRVALUE_CHANGE_YOY" : NaN,
187
+ # "HMI_AFA" : NaN,
188
+ # "HMI_AFA_YOY" : NaN,
189
+ # "CASHFLOW_HEDGE_VALID" : NaN,
190
+ # "CASHFLOW_HEDGE_VALID_YOY" : NaN,
191
+ # "CREDITOR_FAIRVALUE_CHANGE" : NaN,
192
+ # "CREDITOR_FAIRVALUE_CHANGE_YOY" : NaN,
193
+ # "CREDITOR_IMPAIRMENT_RESERVE" : NaN,
194
+ # "CREDITOR_IMPAIRMENT_RESERVE_YOY" : NaN,
195
+ # "FINANCE_OCI_AMT" : NaN,
196
+ # "FINANCE_OCI_AMT_YOY" : NaN,
197
+ # "CONVERT_DIFF" : 4715179.82,
198
+ # "CONVERT_DIFF_YOY" : 110.40766101,
199
+ # "ABLE_OCI_OTHER" : NaN,
200
+ # "ABLE_OCI_OTHER_YOY" : NaN,
201
+ # "ABLE_OCI_BALANCE" : NaN,
202
+ # "ABLE_OCI_BALANCE_YOY" : NaN,
203
+ # "OCI_OTHER" : NaN,
204
+ # "OCI_OTHER_YOY" : NaN,
205
+ # "OCI_BALANCE" : NaN,
206
+ # "OCI_BALANCE_YOY" : NaN,
207
+ # "TOTAL_COMPRE_INCOME" : 77526191457.62, 综合收益总额
208
+ # "TOTAL_COMPRE_INCOME_YOY" : 18.5809573963,
209
+ # "PARENT_TCI" : 74738786730.57, 归属于母公司股东的综合收益总额
210
+ # "PARENT_TCI_YOY" : 19.1631595692,
211
+ # "MINORITY_TCI" : 2787404727.05, 归属于少数股东的综合收益总额
212
+ # "MINORITY_TCI_YOY" : 4.8459336455,
213
+ # "PRECOMBINE_TCI" : NaN,
214
+ # "PRECOMBINE_TCI_YOY" : NaN,
215
+ # "EFFECT_TCI_BALANCE" : NaN,
216
+ # "EFFECT_TCI_BALANCE_YOY" : NaN,
217
+ # "TCI_OTHER" : NaN,
218
+ # "TCI_OTHER_YOY" : NaN,
219
+ # "TCI_BALANCE" : NaN,
220
+ # "TCI_BALANCE_YOY" : NaN,
221
+ # "ACF_END_INCOME" : NaN,
222
+ # "ACF_END_INCOME_YOY" : NaN,
223
+ # "OPINION_TYPE" : "标准无保留意见" 审计意见(境内)
224
+ # https://emweb.securities.eastmoney.com/PC_HSF10/NewFinanceAnalysis/Index?type=web&code=sh600519#lrb-0
225
+ def get_em_profit_api(symbol):
226
+ sec_code = finance_common_api.get_sec_code(symbol)
227
+ try:
228
+ stock_profit_sheet_by_report_em = ak.stock_profit_sheet_by_report_em(sec_code)
229
+ except Exception as e:
230
+ logger.error("同步利润表异常:{},{}", symbol, e)
231
+ if data_frame_util.is_empty(stock_profit_sheet_by_report_em):
232
+ return None
233
+ stock_profit_sheet_by_report_em = check_columns(stock_profit_sheet_by_report_em)
234
+ stock_profit_sheet_by_report_em = stock_profit_sheet_by_report_em[[
235
+ "SECUCODE",
236
+ "SECURITY_CODE",
237
+ "SECURITY_NAME_ABBR",
238
+ "ORG_CODE",
239
+ "ORG_TYPE",
240
+ "REPORT_DATE",
241
+ "REPORT_TYPE",
242
+ "REPORT_DATE_NAME",
243
+ "SECURITY_TYPE_CODE",
244
+ "NOTICE_DATE",
245
+ "UPDATE_DATE",
246
+ "CURRENCY",
247
+ "TOTAL_OPERATE_INCOME",
248
+ "OPERATE_INCOME",
249
+ "INTEREST_INCOME",
250
+ "TOTAL_OPERATE_COST",
251
+ "OPERATE_COST",
252
+ "INTEREST_EXPENSE",
253
+ "FEE_COMMISSION_EXPENSE",
254
+ "RESEARCH_EXPENSE",
255
+ "OPERATE_TAX_ADD",
256
+ "SALE_EXPENSE",
257
+ "MANAGE_EXPENSE",
258
+ "FINANCE_EXPENSE",
259
+ "FE_INTEREST_EXPENSE",
260
+ "FE_INTEREST_INCOME",
261
+ "FAIRVALUE_CHANGE_INCOME",
262
+ "INVEST_INCOME",
263
+ "ASSET_DISPOSAL_INCOME",
264
+ "CREDIT_IMPAIRMENT_INCOME",
265
+ "OTHER_INCOME",
266
+ "OPERATE_PROFIT",
267
+ "NONBUSINESS_INCOME",
268
+ "NONBUSINESS_EXPENSE",
269
+ "TOTAL_PROFIT",
270
+ "INCOME_TAX",
271
+ "NETPROFIT",
272
+ "CONTINUED_NETPROFIT",
273
+ "PARENT_NETPROFIT",
274
+ 'MINORITY_INTEREST',
275
+ 'DEDUCT_PARENT_NETPROFIT',
276
+ 'BASIC_EPS',
277
+ 'DILUTED_EPS',
278
+ 'OTHER_COMPRE_INCOME',
279
+ 'PARENT_OCI',
280
+ 'TOTAL_COMPRE_INCOME',
281
+ 'PARENT_TCI',
282
+ 'MINORITY_TCI',
283
+ 'OPINION_TYPE'
284
+ ]]
285
+ stock_profit_sheet_by_report_em['_id'] = (stock_profit_sheet_by_report_em['SECURITY_CODE']
286
+ + "_" + stock_profit_sheet_by_report_em['REPORT_DATE'])
287
+
288
+ query = {'SECURITY_CODE': symbol}
289
+ exist_profit_em_df = mongodb_util.find_query_data(db_name_constant.EM_STOCK_PROFIT, query)
290
+ if data_frame_util.is_not_empty(exist_profit_em_df):
291
+ new_profit_df = stock_profit_sheet_by_report_em.loc[
292
+ ~(stock_profit_sheet_by_report_em['SECURITY_CODE'].isin(list(exist_profit_em_df['SECURITY_CODE'])))]
293
+ else:
294
+ new_profit_df = stock_profit_sheet_by_report_em
295
+ if data_frame_util.is_empty(new_profit_df):
296
+ return None
297
+ new_profit_df.fillna(0, inplace=True)
298
+ return new_profit_df
299
+
300
+
301
+ def check_columns(profit_df):
302
+ if 'TOTAL_OPERATE_INCOME' not in profit_df.columns:
303
+ profit_df['TOTAL_OPERATE_INCOME'] = 0
304
+
305
+ if 'INTEREST_INCOME' not in profit_df.columns:
306
+ profit_df['INTEREST_INCOME'] = 0
307
+ if 'TOTAL_OPERATE_COST' not in profit_df.columns:
308
+ profit_df['TOTAL_OPERATE_COST'] = 0
309
+ if 'OPERATE_COST' not in profit_df.columns:
310
+ profit_df['OPERATE_COST'] = 0
311
+ if 'INTEREST_EXPENSE' not in profit_df.columns:
312
+ profit_df['INTEREST_EXPENSE'] = 0
313
+ if 'FEE_COMMISSION_EXPENSE' not in profit_df.columns:
314
+ profit_df['FEE_COMMISSION_EXPENSE'] = 0
315
+ if 'RESEARCH_EXPENSE' not in profit_df.columns:
316
+ profit_df['RESEARCH_EXPENSE'] = 0
317
+ if 'SALE_EXPENSE' not in profit_df.columns:
318
+ profit_df['SALE_EXPENSE'] = 0
319
+ if 'MANAGE_EXPENSE' not in profit_df.columns:
320
+ profit_df['MANAGE_EXPENSE'] = 0
321
+ if 'FINANCE_EXPENSE' not in profit_df.columns:
322
+ profit_df['FINANCE_EXPENSE'] = 0
323
+ if 'FE_INTEREST_EXPENSE' not in profit_df.columns:
324
+ profit_df['FE_INTEREST_EXPENSE'] = 0
325
+ if 'FE_INTEREST_INCOME' not in profit_df.columns:
326
+ profit_df['FE_INTEREST_INCOME'] = 0
327
+ if 'CREDIT_IMPAIRMENT_INCOME' not in profit_df.columns:
328
+ profit_df['CREDIT_IMPAIRMENT_INCOME'] = 0
329
+ if 'FAIRVALUE_CHANGE_INCOME' not in profit_df.columns:
330
+ profit_df['FAIRVALUE_CHANGE_INCOME'] = 0
331
+ return profit_df
332
+
333
+
334
+ import mns_common.api.em.east_money_stock_api as east_money_stock_api
335
+
336
+ if __name__ == '__main__':
337
+ em_df = east_money_stock_api.get_real_time_quotes_all_stocks()
338
+ for em_one in em_df.itertuples():
339
+ try:
340
+ get_em_profit_api(em_one.symbol)
341
+ except Exception as e:
342
+ logger.error("同步利润表异常:{},{}", em_one.symbol, e)
@@ -0,0 +1,35 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+
9
+ import mns_common.component.common_service_fun_api as common_service_fun_api
10
+ from mns_common.db.MongodbUtil import MongodbUtil
11
+ import mns_common.constant.db_name_constant as db_name_constant
12
+
13
+ mongodb_util = MongodbUtil('27017')
14
+
15
+
16
+ def get_sec_code(symbol):
17
+ classification = common_service_fun_api.classify_symbol_one(symbol)
18
+ if classification in ['K', 'H']:
19
+ return 'SH' + symbol
20
+ elif classification in ['C', 'S']:
21
+ return 'SZ' + symbol
22
+ else:
23
+ return 'BJ' + symbol
24
+
25
+
26
+ # 查询利润表数据
27
+ def find_profit_report(period_time):
28
+ query = {"REPORT_DATE": period_time}
29
+ return mongodb_util.find_query_data(db_name_constant.EM_STOCK_PROFIT, query)
30
+
31
+
32
+ # 查询资产表
33
+ def find_asset_liability_report(period_time):
34
+ query = {"REPORT_DATE": period_time}
35
+ return mongodb_util.find_query_data(db_name_constant.EM_STOCK_ASSET_LIABILITY, query)
@@ -0,0 +1,178 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ from datetime import datetime
9
+ import mns_common.component.self_choose.black_list_service_api as black_list_service_api
10
+ import mns_scheduler.finance.finance_common_api as finance_common_api
11
+ from loguru import logger
12
+ import mns_common.constant.db_name_constant as db_name_constant
13
+ from mns_common.db.MongodbUtil import MongodbUtil
14
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
15
+ import mns_common.component.common_service_fun_api as common_service_fun_api
16
+ import pandas as pd
17
+ # 1.无保留意见/标准报告:报告没问题。(没有发现造假,但也不能保证为真)
18
+ #
19
+ # 2.带强调事项段的无保留意见:报告没问题,但是有亏损获对其可持续经营有重大疑虑(可能造假,至少是在粉饰报表)
20
+ #
21
+ # 3.保留意见报告:有问题,财务造假
22
+ #
23
+ # 4.否定意见报告:有很大问题
24
+ #
25
+ # 5.无法表示意见报告:不让查
26
+ #
27
+
28
+ mongodb_util = MongodbUtil('27017')
29
+ # 审核标准意见
30
+ OPINION_TYPE = "标准无保留意见"
31
+
32
+ # 利润为负的时候最小营业收入 主板 3.2亿
33
+ MIN_INCOME_MAIN = 320000000
34
+ # 利润为负的时候最小营业收入 科创 创业 1.2亿
35
+ MIN_INCOME_SUB = 120000000
36
+ # 最大负债比
37
+ MAX_LIABILITY_RATIO = 90
38
+ # 最迟出报告的天数
39
+ LATE_REPORT_DAYS = 3
40
+
41
+
42
+ #### 退市新规 ####
43
+ # 1 股价类:连续20个交易日估价低于1元
44
+ # 2 市值类: 主板小于5亿、创业板3亿
45
+ # 3 财务类: (1) 利润总额 净利润 扣非净利润三者最小值为负 且营业收入小于3亿 创业板营业收入小于1元
46
+ # (2) 资不抵债
47
+
48
+ # 财报审核
49
+ def financial_report_check(new_report_df, period_time, period, report_type):
50
+ if period == 4:
51
+ # 年报异常审核
52
+ year_report_exception_check(new_report_df, period_time, report_type)
53
+ # 负债过高
54
+ liability_ratio_check(report_type, new_report_df, period_time)
55
+
56
+
57
+ # 年报审核异常
58
+ def year_report_exception_check(new_report_df, period_time, report_type):
59
+ new_report_one_df = new_report_df.loc[new_report_df['REPORT_DATE'] == period_time]
60
+ # 审核意见
61
+ opinion_type = list(new_report_one_df['OPINION_TYPE'])[0]
62
+ symbol = list(new_report_one_df['SECURITY_CODE'])[0]
63
+ name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
64
+ now_date = datetime.now()
65
+ str_day = now_date.strftime('%Y-%m-%d')
66
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
67
+ id_key = symbol + "_" + period_time
68
+ # 年报有问题
69
+ if opinion_type != OPINION_TYPE:
70
+ black_list_service_api.save_black_stock(id_key,
71
+ symbol,
72
+ name,
73
+ str_day,
74
+ str_now_date,
75
+ '年报审计有问题:'+"["+opinion_type+"]",
76
+ '年报审计有问题',
77
+ '',
78
+ black_list_service_api.FINANCIAL_PROBLEM)
79
+
80
+ if report_type == db_name_constant.EM_STOCK_PROFIT:
81
+ # 利润总额 净利润 扣除非经常性损益后的净利润 三者最小为负
82
+ # 利润总额
83
+ total_profit = list(new_report_one_df['TOTAL_PROFIT'])[0]
84
+ # 净利润
85
+ net_profit = list(new_report_one_df['NETPROFIT'])[0]
86
+ # 营业利润
87
+ operate_profit = list(new_report_one_df['OPERATE_PROFIT'])[0]
88
+ # 持续经营净利润
89
+ continued_profit = list(new_report_one_df['CONTINUED_NETPROFIT'])[0]
90
+ # 归属于母公司股东的净利润
91
+ parent_profit = list(new_report_one_df['PARENT_NETPROFIT'])[0]
92
+ # 扣除非经常性损益后的净利润
93
+ deduct_parent_profit = list(new_report_one_df['DEDUCT_PARENT_NETPROFIT'])[0]
94
+ # 营业总收入
95
+ total_operate_income = list(new_report_one_df['TOTAL_OPERATE_INCOME'])[0]
96
+
97
+ # 最小利润收入
98
+ min_profit = min(total_profit, net_profit, operate_profit,
99
+ continued_profit, parent_profit, deduct_parent_profit)
100
+ if min_profit < 0:
101
+
102
+ classification = common_service_fun_api.classify_symbol_one(symbol)
103
+ if ((classification in ['S', 'H'] and total_operate_income < MIN_INCOME_MAIN)
104
+ | (classification in ['K', 'C'] and total_operate_income < MIN_INCOME_SUB)):
105
+ id_key = symbol + "_" + period_time
106
+ black_list_service_api.save_black_stock(id_key,
107
+ symbol,
108
+ name,
109
+ str_day,
110
+ str_now_date,
111
+ '年报&利润收入触发退市',
112
+ '年报&利润收入触发退市',
113
+ '',
114
+ black_list_service_api.FINANCIAL_PROBLEM)
115
+
116
+
117
+ # 负债比校验
118
+ def liability_ratio_check(report_type, new_report_df, period_time):
119
+ if report_type == db_name_constant.EM_STOCK_ASSET_LIABILITY:
120
+ new_report_df = new_report_df.sort_values(by=['REPORT_DATE'], ascending=False)
121
+ new_report_one_df = new_report_df.iloc[0:1]
122
+ # 负债比
123
+ liability_ratio = list(new_report_one_df['liability_ratio'])[0]
124
+
125
+ symbol = list(new_report_one_df['SECURITY_CODE'])[0]
126
+ name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
127
+ now_date = datetime.now()
128
+ str_day = now_date.strftime('%Y-%m-%d')
129
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
130
+ id_key = symbol + "_" + period_time
131
+
132
+ if liability_ratio >= MAX_LIABILITY_RATIO:
133
+ black_list_service_api.save_black_stock(id_key,
134
+ symbol,
135
+ name,
136
+ str_day,
137
+ str_now_date,
138
+ '负债过高',
139
+ '负债过高',
140
+ '',
141
+ black_list_service_api.FINANCIAL_PROBLEM)
142
+
143
+
144
+ # 未出财报
145
+ def un_report_check(sync_time, now_year, period, period_time):
146
+ un_report_asset_df = finance_common_api.find_un_report_symbol(period_time,
147
+ db_name_constant.EM_STOCK_ASSET_LIABILITY)
148
+ un_report_profit_df = finance_common_api.find_un_report_symbol(period_time,
149
+ db_name_constant.EM_STOCK_PROFIT)
150
+ un_report_df = pd.concat([un_report_asset_df, un_report_profit_df])
151
+ if period == 4 or period == 1:
152
+ last_report_day = str(now_year) + "-05-01"
153
+ elif period == 2:
154
+ last_report_day = str(now_year) + "-07-01"
155
+ elif period == 3:
156
+ last_report_day = str(now_year) + "-10-01"
157
+ max_report_day = trade_date_common_service_api.get_before_trade_date(last_report_day, LATE_REPORT_DAYS)
158
+ if max_report_day > sync_time:
159
+
160
+ for un_asset_one in un_report_df.itertuples():
161
+ symbol = un_asset_one.symbol
162
+ id_key = symbol + "_" + period_time
163
+ name = un_asset_one.name
164
+ now_date = datetime.now()
165
+ str_day = now_date.strftime('%Y-%m-%d')
166
+ try:
167
+
168
+ black_list_service_api.save_black_stock(id_key,
169
+ symbol,
170
+ name,
171
+ str_day,
172
+ sync_time,
173
+ '未出财报',
174
+ '未出财报',
175
+ '',
176
+ black_list_service_api.FINANCIAL_PROBLEM)
177
+ except Exception as e:
178
+ logger.error("同步利润表异常:{},{},{}", symbol, period_time, e)
@@ -0,0 +1,133 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ from datetime import datetime
9
+ import mns_common.api.em.east_money_stock_api as east_money_stock_api
10
+ import mns_scheduler.finance.finance_common_api as finance_common_api
11
+ import mns_common.constant.db_name_constant as db_name_constant
12
+ import mns_scheduler.finance.em_financial_profit_sync_service_api as em_financial_profit_sync_service_api
13
+ from mns_common.db.MongodbUtil import MongodbUtil
14
+ from loguru import logger
15
+ import \
16
+ mns_scheduler.finance.em_financial_asset_liability_sync_service_api as em_financial_asset_liability_sync_service_api
17
+ import mns_scheduler.finance.financial_high_risk_stock_clean_service_api as financial_high_risk_stock_clean_service_api
18
+ import mns_common.utils.data_frame_util as data_frame_util
19
+
20
+ mongodb_util = MongodbUtil('27017')
21
+
22
+
23
+ # 上市公司年报披露时间:每年1月1日一- 4月30日。
24
+ # 2、上市公司中年报披露时间:每年7月1日--8月30日。
25
+ # 3、上市公司季报披露时间:
26
+ # 1季报:每年4月1日-- -4月30日。
27
+ # 2季报(中报) :每年7月1日--8月30日。
28
+ # 3季报:每年10月1日--10月31日4季报(年报) :每年1月1日--4月30日
29
+
30
+ def sync_financial_report():
31
+ now_date = datetime.now()
32
+ now_year = now_date.year
33
+ now_month = now_date.month
34
+ sync_time = now_date.strftime('%Y-%m-%d %H:%M:%S')
35
+ # 年报
36
+ if 1 <= now_month <= 5:
37
+ period = 4
38
+ period_time = str(now_year - 1) + "-12-31 00:00:00"
39
+ sync_profit_report(period_time, sync_time, period, now_year)
40
+ sync_asset_liability_report(period_time, sync_time, period, now_year)
41
+
42
+ # 一季报
43
+ elif now_month == 5:
44
+ period = 1
45
+ period_time = str(now_year) + "-03-31 00:00:00"
46
+ sync_profit_report(period_time, sync_time, period, now_year)
47
+ sync_asset_liability_report(period_time, sync_time, period, now_year)
48
+
49
+ # 二季报
50
+ elif 7 <= now_month <= 8:
51
+ period = 2
52
+ period_time = str(now_year) + "-06-30 00:00:00"
53
+ sync_profit_report(period_time, sync_time, period, now_year)
54
+ sync_asset_liability_report(period_time, sync_time, period, now_year)
55
+ # 三季报
56
+ elif now_month == 10:
57
+ period = 3
58
+ period_time = str(now_year) + "-09-30 00:00:00"
59
+ sync_profit_report(period_time, sync_time, period, now_year)
60
+ sync_asset_liability_report(period_time, sync_time, period, now_year)
61
+ # 未出报告check
62
+ financial_high_risk_stock_clean_service_api.un_report_check(sync_time, now_year, period, period_time)
63
+
64
+
65
+ # 同步资产表
66
+ def sync_asset_liability_report(period_time, sync_time, period, now_year):
67
+ un_report_asset_df = find_un_report_symbol(period_time, db_name_constant.EM_STOCK_ASSET_LIABILITY)
68
+ for un_report_asset_one in un_report_asset_df.itertuples():
69
+ try:
70
+ symbol = un_report_asset_one.symbol
71
+ new_asset_df = em_financial_asset_liability_sync_service_api.get_em_asset_liability_api(symbol)
72
+ # 负债比
73
+ new_asset_df['liability_ratio'] = round(
74
+ new_asset_df['TOTAL_LIABILITIES'] * 100 / new_asset_df['TOTAL_ASSETS'],
75
+ 2)
76
+ new_asset_df['sync_time'] = sync_time
77
+ if data_frame_util.is_empty(new_asset_df):
78
+ continue
79
+ new_asset_df['symbol'] = symbol
80
+ mongodb_util.insert_mongo(new_asset_df, db_name_constant.EM_STOCK_ASSET_LIABILITY)
81
+
82
+ # 年报审核
83
+ financial_high_risk_stock_clean_service_api.financial_report_check(new_asset_df, period_time, period,
84
+ db_name_constant.EM_STOCK_ASSET_LIABILITY)
85
+
86
+ except Exception as e:
87
+ logger.error("同步利润表异常:{},{},{}", symbol, period_time, e)
88
+
89
+
90
+ # 同步利润表
91
+ def sync_profit_report(period_time, sync_time, period, now_year):
92
+ un_report_profit_df = find_un_report_symbol(period_time, db_name_constant.EM_STOCK_PROFIT)
93
+ for un_report_profit_one in un_report_profit_df.itertuples():
94
+ try:
95
+ symbol = un_report_profit_one.symbol
96
+ new_profit_df = em_financial_profit_sync_service_api.get_em_profit_api(symbol)
97
+ new_profit_df['sync_time'] = sync_time
98
+ if data_frame_util.is_empty(new_profit_df):
99
+ continue
100
+ new_profit_df['symbol'] = symbol
101
+ mongodb_util.insert_mongo(new_profit_df, db_name_constant.EM_STOCK_PROFIT)
102
+
103
+ # 年报审核
104
+ financial_high_risk_stock_clean_service_api.financial_report_check(new_profit_df, period_time,
105
+ period, db_name_constant.EM_STOCK_PROFIT)
106
+ except Exception as e:
107
+ logger.error("同步利润表异常:{},{},{}", symbol, period_time, e)
108
+
109
+
110
+ # 查出未报告的股票
111
+ def find_un_report_symbol(period_time, report_name):
112
+ real_time_quotes_df = east_money_stock_api.get_real_time_quotes_all_stocks()
113
+ real_time_quotes_df = real_time_quotes_df.loc[~(real_time_quotes_df['name'].str.contains('退'))]
114
+
115
+ de_list_stock_df = mongodb_util.find_all_data(db_name_constant.DE_LIST_STOCK)
116
+ real_time_quotes_df = real_time_quotes_df.loc[
117
+ ~(real_time_quotes_df['symbol'].isin(list(de_list_stock_df['symbol'])))]
118
+
119
+ if report_name == db_name_constant.EM_STOCK_ASSET_LIABILITY:
120
+ had_asset_df = finance_common_api.find_asset_liability_report(period_time)
121
+ if data_frame_util.is_not_empty(had_asset_df):
122
+ real_time_quotes_df = real_time_quotes_df.loc[
123
+ ~(real_time_quotes_df['symbol'].isin(list(had_asset_df['SECURITY_CODE'])))]
124
+ if report_name == db_name_constant.EM_STOCK_PROFIT:
125
+ had_profit_df = finance_common_api.find_profit_report(period_time)
126
+ if data_frame_util.is_not_empty(had_profit_df):
127
+ real_time_quotes_df = real_time_quotes_df.loc[
128
+ ~(real_time_quotes_df['symbol'].isin(list(had_profit_df['SECURITY_CODE'])))]
129
+ return real_time_quotes_df
130
+
131
+
132
+ if __name__ == '__main__':
133
+ sync_financial_report()
@@ -105,7 +105,8 @@ def sync_new_high_risk_stocks():
105
105
  announce_time,
106
106
  high_risk_stocks_one.announcementTitle,
107
107
  high_risk_stocks_one.announcementTitle,
108
- announce_url)
108
+ announce_url,
109
+ black_list_service_api.REGISTER_INVESTIGATE)
109
110
  except Exception as e:
110
111
  logger.error("保存风险警示股票异常:{},{}", symbol, e)
111
112
 
@@ -40,6 +40,7 @@ import mns_scheduler.kpl.selection.index.sync_best_choose_his_index as sync_best
40
40
  import mns_scheduler.concept.ths.common.ths_concept_update_common_api as ths_concept_update_common_api
41
41
  import mns_scheduler.trade.sync_position_api as sync_position_api
42
42
  import mns_scheduler.concept.clean.kpl_concept_clean_api as kpl_concept_clean_api
43
+ import mns_scheduler.company_info.de_list_stock_service as de_list_stock_service
43
44
 
44
45
 
45
46
  # 同步交易日期任务完成
@@ -281,6 +282,8 @@ def update_ths_concept_choose_null_reason():
281
282
  def update_company_base_info():
282
283
  company_info_sync_api.sync_company_base_info(None)
283
284
  company_info_sync_api.fix_company_industry(None)
285
+ # 退市股票同步
286
+ de_list_stock_service.sync_de_list_stock()
284
287
  logger.info('同步公司基本信息任务完成')
285
288
 
286
289
 
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.0.4.7
3
+ Version: 1.0.4.9
4
4
 
@@ -13,6 +13,7 @@ mns_scheduler/big_deal/ths_big_deal_sync.py,sha256=wezGJWFRnKYBaPP9PVXLqMbHENOXg
13
13
  mns_scheduler/company_info/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
14
14
  mns_scheduler/company_info/company_constant_data.py,sha256=PkV8i2Wx18lSuAj_UuUw_QzhYrRhTE4x3Cft7-P-Ghs,15735
15
15
  mns_scheduler/company_info/company_info_sync_api.py,sha256=kL0QETih5lfczZ2WB9Iopmy4RjpvWY5NKPNVUZ5dq-s,20342
16
+ mns_scheduler/company_info/de_list_stock_service.py,sha256=3yI54c9BVISR8yXaMAzk3nWxuj0a74b0M-tYbPqd34c,1709
16
17
  mns_scheduler/concept/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
17
18
  mns_scheduler/concept/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
18
19
  mns_scheduler/concept/clean/kpl_concept_clean_api.py,sha256=xxIIgrXLI6xLf10t4unJa7aMB_QeKeki1HJVeXsntkY,4512
@@ -33,7 +34,11 @@ mns_scheduler/db/db_status.py,sha256=K1jtYIGZzDV6knpoJLLnXEhN3tyziJp_zY2gSfguHCA
33
34
  mns_scheduler/dt/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
34
35
  mns_scheduler/dt/stock_dt_pool_sync.py,sha256=5ivRUOnFtOapZniwTbujf1lVq3y4btm2Cmd5R6JJAVo,3466
35
36
  mns_scheduler/finance/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
36
- mns_scheduler/finance/em_financial_sync_service_api.py,sha256=al_msr5kXK21ngHL5QMIewNMetk8WsAEPrDXWrCOhqg,26721
37
+ mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py,sha256=7Y5Nc2yzF19LD0j0pqSUtWdeOA08QFgjTfFtfQnF0vA,17231
38
+ mns_scheduler/finance/em_financial_profit_sync_service_api.py,sha256=gc84F8lkHwot0QGfxO3QsZgUc4xJQDZI0rGX7sFmDyo,13989
39
+ mns_scheduler/finance/finance_common_api.py,sha256=yPE0at1WFDyYZ3IAjkgCj6xMH7gPp8sAkJsYj5jhmLk,1075
40
+ mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py,sha256=L4rVsFPbIWvXisMHrVWGb9WuhwYQjyWbDFs5nacN-5Q,8782
41
+ mns_scheduler/finance/sync_financial_report_service_api.py,sha256=bP5e_0ndsAucTUobMtwL4bX1w_APnW_hntfn1_PkJnM,6331
37
42
  mns_scheduler/k_line/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
38
43
  mns_scheduler/k_line/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
39
44
  mns_scheduler/k_line/clean/k_line_info_clean_impl.py,sha256=3NPu-bkBw5ARW2yoMAmf_-au6vxQdSjzGlT-l4dqV4w,21833
@@ -53,7 +58,7 @@ mns_scheduler/real_time/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy
53
58
  mns_scheduler/real_time/realtime_quotes_now_create_db_index.py,sha256=qQCjcsG3WYgn3zemS45Ms0AHtbkCwlSVPPCntxVvK8Q,1066
54
59
  mns_scheduler/real_time/realtime_quotes_now_sync.py,sha256=XIz454cysRO-xfdgsEw3glR0LgTxFdZoCNONd4O7EgM,9165
55
60
  mns_scheduler/risk/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
56
- mns_scheduler/risk/register_and_investigate_stock_sync_api.py,sha256=bpB0dXjAYVUrbtdYCnuT2_vlrBPI2UoMF9ljqnCLw-k,4883
61
+ mns_scheduler/risk/register_and_investigate_stock_sync_api.py,sha256=_6Eh5nPQu5KJ0lherAmB8e-pnk8UHsX3WGZ-Xfqk7Fc,4949
57
62
  mns_scheduler/trade/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
58
63
  mns_scheduler/trade/auto_ipo_buy_api.py,sha256=QXNzFJGNGveVUcXBh0RRJb_HV7abbLYXRljezPJf9ZM,377
59
64
  mns_scheduler/trade/auto_sell_service_api.py,sha256=HaauZeOsuLNBrowXT8IKaSgWLR2Huott6mg_AoLhpUY,4423
@@ -67,9 +72,9 @@ mns_scheduler/zt/today_high_chg_pool_sync_api.py,sha256=G6FXMH7HnvhyMFoE-RszggkB
67
72
  mns_scheduler/zt/zt_five_boards_sync_api.py,sha256=HfjPHKD99fU9c37kSenEX2_qNvFAjQGgy8ERuacSxwk,10916
68
73
  mns_scheduler/zt/zt_pool_sync_api.py,sha256=RrVAbU1u-HTqXF9BSwNlzIxMHrUgjNaLpDKFgXC1XuY,7604
69
74
  mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
70
- mns_scheduler/zz_task/data_sync_task.py,sha256=P75noN2J8YOqht_wyTN5IOZ6NPeTIKhRN4SPZhe6x2A,16100
75
+ mns_scheduler/zz_task/data_sync_task.py,sha256=8vUFAlNgZplQ6v1ConEfY2UZIoei4nUnogXGfF8R1Ck,16256
71
76
  mns_scheduler/zz_task/sync_realtime_quotes_task.py,sha256=DN3bq2XCDZC-PHlbD2NTog48bR44EruIEc2QVGKg7Tk,932
72
- mns_scheduler-1.0.4.7.dist-info/METADATA,sha256=AsY1gD2qxxIGKcjnwk2-UKuo7Tw0xPTZ-N4GObWhHaM,64
73
- mns_scheduler-1.0.4.7.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
74
- mns_scheduler-1.0.4.7.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
75
- mns_scheduler-1.0.4.7.dist-info/RECORD,,
77
+ mns_scheduler-1.0.4.9.dist-info/METADATA,sha256=l-mybQSBRFgd_xsL9wbrUVXrMtRkVHMVnlstBZ9fm78,64
78
+ mns_scheduler-1.0.4.9.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
79
+ mns_scheduler-1.0.4.9.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
80
+ mns_scheduler-1.0.4.9.dist-info/RECORD,,