mns-scheduler 1.0.4.7__py3-none-any.whl → 1.0.4.8__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.

@@ -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,340 @@
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
+ return profit_df
330
+
331
+
332
+ import mns_common.api.em.east_money_stock_api as east_money_stock_api
333
+
334
+ if __name__ == '__main__':
335
+ em_df = east_money_stock_api.get_real_time_quotes_all_stocks()
336
+ for em_one in em_df.itertuples():
337
+ try:
338
+ get_em_profit_api(em_one.symbol)
339
+ except Exception as e:
340
+ 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,168 @@
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
+
18
+ mongodb_util = MongodbUtil('27017')
19
+ # 审核标准意见
20
+ OPINION_TYPE = "标准无保留意见"
21
+
22
+ # 利润为负的时候最小营业收入 主板
23
+ MIN_INCOME_MAIN = 350000000
24
+ # 利润为负的时候最小营业收入 科创 创业
25
+ MIN_INCOME_SUB = 150000000
26
+ # 最大负债比
27
+ MAX_LIABILITY_RATIO = 90
28
+ # 最迟出报告的天数
29
+ LATE_REPORT_DAYS = 3
30
+
31
+
32
+ #### 退市新规 ####
33
+ # 1 股价类:连续20个交易日估价低于1元
34
+ # 2 市值类: 主板小于5亿、创业板3亿
35
+ # 3 财务类: (1) 利润总额 净利润 扣非净利润三者最小值为负 且营业收入小于3亿 创业板营业收入小于1元
36
+ # (2) 资不抵债
37
+
38
+ # 财报审核
39
+ def financial_report_check(new_report_df, period_time, period, report_type):
40
+ if period == 4:
41
+ # 年报异常审核
42
+ year_report_exception_check(new_report_df, period_time, report_type)
43
+ # 负债过高
44
+ liability_ratio_check(report_type, new_report_df, period_time)
45
+
46
+
47
+ # 年报审核异常
48
+ def year_report_exception_check(new_report_df, period_time, report_type):
49
+ new_report_one_df = new_report_df.loc[new_report_df['REPORT_DATE'] == period_time]
50
+ # 审核意见
51
+ opinion_type = list(new_report_one_df['OPINION_TYPE'])[0]
52
+ symbol = list(new_report_one_df['SECURITY_CODE'])[0]
53
+ name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
54
+ now_date = datetime.now()
55
+ str_day = now_date.strftime('%Y-%m-%d')
56
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
57
+ id_key = symbol + "_" + period_time
58
+ # 年报有问题
59
+ if opinion_type != OPINION_TYPE:
60
+ black_list_service_api.save_black_stock(id_key,
61
+ symbol,
62
+ name,
63
+ str_day,
64
+ str_now_date,
65
+ '年报审计有问题',
66
+ '年报审计有问题',
67
+ '',
68
+ black_list_service_api.FINANCIAL_PROBLEM)
69
+
70
+ if report_type == db_name_constant.EM_STOCK_PROFIT:
71
+ # 利润总额 净利润 扣除非经常性损益后的净利润 三者最小为负
72
+ # 利润总额
73
+ total_profit = list(new_report_one_df['TOTAL_PROFIT'])[0]
74
+ # 净利润
75
+ net_profit = list(new_report_one_df['NETPROFIT'])[0]
76
+ # 营业利润
77
+ operate_profit = list(new_report_one_df['OPERATE_PROFIT'])[0]
78
+ # 持续经营净利润
79
+ continued_profit = list(new_report_one_df['CONTINUED_NETPROFIT'])[0]
80
+ # 归属于母公司股东的净利润
81
+ parent_profit = list(new_report_one_df['PARENT_NETPROFIT'])[0]
82
+ # 扣除非经常性损益后的净利润
83
+ deduct_parent_profit = list(new_report_one_df['DEDUCT_PARENT_NETPROFIT'])[0]
84
+ # 营业总收入
85
+ total_operate_income = list(new_report_one_df['TOTAL_OPERATE_INCOME'])[0]
86
+
87
+ # 最小利润收入
88
+ min_profit = min(total_profit, net_profit, operate_profit,
89
+ continued_profit, parent_profit, deduct_parent_profit)
90
+ if min_profit < 0:
91
+
92
+ classification = common_service_fun_api.classify_symbol_one(symbol)
93
+ if ((classification in ['S', 'H'] and total_operate_income < MIN_INCOME_MAIN)
94
+ | (classification in ['K', 'C'] and total_operate_income < MIN_INCOME_SUB)):
95
+ id_key = symbol + "_" + period_time
96
+ black_list_service_api.save_black_stock(id_key,
97
+ symbol,
98
+ name,
99
+ str_day,
100
+ str_now_date,
101
+ '年报&利润收入触发退市',
102
+ '年报&利润收入触发退市',
103
+ '',
104
+ black_list_service_api.FINANCIAL_PROBLEM)
105
+
106
+
107
+ # 负债比校验
108
+ def liability_ratio_check(report_type, new_report_df, period_time):
109
+ if report_type == db_name_constant.EM_STOCK_ASSET_LIABILITY:
110
+ new_report_df = new_report_df.sort_values(by=['REPORT_DATE'], ascending=False)
111
+ new_report_one_df = new_report_df.iloc[0:1]
112
+ # 负债比
113
+ liability_ratio = list(new_report_one_df['liability_ratio'])[0]
114
+
115
+ symbol = list(new_report_one_df['SECURITY_CODE'])[0]
116
+ name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
117
+ now_date = datetime.now()
118
+ str_day = now_date.strftime('%Y-%m-%d')
119
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
120
+ id_key = symbol + "_" + period_time
121
+
122
+ if liability_ratio >= MAX_LIABILITY_RATIO:
123
+ black_list_service_api.save_black_stock(id_key,
124
+ symbol,
125
+ name,
126
+ str_day,
127
+ str_now_date,
128
+ '负债过高',
129
+ '负债过高',
130
+ '',
131
+ black_list_service_api.FINANCIAL_PROBLEM)
132
+
133
+
134
+ # 未出财报
135
+ def un_report_check(sync_time, now_year, period, period_time):
136
+ un_report_asset_df = finance_common_api.find_un_report_symbol(period_time,
137
+ db_name_constant.EM_STOCK_ASSET_LIABILITY)
138
+ un_report_profit_df = finance_common_api.find_un_report_symbol(period_time,
139
+ db_name_constant.EM_STOCK_PROFIT)
140
+ un_report_df = pd.concat([un_report_asset_df, un_report_profit_df])
141
+ if period == 4 or period == 1:
142
+ last_report_day = str(now_year) + "-05-01"
143
+ elif period == 2:
144
+ last_report_day = str(now_year) + "-07-01"
145
+ elif period == 3:
146
+ last_report_day = str(now_year) + "-10-01"
147
+ max_report_day = trade_date_common_service_api.get_before_trade_date(last_report_day, LATE_REPORT_DAYS)
148
+ if max_report_day > sync_time:
149
+
150
+ for un_asset_one in un_report_df.itertuples():
151
+ symbol = un_asset_one.symbol
152
+ id_key = symbol + "_" + period_time
153
+ name = un_asset_one.name
154
+ now_date = datetime.now()
155
+ str_day = now_date.strftime('%Y-%m-%d')
156
+ try:
157
+
158
+ black_list_service_api.save_black_stock(id_key,
159
+ symbol,
160
+ name,
161
+ str_day,
162
+ sync_time,
163
+ '未出财报',
164
+ '未出财报',
165
+ '',
166
+ black_list_service_api.FINANCIAL_PROBLEM)
167
+ except Exception as e:
168
+ logger.error("同步利润表异常:{},{},{}", symbol, period_time, e)
@@ -0,0 +1,127 @@
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
+ if report_name == db_name_constant.EM_STOCK_ASSET_LIABILITY:
114
+ had_asset_df = finance_common_api.find_asset_liability_report(period_time)
115
+ if data_frame_util.is_not_empty(had_asset_df):
116
+ real_time_quotes_df = real_time_quotes_df.loc[
117
+ ~(real_time_quotes_df['symbol'].isin(list(had_asset_df['SECURITY_CODE'])))]
118
+ if report_name == db_name_constant.EM_STOCK_PROFIT:
119
+ had_profit_df = finance_common_api.find_profit_report(period_time)
120
+ if data_frame_util.is_not_empty(had_profit_df):
121
+ real_time_quotes_df = real_time_quotes_df.loc[
122
+ ~(real_time_quotes_df['symbol'].isin(list(had_profit_df['SECURITY_CODE'])))]
123
+ return real_time_quotes_df
124
+
125
+
126
+ if __name__ == '__main__':
127
+ 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
 
