quantification 0.1.0__py3-none-any.whl → 0.1.1__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.
Files changed (78) hide show
  1. quantification/__init__.py +3 -2
  2. quantification/api/__init__.py +3 -0
  3. quantification/api/akshare/__init__.py +1 -0
  4. quantification/api/akshare/akshare.py +17 -0
  5. quantification/api/akshare/delegate/__init__.py +6 -0
  6. quantification/api/akshare/delegate/macro_china_fdi.py +46 -0
  7. quantification/api/akshare/delegate/macro_china_lpr.py +43 -0
  8. quantification/api/akshare/delegate/macro_china_qyspjg.py +51 -0
  9. quantification/api/akshare/delegate/macro_china_shrzgm.py +47 -0
  10. quantification/api/akshare/delegate/macro_cnbs.py +47 -0
  11. quantification/api/akshare/delegate/stock_zh_a_hist.py +77 -0
  12. quantification/api/akshare/setting.py +5 -0
  13. quantification/api/api.py +11 -0
  14. quantification/api/api.pyi +21 -0
  15. quantification/api/tushare/__init__.py +1 -0
  16. quantification/api/tushare/delegate/__init__.py +7 -0
  17. quantification/api/tushare/delegate/balancesheet.py +66 -0
  18. quantification/api/tushare/delegate/cashflow.py +29 -0
  19. quantification/api/tushare/delegate/common.py +64 -0
  20. quantification/api/tushare/delegate/daily_basic.py +81 -0
  21. quantification/api/tushare/delegate/fina_indicator.py +20 -0
  22. quantification/api/tushare/delegate/income.py +34 -0
  23. quantification/api/tushare/delegate/index_daily.py +61 -0
  24. quantification/api/tushare/delegate/pro_bar.py +80 -0
  25. quantification/api/tushare/setting.py +5 -0
  26. quantification/api/tushare/tushare.py +17 -0
  27. quantification/core/__init__.py +9 -0
  28. quantification/core/asset/__init__.py +6 -0
  29. quantification/core/asset/base_asset.py +96 -0
  30. quantification/core/asset/base_broker.py +42 -0
  31. quantification/core/asset/broker.py +108 -0
  32. quantification/core/asset/cash.py +75 -0
  33. quantification/core/asset/stock.py +268 -0
  34. quantification/core/cache.py +93 -0
  35. quantification/core/configure.py +15 -0
  36. quantification/core/data/__init__.py +5 -0
  37. quantification/core/data/base_api.py +109 -0
  38. quantification/core/data/base_delegate.py +73 -0
  39. quantification/core/data/field.py +213 -0
  40. quantification/core/data/panel.py +42 -0
  41. quantification/core/env.py +25 -0
  42. quantification/core/logger.py +94 -0
  43. quantification/core/strategy/__init__.py +3 -0
  44. quantification/core/strategy/base_strategy.py +66 -0
  45. quantification/core/strategy/base_trigger.py +69 -0
  46. quantification/core/strategy/base_use.py +69 -0
  47. quantification/core/trader/__init__.py +7 -0
  48. quantification/core/trader/base_order.py +45 -0
  49. quantification/core/trader/base_stage.py +16 -0
  50. quantification/core/trader/base_trader.py +173 -0
  51. quantification/core/trader/collector.py +47 -0
  52. quantification/core/trader/order.py +23 -0
  53. quantification/core/trader/portfolio.py +72 -0
  54. quantification/core/trader/query.py +29 -0
  55. quantification/core/trader/report.py +76 -0
  56. quantification/core/util.py +181 -0
  57. quantification/default/__init__.py +5 -0
  58. quantification/default/stage/__init__.py +1 -0
  59. quantification/default/stage/cn_stock.py +23 -0
  60. quantification/default/strategy/__init__.py +1 -0
  61. quantification/default/strategy/simple/__init__.py +1 -0
  62. quantification/default/strategy/simple/strategy.py +8 -0
  63. quantification/default/trader/__init__.py +2 -0
  64. quantification/default/trader/a_factor/__init__.py +1 -0
  65. quantification/default/trader/a_factor/trader.py +27 -0
  66. quantification/default/trader/simple/__init__.py +1 -0
  67. quantification/default/trader/simple/trader.py +8 -0
  68. quantification/default/trigger/__init__.py +1 -0
  69. quantification/default/trigger/trigger.py +63 -0
  70. quantification/default/use/__init__.py +1 -0
  71. quantification/default/use/factors/__init__.py +2 -0
  72. quantification/default/use/factors/factor.py +205 -0
  73. quantification/default/use/factors/use.py +38 -0
  74. quantification-0.1.1.dist-info/METADATA +19 -0
  75. quantification-0.1.1.dist-info/RECORD +76 -0
  76. {quantification-0.1.0.dist-info → quantification-0.1.1.dist-info}/WHEEL +1 -1
  77. quantification-0.1.0.dist-info/METADATA +0 -13
  78. quantification-0.1.0.dist-info/RECORD +0 -4