@@ -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.8
4
4
 
@@ -33,7 +33,11 @@ mns_scheduler/db/db_status.py,sha256=K1jtYIGZzDV6knpoJLLnXEhN3tyziJp_zY2gSfguHCA
33
33
  mns_scheduler/dt/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
34
34
  mns_scheduler/dt/stock_dt_pool_sync.py,sha256=5ivRUOnFtOapZniwTbujf1lVq3y4btm2Cmd5R6JJAVo,3466
35
35
  mns_scheduler/finance/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
36
- mns_scheduler/finance/em_financial_sync_service_api.py,sha256=al_msr5kXK21ngHL5QMIewNMetk8WsAEPrDXWrCOhqg,26721
36
+ mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py,sha256=7Y5Nc2yzF19LD0j0pqSUtWdeOA08QFgjTfFtfQnF0vA,17231
37
+ mns_scheduler/finance/em_financial_profit_sync_service_api.py,sha256=KZm4cGXJbcRRCbvK08ftf2QP9VWr8UqLAfAJOskte50,13875
38
+ mns_scheduler/finance/finance_common_api.py,sha256=yPE0at1WFDyYZ3IAjkgCj6xMH7gPp8sAkJsYj5jhmLk,1075
39
+ mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py,sha256=ilf5eAWJT9SKXQJbMP-GLp3H-nY7m5MMn-asaTAMMq0,8328
40
+ mns_scheduler/finance/sync_financial_report_service_api.py,sha256=e8ZHmnXr9LOjJc3LuQ1_t9g-5NEDsmjTQn85wVMCQMM,6007
37
41
  mns_scheduler/k_line/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
38
42
  mns_scheduler/k_line/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
39
43
  mns_scheduler/k_line/clean/k_line_info_clean_impl.py,sha256=3NPu-bkBw5ARW2yoMAmf_-au6vxQdSjzGlT-l4dqV4w,21833
@@ -53,7 +57,7 @@ mns_scheduler/real_time/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy
53
57
  mns_scheduler/real_time/realtime_quotes_now_create_db_index.py,sha256=qQCjcsG3WYgn3zemS45Ms0AHtbkCwlSVPPCntxVvK8Q,1066
54
58
  mns_scheduler/real_time/realtime_quotes_now_sync.py,sha256=XIz454cysRO-xfdgsEw3glR0LgTxFdZoCNONd4O7EgM,9165
55
59
  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
60
+ mns_scheduler/risk/register_and_investigate_stock_sync_api.py,sha256=_6Eh5nPQu5KJ0lherAmB8e-pnk8UHsX3WGZ-Xfqk7Fc,4949
57
61
  mns_scheduler/trade/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
58
62
  mns_scheduler/trade/auto_ipo_buy_api.py,sha256=QXNzFJGNGveVUcXBh0RRJb_HV7abbLYXRljezPJf9ZM,377
59
63
  mns_scheduler/trade/auto_sell_service_api.py,sha256=HaauZeOsuLNBrowXT8IKaSgWLR2Huott6mg_AoLhpUY,4423
@@ -69,7 +73,7 @@ mns_scheduler/zt/zt_pool_sync_api.py,sha256=RrVAbU1u-HTqXF9BSwNlzIxMHrUgjNaLpDKF
69
73
  mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
70
74
  mns_scheduler/zz_task/data_sync_task.py,sha256=P75noN2J8YOqht_wyTN5IOZ6NPeTIKhRN4SPZhe6x2A,16100
71
75
  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,,
76
+ mns_scheduler-1.0.4.8.dist-info/METADATA,sha256=gXAIfuOiGUMYWRx8O7hafzW4UAkN5R8Kg1BM0ciSgl8,64
77
+ mns_scheduler-1.0.4.8.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
78
+ mns_scheduler-1.0.4.8.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
79
+ mns_scheduler-1.0.4.8.dist-info/RECORD,,