@@ -1,2 +1,3 @@
1
- def hello_world():
2
- print("Hello World")
1
+ from .api import *
2
+ from .core import *
3
+ from .default import *
@@ -0,0 +1,3 @@
1
+ from .api import DataAPI
2
+ from .tushare import TuShareAPI
3
+ from .akshare import AkShareAPI
@@ -0,0 +1 @@
1
+ from .akshare import AkShareAPI
@@ -0,0 +1,17 @@
1
+ from quantification.core.data import BaseAPI
2
+
3
+ from .setting import AkShareSetting
4
+
5
+ from .delegate import *
6
+
7
+
8
+ class AkShareAPI(BaseAPI[AkShareSetting]):
9
+ setting_class = AkShareSetting
10
+ delegate_classes = [
11
+ MacroCNBS,
12
+ StockZHAHist,
13
+ MacroChinaFDI,
14
+ MacroChinaLPR,
15
+ MacroChinaSHRZGM,
16
+ MacroChinaQYSPJG,
17
+ ]
@@ -0,0 +1,6 @@
1
+ from .macro_cnbs import MacroCNBS
2
+ from .macro_china_lpr import MacroChinaLPR
3
+ from .macro_china_fdi import MacroChinaFDI
4
+ from .stock_zh_a_hist import StockZHAHist
5
+ from .macro_china_qyspjg import MacroChinaQYSPJG
6
+ from .macro_china_shrzgm import MacroChinaSHRZGM
@@ -0,0 +1,46 @@
1
+ from datetime import date, datetime, time
2
+
3
+ import pandas as pd
4
+ import akshare as ak
5
+
6
+ from quantification.core import (
7
+ Field,
8
+ cache_query,
9
+ BaseDelegate
10
+ )
11
+
12
+ from ..setting import AkShareSetting
13
+
14
+ api = cache_query()(ak.macro_china_fdi)
15
+
16
+
17
+ class MacroChinaFDI(BaseDelegate[AkShareSetting]):
18
+ pair = [
19
+ (Field.FDI_当月, "当月"),
20
+ (Field.FDI_当月同比增长, "当月-同比增长"),
21
+ (Field.FDI_当月环比增长, "当月-环比增长"),
22
+ (Field.FDI_累计, "累计"),
23
+ (Field.FDI_累计同比增长, "累计-同比增长")
24
+ ]
25
+
26
+ def has_field(self, field: Field, **kwargs):
27
+ return self.field2str.get(field) is not None
28
+
29
+ def query(self, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
30
+ df = api()
31
+ df = self.rename_columns(df, "月份")
32
+ df = self.use_date_index(df, lambda x: datetime.strptime(x, "%Y年%m月份").date())
33
+
34
+ df[Field.FDI_当月] = df[Field.FDI_当月].apply(lambda x: x / 1e4)
35
+ df[Field.FDI_累计] = df[Field.FDI_累计].apply(lambda x: x / 1e4)
36
+
37
+ return df
38
+
39
+ def mask(self, data: pd.DataFrame, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
40
+ mask = pd.DataFrame(index=data.index, columns=data.columns)
41
+ index = pd.Series(mask.index)
42
+
43
+ for field in fields:
44
+ mask[field] = list(map(lambda x: datetime.combine(x + pd.DateOffset(months=1), time(0, 0, 0)), index))
45
+
46
+ return mask
@@ -0,0 +1,43 @@
1
+ from datetime import date, datetime, timedelta, time
2
+
3
+ import pandas as pd
4
+ import akshare as ak
5
+
6
+ from quantification.core import (
7
+ Field,
8
+ cache_query,
9
+ BaseDelegate
10
+ )
11
+
12
+ from ..setting import AkShareSetting
13
+
14
+ api = cache_query()(ak.macro_china_lpr)
15
+
16
+
17
+ class MacroChinaLPR(BaseDelegate[AkShareSetting]):
18
+ pair = [
19
+ (Field.RATE_LPR1年, "LPR1Y"),
20
+ (Field.RATE_LPR5年, "LPR5Y"),
21
+ (Field.RATE_短期贷款, "RATE_2"),
22
+ (Field.RATE_中长期贷款, "RATE_1"),
23
+ ]
24
+
25
+ def has_field(self, field: Field, **kwargs):
26
+ return self.field2str.get(field) is not None
27
+
28
+ def query(self, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
29
+ df = api()
30
+
31
+ df = self.rename_columns(df, "TRADE_DATE")
32
+ df = self.use_date_index(df)
33
+
34
+ return df
35
+
36
+ def mask(self, data: pd.DataFrame, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
37
+ mask = pd.DataFrame(index=data.index, columns=data.columns)
38
+ index = pd.Series(mask.index)
39
+
40
+ for field in fields:
41
+ mask[field] = list(map(lambda x: datetime.combine(x + timedelta(days=1), time(0, 0, 0)), index))
42
+
43
+ return mask
@@ -0,0 +1,51 @@
1
+ from datetime import date, datetime, time
2
+
3
+ import pandas as pd
4
+ import akshare as ak
5
+
6
+ from quantification.core import (
7
+ Field,
8
+ cache_query,
9
+ BaseDelegate
10
+ )
11
+
12
+ from ..setting import AkShareSetting
13
+
14
+ api = cache_query()(ak.macro_china_qyspjg)
15
+
16
+
17
+ class MacroChinaQYSPJG(BaseDelegate[AkShareSetting]):
18
+ pair = [
19
+ (Field.CGPI_总指数, "总指数-指数值"),
20
+ (Field.CGPI_总指数同比增长, "总指数-同比增长"),
21
+ (Field.CGPI_总指数环比增长, "总指数-环比增长"),
22
+ (Field.CGPI_农产品, "农产品-指数值"),
23
+ (Field.CGPI_农产品同比增长, "农产品-同比增长"),
24
+ (Field.CGPI_农产品环比增长, "农产品-环比增长"),
25
+ (Field.CGPI_矿产品, "矿产品-指数值"),
26
+ (Field.CGPI_矿产品同比增长, "矿产品-同比增长"),
27
+ (Field.CGPI_矿产品环比增长, "矿产品-环比增长"),
28
+ (Field.CGPI_煤油电, "煤油电-指数值"),
29
+ (Field.CGPI_煤油电同比增长, "煤油电-同比增长"),
30
+ (Field.CGPI_煤油电环比增长, "煤油电-环比增长"),
31
+ ]
32
+
33
+ def has_field(self, field: Field, **kwargs):
34
+ return self.field2str.get(field) is not None
35
+
36
+ def query(self, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
37
+ df = api()
38
+
39
+ df = self.rename_columns(df, "月份")
40
+ df = self.use_date_index(df, lambda x: datetime.strptime(x, "%Y年%m月份").date())
41
+
42
+ return df
43
+
44
+ def mask(self, data: pd.DataFrame, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
45
+ mask = pd.DataFrame(index=data.index, columns=data.columns)
46
+ index = pd.Series(mask.index)
47
+
48
+ for field in fields:
49
+ mask[field] = list(map(lambda x: datetime.combine(x + pd.DateOffset(months=1), time(0, 0, 0)), index))
50
+
51
+ return mask
@@ -0,0 +1,47 @@
1
+ from datetime import date, datetime, time
2
+
3
+ import pandas as pd
4
+ import akshare as ak
5
+
6
+ from quantification.core import (
7
+ Field,
8
+ cache_query,
9
+ BaseDelegate
10
+ )
11
+
12
+ from ..setting import AkShareSetting
13
+
14
+ api = cache_query()(ak.macro_china_shrzgm)
15
+
16
+
17
+ class MacroChinaSHRZGM(BaseDelegate[AkShareSetting]):
18
+ pair = [
19
+ (Field.AFRE_总增量, "社会融资规模增量"),
20
+ (Field.AFRE_人民币贷款增量, "其中-人民币贷款"),
21
+ (Field.AFRE_委托贷款外币贷款增量, "其中-委托贷款外币贷款"),
22
+ (Field.AFRE_委托贷款增量, "其中-委托贷款"),
23
+ (Field.AFRE_信托贷款增量, "其中-信托贷款"),
24
+ (Field.AFRE_未贴现银行承兑汇票增量, "其中-未贴现银行承兑汇票"),
25
+ (Field.AFRE_企业债券增量, "其中-企业债券"),
26
+ (Field.AFRE_非金融企业境内股票融资增量, "其中-非金融企业境内股票融资"),
27
+ ]
28
+
29
+ def has_field(self, field: Field, **kwargs):
30
+ return self.field2str.get(field) is not None
31
+
32
+ def query(self, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
33
+ df = api()
34
+
35
+ df = self.rename_columns(df, "月份")
36
+ df = self.use_date_index(df, lambda x: datetime.strptime(x, "%Y%m").date())
37
+
38
+ return df
39
+
40
+ def mask(self, data: pd.DataFrame, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
41
+ mask = pd.DataFrame(index=data.index, columns=data.columns)
42
+ index = pd.Series(mask.index)
43
+
44
+ for field in fields:
45
+ mask[field] = list(map(lambda x: datetime.combine(x + pd.DateOffset(months=1), time(0, 0, 0)), index))
46
+
47
+ return mask
@@ -0,0 +1,47 @@
1
+ from datetime import date, datetime, time
2
+
3
+ import pandas as pd
4
+ import akshare as ak
5
+
6
+ from quantification.core import (
7
+ Field,
8
+ cache_query,
9
+ BaseDelegate
10
+ )
11
+
12
+ from ..setting import AkShareSetting
13
+
14
+ api = cache_query()(ak.macro_cnbs)
15
+
16
+
17
+ class MacroCNBS(BaseDelegate[AkShareSetting]):
18
+ pair = [
19
+ (Field.LEV_居民部门, "居民部门"),
20
+ (Field.LEV_非金融企业部门, "非金融企业部门"),
21
+ (Field.LEV_政府部门, "政府部门"),
22
+ (Field.LEV_中央政府, "中央政府"),
23
+ (Field.LEV_地方政府, "地方政府"),
24
+ (Field.LEV_实体经济部门, "实体经济部门"),
25
+ (Field.LEV_金融部门资产方, "金融部门资产方"),
26
+ (Field.LEV_金融部门负债方, "金融部门负债方")
27
+ ]
28
+
29
+ def has_field(self, field: Field, **kwargs):
30
+ return self.field2str.get(field) is not None
31
+
32
+ def query(self, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
33
+ df = api()
34
+
35
+ df = self.rename_columns(df, "年份")
36
+ df = self.use_date_index(df)
37
+
38
+ return df
39
+
40
+ def mask(self, data: pd.DataFrame, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
41
+ mask = pd.DataFrame(index=data.index, columns=data.columns)
42
+ index = pd.Series(mask.index)
43
+
44
+ for field in fields:
45
+ mask[field] = list(map(lambda x: datetime.combine(x + pd.DateOffset(months=1), time(0, 0, 0)), index))
46
+
47
+ return mask
@@ -0,0 +1,77 @@
1
+ from datetime import date, datetime, time
2
+
3
+ import pandas as pd
4
+ import akshare as ak
5
+
6
+ from quantification.core import (
7
+ Field,
8
+ Stock,
9
+ cache_query,
10
+ BaseDelegate,
11
+ StockExchange as E
12
+ )
13
+
14
+ from ..setting import AkShareSetting
15
+
16
+ api = cache_query()(ak.stock_zh_a_hist)
17
+
18
+
19
+ class StockZHAHist(BaseDelegate[AkShareSetting]):
20
+ pair = [
21
+ (Field.ST_开盘价, "开盘"),
22
+ (Field.ST_最高价, "最高"),
23
+ (Field.ST_最低价, "最低"),
24
+ (Field.ST_收盘价, "收盘"),
25
+ (Field.ST_涨跌额, "涨跌额"),
26
+ (Field.ST_涨跌幅, "涨跌幅"),
27
+ (Field.ST_成交量, "成交量"),
28
+ (Field.ST_成交额, "成交额"),
29
+ (Field.ST_振幅, "振幅"),
30
+ (Field.ST_换手率, "换手率")
31
+ ]
32
+
33
+ def has_field(self, field: Field, **kwargs):
34
+ if not self.field2str.get(field) is not None:
35
+ return False
36
+
37
+ stock = kwargs.get("stock")
38
+ assert stock is not None, "请传入stock参数, 如stock=Stock['000001']"
39
+ assert issubclass(stock, Stock), f"stock参数必须为Stock子类, 实际为{type(stock)}"
40
+
41
+ if stock.exchange not in [E.SZSE, E.BSE, E.SSE]:
42
+ return False
43
+
44
+ return True
45
+
46
+ def query(self, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
47
+ stock: Stock = kwargs.get("stock")
48
+ df = api(
49
+ symbol=stock.symbol,
50
+ period="daily",
51
+ start_date=start_date.strftime("%Y%m%d"),
52
+ end_date=end_date.strftime("%Y%m%d"),
53
+ adjust=self.config.adjust
54
+ )
55
+
56
+ df = self.rename_columns(df, "日期")
57
+ df = self.use_date_index(df)
58
+
59
+ df[Field.ST_成交额] = df[Field.ST_成交额].apply(lambda x: x / 1e4)
60
+ df[Field.ST_涨跌额] = df[Field.ST_涨跌额].apply(lambda x: x / 1e4)
61
+
62
+ return df
63
+
64
+ def mask(self, data: pd.DataFrame, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
65
+ mask = pd.DataFrame(index=data.index, columns=data.columns)
66
+ index = pd.Series(mask.index)
67
+
68
+ for field in fields:
69
+ match field:
70
+ case Field.ST_昨收价:
71
+ mask[field] = list(map(lambda x: datetime.combine(x, time(0, 0, 0)), index))
72
+ case Field.ST_开盘价:
73
+ mask[field] = list(map(lambda x: datetime.combine(x, time(9, 30, 0)), index))
74
+ case Field.ST_最高价 | Field.ST_最低价 | Field.ST_收盘价 | Field.ST_涨跌额 | Field.ST_涨跌幅 | Field.ST_成交量 | Field.ST_成交额:
75
+ mask[field] = list(map(lambda x: datetime.combine(x, time(17, 0, 0)), index))
76
+
77
+ return mask
@@ -0,0 +1,5 @@
1
+ from pydantic import BaseModel
2
+
3
+
4
+ class AkShareSetting(BaseModel):
5
+ ...
@@ -0,0 +1,11 @@
1
+ from quantification.core import BaseCombinedAPI
2
+
3
+ from .akshare import AkShareAPI
4
+ from .tushare import TuShareAPI
5
+
6
+
7
+ class DataAPI(BaseCombinedAPI):
8
+ api_classes = [
9
+ TuShareAPI,
10
+ AkShareAPI
11
+ ]
@@ -0,0 +1,21 @@
1
+ from datetime import date
2
+
3
+ from quantification.core import (
4
+ Field,
5
+ Stock,
6
+ DataPanel,
7
+ BaseCombinedAPI
8
+ )
9
+
10
+
11
+ class DataAPI(BaseCombinedAPI):
12
+ def query(
13
+ self,
14
+ *,
15
+ start_date: date,
16
+ end_date: date,
17
+ fields: list[Field],
18
+ stock: type[Stock] = None,
19
+ index: str = None
20
+ ) -> DataPanel:
21
+ ...
@@ -0,0 +1 @@
1
+ from .tushare import TuShareAPI
@@ -0,0 +1,7 @@
1
+ from .income import IncomeDelegate
2
+ from .pro_bar import ProBarDelegate
3
+ from .cashflow import CashflowDelegate
4
+ from .index_daily import IndexDailyDelegate
5
+ from .daily_basic import DailyBasicDelegate
6
+ from .balancesheet import BalanceSheetDelegate
7
+ from .fina_indicator import FinanceIndicatorDelegate
@@ -0,0 +1,66 @@
1
+ import tushare as ts
2
+
3
+ from quantification.core import (
4
+ Field,
5
+ Config,
6
+ cache_query
7
+ )
8
+
9
+ from .common import TushareSheetDelegate
10
+ from ..setting import TuShareSetting
11
+
12
+
13
+ class BalanceSheetDelegate(TushareSheetDelegate):
14
+ pair = [
15
+ (Field.BS_总股本, "total_share"),
16
+ (Field.BS_库存股, "treasury_share"),
17
+ (Field.BS_资本公积, "cap_rese"),
18
+ (Field.BS_盈余公积, "surplus_rese"),
19
+ (Field.BS_未分配利润, "undistr_porfit"),
20
+ (Field.BS_股东权益合计, "total_hldr_eqy_inc_min_int"),
21
+ (Field.BS_归母股东权益合计, "total_hldr_eqy_exc_min_int"),
22
+ (Field.BS_货币资金, "money_cap"),
23
+ (Field.BS_交易性金融资产, "trad_asset"),
24
+ (Field.BS_应收票据, "notes_receiv"),
25
+ (Field.BS_应收账款, "accounts_receiv"),
26
+ (Field.BS_应收股利, "div_receiv"),
27
+ (Field.BS_应收利息, "int_receiv"),
28
+ (Field.BS_其他应收款, "oth_receiv"),
29
+ (Field.BS_预付款项, "prepayment"),
30
+ (Field.BS_存货, "inventories"),
31
+ (Field.BS_一年内到期的非流动资产, "nca_within_1y"),
32
+ (Field.BS_可供出售金融资产, "fa_avail_for_sale"),
33
+ (Field.BS_持有至到期投资, "htm_invest"),
34
+ (Field.BS_长期股权投资, "lt_eqt_invest"),
35
+ (Field.BS_投资性房地产, "invest_real_estate"),
36
+ (Field.BS_定期存款, "time_deposits"),
37
+ (Field.BS_长期应收款, "lt_rec"),
38
+ (Field.BS_固定资产, "fix_assets"),
39
+ (Field.BS_在建工程, "cip"),
40
+ (Field.BS_无形资产, "intan_assets"),
41
+ (Field.BS_研发支出, "r_and_d"),
42
+ (Field.BS_商誉, "goodwill"),
43
+ (Field.BS_流动资产合计, "total_cur_assets"),
44
+ (Field.BS_非流动资产合计, "total_nca"),
45
+ (Field.BS_资产合计, "total_assets"),
46
+ (Field.BS_短期借款, "st_borr"),
47
+ (Field.BS_长期借款, "lt_borr"),
48
+ (Field.BS_交易性金融负债, "trading_fl"),
49
+ (Field.BS_应付票据, "notes_payable"),
50
+ (Field.BS_应付账款, "acct_payable"),
51
+ (Field.BS_应付职工薪酬, "payroll_payable"),
52
+ (Field.BS_应付利息, "int_payable"),
53
+ (Field.BS_应付股利, "div_payable"),
54
+ (Field.BS_应付短期债券, "st_bonds_payable"),
55
+ (Field.BS_应付债券, "bond_payable"),
56
+ (Field.BS_长期应付款, "lt_payable"),
57
+ (Field.BS_预收款项, "adv_receipts"),
58
+ (Field.BS_一年内到期的非流动负债, "non_cur_liab_due_1y"),
59
+ (Field.BS_流动负债合计, "total_cur_liab"),
60
+ (Field.BS_非流动负债合计, "total_ncl"),
61
+ (Field.BS_负债合计, "total_liab"),
62
+ ]
63
+
64
+ def __init__(self, config: Config, setting: TuShareSetting):
65
+ super().__init__(config, setting)
66
+ self.api = cache_query()(ts.pro_api(setting.tushare_token).balancesheet)
@@ -0,0 +1,29 @@
1
+ import tushare as ts
2
+
3
+ from quantification.core import (
4
+ Field,
5
+ Config,
6
+ cache_query
7
+ )
8
+
9
+ from .common import TushareSheetDelegate
10
+ from ..setting import TuShareSetting
11
+
12
+
13
+ class CashflowDelegate(TushareSheetDelegate):
14
+ pair = [
15
+ (Field.CS_经营活动现金流入, "c_inf_fr_operate_a"),
16
+ (Field.CS_经营活动现金流出, "st_cash_out_act"),
17
+ (Field.CS_经营活动净现金流, "n_cashflow_act"),
18
+ (Field.CS_投资活动现金流入, "stot_inflows_inv_act"),
19
+ (Field.CS_投资活动现金流出, "stot_out_inv_act"),
20
+ (Field.CS_投资活动净现金流, "n_cashflow_inv_act"),
21
+ (Field.CS_筹资活动现金流入, "stot_cash_in_fnc_act"),
22
+ (Field.CS_筹资活动现金流出, "stot_cashout_fnc_act"),
23
+ (Field.CS_筹资活动净现金流, "n_cash_flows_fnc_act"),
24
+ (Field.CS_现金及现金等价物净增加额, "n_incr_cash_cash_equ"),
25
+ ]
26
+
27
+ def __init__(self, config: Config, setting: TuShareSetting):
28
+ super().__init__(config, setting)
29
+ self.api = cache_query()(ts.pro_api(setting.tushare_token).cashflow)
@@ -0,0 +1,64 @@
1
+ from abc import ABC
2
+ from datetime import date, datetime, timedelta
3
+
4
+ import pandas as pd
5
+
6
+ from quantification.core import (
7
+ Stock,
8
+ Field,
9
+ Config,
10
+ BaseDelegate,
11
+ StockExchange as E
12
+ )
13
+
14
+ from ..setting import TuShareSetting
15
+
16
+
17
+ class TushareSheetDelegate(BaseDelegate[TuShareSetting], ABC):
18
+ def has_field(self, field: Field, **kwargs):
19
+ if self.field2str.get(field) is None:
20
+ return False
21
+
22
+ stock = kwargs.get("stock")
23
+ assert stock is not None, "请传入stock参数, 如stock=Stock['000001']"
24
+ assert issubclass(stock, Stock), f"stock参数必须为Stock子类, 实际为{type(stock)}"
25
+
26
+ if stock.exchange not in [E.SZSE, E.BSE, E.SSE]:
27
+ return False
28
+
29
+ return True
30
+
31
+ def query(self, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
32
+ stock: Stock = kwargs.get("stock")
33
+ exchange = {
34
+ E.SSE: "SH",
35
+ E.SZSE: "SZ",
36
+ E.BSE: "BJ"
37
+ }[stock.exchange]
38
+
39
+ data = self.api(
40
+ ts_code=f"{stock.symbol}.{exchange}",
41
+ start_date=start_date.strftime("%Y%m%d"),
42
+ end_date=end_date.strftime("%Y%m%d"),
43
+ fields=",".join([*self.field2str.values(), "ann_date", "end_date", "update_flag"]),
44
+ )
45
+
46
+ data = data[data['update_flag'] == '1']
47
+ data = self.rename_columns(data, "end_date")
48
+ data = self.use_date_index(data)
49
+
50
+ return data
51
+
52
+ def mask(self, data: pd.DataFrame, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
53
+ mask = pd.DataFrame(index=data.index, columns=data.columns)
54
+ datetime_column = data["ann_date"].apply(
55
+ lambda x: (datetime.strptime(x, "%Y%m%d") + timedelta(days=1)).replace(hour=0, minute=0, second=0)
56
+ )
57
+ for field in fields:
58
+ mask[field] = datetime_column
59
+
60
+ return mask
61
+
62
+ def __init__(self, config: Config, setting: TuShareSetting):
63
+ super().__init__(config, setting)
64
+ self.api = None
@@ -0,0 +1,81 @@
1
+ from tqdm import tqdm
2
+ from functools import lru_cache
3
+ from datetime import date, datetime, time
4
+
5
+ import pandas as pd
6
+ import tushare as ts
7
+
8
+ from quantification.core import (
9
+ Field,
10
+ Stock,
11
+ Config,
12
+ cache_query,
13
+ BaseDelegate,
14
+ StockExchange as E
15
+ )
16
+
17
+ from ..setting import TuShareSetting
18
+
19
+
20
+ class DailyBasicDelegate(BaseDelegate[TuShareSetting]):
21
+ pair = [
22
+ (Field.ST_换手率, "turnover_rate"),
23
+ (Field.ST_自由流通股换手率, "turnover_rate_f"),
24
+ (Field.ST_量比, "volume_ratio"),
25
+ (Field.ST_总市值, "total_mv"),
26
+ (Field.ST_流通市值, "circ_mv"),
27
+ ]
28
+
29
+ def has_field(self, field: Field, **kwargs):
30
+ if self.field2str.get(field) is None:
31
+ return False
32
+
33
+ stock = kwargs.get("stock")
34
+ assert stock is not None, "请传入stock参数, 如stock=Stock['000001']"
35
+ assert issubclass(stock, Stock), f"stock参数必须为Stock子类, 实际为{type(stock)}"
36
+
37
+ if stock.exchange not in [E.SZSE, E.BSE, E.SSE]:
38
+ return False
39
+
40
+ return True
41
+
42
+ def query(self, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
43
+ df = self.bulk(start_date=start_date, end_date=end_date)
44
+
45
+ stock: Stock = kwargs.get("stock")
46
+ exchange = {
47
+ E.SSE: "SH",
48
+ E.SZSE: "SZ",
49
+ E.BSE: "BJ"
50
+ }[stock.exchange]
51
+
52
+ data = df[df["ts_code"] == f"{stock.symbol}.{exchange}"]
53
+
54
+ data = self.rename_columns(data, "trade_date")
55
+ data = self.use_date_index(data)
56
+
57
+ return data
58
+
59
+ def mask(self, data: pd.DataFrame, start_date: date, end_date: date, fields: list[Field], **kwargs) -> pd.DataFrame:
60
+ mask = pd.DataFrame(index=data.index, columns=data.columns)
61
+ index = pd.Series(mask.index)
62
+
63
+ for field in fields:
64
+ mask[field] = list(map(lambda x: datetime.combine(x, time(17, 0, 0)), index))
65
+
66
+ return mask
67
+
68
+ def __init__(self, config: Config, setting: TuShareSetting):
69
+ super().__init__(config, setting)
70
+ self.api = cache_query()(ts.pro_api(setting.tushare_token).daily_basic)
71
+
72
+ @lru_cache()
73
+ def bulk(self, start_date: date, end_date: date):
74
+ rows = []
75
+ for current in tqdm(pd.date_range(start=start_date, end=end_date), "遍历获取daily_basic"):
76
+ rows.append(self.api(
77
+ trade_date=current.strftime("%Y%m%d"),
78
+ adj=self.config.adjust
79
+ ))
80
+
81
+ return pd.concat([row for row in rows if not row.empty])
@@ -0,0 +1,20 @@
1
+ import tushare as ts
2
+
3
+ from quantification.core import (
4
+ Field,
5
+ Config,
6
+ cache_query
7
+ )
8
+
9
+ from .common import TushareSheetDelegate
10
+ from ..setting import TuShareSetting
11
+
12
+
13
+ class FinanceIndicatorDelegate(TushareSheetDelegate):
14
+ pair = [
15
+ (Field.FI_净资产收益率, "roe")
16
+ ]
17
+
18
+ def __init__(self, config: Config, setting: TuShareSetting):
19
+ super().__init__(config, setting)
20
+ self.api = cache_query()(ts.pro_api(setting.tushare_token).fina_indicator)