trade-database-manager 0.0.6.dev0__tar.gz → 0.0.6.dev1__tar.gz

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 (25) hide show
  1. {trade_database_manager-0.0.6.dev0/trade_database_manager.egg-info → trade_database_manager-0.0.6.dev1}/PKG-INFO +21 -1
  2. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/README.md +20 -0
  3. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/pyproject.toml +1 -1
  4. trade_database_manager-0.0.6.dev1/trade_database_manager/manager/fields_data_type.py +55 -0
  5. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/manager/metadata_sql.py +32 -9
  6. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/manager/typedefs.py +1 -1
  7. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1/trade_database_manager.egg-info}/PKG-INFO +21 -1
  8. trade_database_manager-0.0.6.dev0/trade_database_manager/manager/fields_data_type.py +0 -33
  9. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/LICENSE +0 -0
  10. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/setup.cfg +0 -0
  11. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/__init__.py +0 -0
  12. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/config.py +0 -0
  13. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/__init__.py +0 -0
  14. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/kdb/__init__.py +0 -0
  15. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/kdb/kdbmanager.py +0 -0
  16. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/sql/__init__.py +0 -0
  17. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/sql/sqlmanager.py +0 -0
  18. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/sql/sqlreader.py +0 -0
  19. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/sql/sqlwriter.py +0 -0
  20. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/typedefs.py +0 -0
  21. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/manager/__init__.py +0 -0
  22. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager.egg-info/SOURCES.txt +0 -0
  23. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager.egg-info/dependency_links.txt +0 -0
  24. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager.egg-info/requires.txt +0 -0
  25. {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: trade_database_manager
3
- Version: 0.0.6.dev0
3
+ Version: 0.0.6.dev1
4
4
  Summary: A wrapper of kdb and sql for convenient trade data management.
5
5
  Author-email: "Y.Q. Cui" <qianyun210603@hotmail.com>
6
6
  Classifier: Operating System :: POSIX :: Linux
@@ -75,3 +75,23 @@ then the system will send an email with the license file and a base64 key (Eithe
75
75
  - `-T 1000`: This sets the timeout in seconds for client queries. In this case, it's set to 1000 seconds.
76
76
 
77
77
  - `-U /opt/l64/trade.q`: This sets the access control list file. In this case, the file is located at `/opt/l64/trade.q`. This file contains a list of usernames and passwords for clients that are allowed to connect to the kdb+ process.
78
+
79
+ ### MetaData Initialization
80
+
81
+ Allowed instruments types are given in "Instrument Types" section of [meta_enumerations.md](doc/meta_enumerations.md).
82
+
83
+ ### Data Initialization for Instrument Type(s)
84
+ ```python
85
+ from trade_database_manager.manager import MetadataSql
86
+
87
+ metadatalib = MetadataSql()
88
+ metadatalib.initialize(for_inst_types="CB")
89
+ ```
90
+
91
+ This will try to create two tables, `instruments` and `instruments_cb` in the database if not yet exists. The `instruments` table will store the common information of all instruments, and the `instruments_cb` table will store the type-specific information of the instruments of type `CB`.
92
+
93
+ The table fields are listed in the [data_organization.md](doc/data_organization.md) file.
94
+
95
+
96
+
97
+
@@ -53,3 +53,23 @@ then the system will send an email with the license file and a base64 key (Eithe
53
53
  - `-T 1000`: This sets the timeout in seconds for client queries. In this case, it's set to 1000 seconds.
54
54
 
55
55
  - `-U /opt/l64/trade.q`: This sets the access control list file. In this case, the file is located at `/opt/l64/trade.q`. This file contains a list of usernames and passwords for clients that are allowed to connect to the kdb+ process.
56
+
57
+ ### MetaData Initialization
58
+
59
+ Allowed instruments types are given in "Instrument Types" section of [meta_enumerations.md](doc/meta_enumerations.md).
60
+
61
+ ### Data Initialization for Instrument Type(s)
62
+ ```python
63
+ from trade_database_manager.manager import MetadataSql
64
+
65
+ metadatalib = MetadataSql()
66
+ metadatalib.initialize(for_inst_types="CB")
67
+ ```
68
+
69
+ This will try to create two tables, `instruments` and `instruments_cb` in the database if not yet exists. The `instruments` table will store the common information of all instruments, and the `instruments_cb` table will store the type-specific information of the instruments of type `CB`.
70
+
71
+ The table fields are listed in the [data_organization.md](doc/data_organization.md) file.
72
+
73
+
74
+
75
+
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "trade_database_manager"
7
- version = "0.0.6.dev0"
7
+ version = "0.0.6.dev1"
8
8
  description = "A wrapper of kdb and sql for convenient trade data management."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -0,0 +1,55 @@
1
+ # -*- coding: utf-8 -*-
2
+ # @Time : 2024/4/19 16:44
3
+ # @Author : YQ Tsui
4
+ # @File : fields_data_type.py
5
+ # @Purpose :
6
+
7
+ from sqlalchemy import DOUBLE_PRECISION, Integer, String, Date
8
+
9
+ FIELD_DATA_TYPE_SQL = {
10
+ "ticker": String(20),
11
+ "name": String(20),
12
+ "currency": String(6),
13
+ "exchange": String(10),
14
+ "timezone": String(30),
15
+ "tick_size": DOUBLE_PRECISION(),
16
+ "lot_size": DOUBLE_PRECISION(),
17
+ "min_lots": DOUBLE_PRECISION(),
18
+ "market_tplus": Integer(),
19
+ "listed_date": Date(),
20
+ "delisted_date": Date(),
21
+ "country": String(6),
22
+ "state": String(36),
23
+ # STK
24
+ "sector": String(30),
25
+ "industry": String(36),
26
+ "board_type": String(200),
27
+ # LOF & ETF
28
+ "issuer": String(60),
29
+ "current_mgr": String(60),
30
+ "custodian": String(60),
31
+ "issuer_country": String(6),
32
+ "fund_type": String(20),
33
+ "benchmark": String(60),
34
+ # Convertible Bond (CB)
35
+ "stock_ticker": String(20),
36
+ "stock_exchange": String(10),
37
+ "maturity_date": Date(),
38
+ "issue_price": DOUBLE_PRECISION(),
39
+ "total_issue_size": DOUBLE_PRECISION(),
40
+ "par_value": DOUBLE_PRECISION(),
41
+ "redeem_price": DOUBLE_PRECISION(),
42
+ "conversion_start_date": Date(),
43
+ "conversion_end_date": Date(),
44
+ "callback_terms": String(1024),
45
+ "callback_type": String(20),
46
+ "adjust_terms": String(1024),
47
+ "adjust_type": String(20),
48
+ "putback_terms": String(1024),
49
+ "putback_type": String(20),
50
+ "callback_level": DOUBLE_PRECISION(),
51
+ }
52
+
53
+ DATE_TIME_COLS = {"listed_date", "delisted_date", "maturity_date", "conversion_start_date", "conversion_end_date"}
54
+
55
+ BASE_COLUMNS = [("ticker", String(10)), ("exchange", String(10))]
@@ -11,7 +11,7 @@ import pandas as pd
11
11
 
12
12
  from ..core.sql.sqlmanager import SqlManager
13
13
  from .typedefs import EXCHANGE_LITERALS, INST_TYPE_LITERALS, Opt_T_SeqT, T_DictT
14
- from .fields_data_type import FIELD_DATA_TYPE_SQL, String
14
+ from .fields_data_type import FIELD_DATA_TYPE_SQL, DATE_TIME_COLS, BASE_COLUMNS
15
15
 
16
16
 
17
17
  COMMON_METADATA_COLUMNS = [
@@ -31,6 +31,25 @@ TYPE_METADATA_COLUMNS = {
31
31
  "STK": ["country", "state", "board_type", "issue_price"],
32
32
  "ETF": ["issuer", "current_mgr", "custodian", "issuer_country", "fund_type", "benchmark"],
33
33
  "LOF": ["issuer", "current_mgr", "custodian", "issuer_country", "fund_type", "benchmark"],
34
+ "CB": [
35
+ "country",
36
+ "state",
37
+ "stock_ticker",
38
+ "stock_exchange",
39
+ "maturity_date",
40
+ "issue_price",
41
+ "total_issue_size",
42
+ "par_value",
43
+ "redeem_price",
44
+ "conversion_start_date",
45
+ "conversion_end_date",
46
+ "callback_terms",
47
+ "callback_type",
48
+ "adjust_terms",
49
+ "adjust_type",
50
+ "putback_terms",
51
+ "putback_type",
52
+ ],
34
53
  }
35
54
 
36
55
 
@@ -55,15 +74,12 @@ class MetadataSql:
55
74
  for_inst_types = list(TYPE_METADATA_COLUMNS.keys())
56
75
  elif isinstance(for_inst_types, str):
57
76
  for_inst_types = [for_inst_types]
58
- columns_base = [("ticker", String(10)), ("exchange", String(10))]
59
77
  if not self._manager.table_exists("instruments"):
60
- columns = columns_base + [(col, FIELD_DATA_TYPE_SQL.get(col, String())) for col in COMMON_METADATA_COLUMNS]
78
+ columns = BASE_COLUMNS + [(col, FIELD_DATA_TYPE_SQL[col]) for col in COMMON_METADATA_COLUMNS]
61
79
  self._manager.create_table("instruments", columns, {"primary_key": ["ticker", "exchange"]})
62
80
  for inst_type in for_inst_types:
63
81
  if not self._manager.table_exists(f"instruments_{inst_type.lower()}"):
64
- columns = columns_base + [
65
- (col, FIELD_DATA_TYPE_SQL.get(col, String())) for col in TYPE_METADATA_COLUMNS[inst_type]
66
- ]
82
+ columns = BASE_COLUMNS + [(col, FIELD_DATA_TYPE_SQL[col]) for col in TYPE_METADATA_COLUMNS[inst_type]]
67
83
  self._manager.create_table(
68
84
  f"instruments_{inst_type.lower()}", columns, primary_key={"ticker", "exchange"}
69
85
  )
@@ -99,8 +115,9 @@ class MetadataSql:
99
115
  if not columns.empty:
100
116
  self._manager.insert(f"instruments_{inst_type.lower()}", data_type_df[columns], upsert=True)
101
117
 
102
- def _convert_datetime_columns(self, data: pd.DataFrame):
103
- for col in ["listed_date", "delisted_date"]:
118
+ @staticmethod
119
+ def _convert_datetime_columns(data: pd.DataFrame):
120
+ for col in DATE_TIME_COLS:
104
121
  if col in data.columns:
105
122
  data[col] = data[col].apply(pd.to_datetime)
106
123
 
@@ -213,6 +230,8 @@ class MetadataSql:
213
230
 
214
231
  if query_fields == "*":
215
232
  query_fields_cross = "*"
233
+ query_fields_type = []
234
+ query_fields_common = query_fields
216
235
  else:
217
236
  query_fields_common = ["ticker", "exchange"] + [f for f in query_fields if f in COMMON_METADATA_COLUMNS]
218
237
  query_fields_type = [f for f in query_fields if f in TYPE_METADATA_COLUMNS.get(inst_type, [])]
@@ -226,7 +245,11 @@ class MetadataSql:
226
245
  }
227
246
  filter_fields_type = {k: v for k, v in filter_fields.items() if k in TYPE_METADATA_COLUMNS.get(inst_type, [])}
228
247
 
229
- if (query_fields != "*" or inst_type not in TYPE_METADATA_COLUMNS) and not bool(query_fields_type) and not bool(filter_fields_type):
248
+ if (
249
+ (query_fields != "*" or inst_type not in TYPE_METADATA_COLUMNS)
250
+ and not bool(query_fields_type)
251
+ and not bool(filter_fields_type)
252
+ ):
230
253
  df = self._manager.read_data(
231
254
  "instruments", query_fields=query_fields_common, filter_fields=filter_fields_common
232
255
  )
@@ -6,7 +6,7 @@
6
6
 
7
7
  from typing import Dict, Literal, Optional, Sequence, TypeVar, Union
8
8
 
9
- INST_TYPE_LITERALS = Literal["STK", "FUT", "OPT", "IDX", "ETF", "FND", "BND", "CASH", "CRYPTO"]
9
+ INST_TYPE_LITERALS = Literal["STK", "FUT", "OPT", "IDX", "ETF", "LOF", "FUND", "BOND", "CASH", "CRYPTO", "CB"]
10
10
  EXCHANGE_LITERALS = Literal[
11
11
  "SSE",
12
12
  "SZSE",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: trade_database_manager
3
- Version: 0.0.6.dev0
3
+ Version: 0.0.6.dev1
4
4
  Summary: A wrapper of kdb and sql for convenient trade data management.
5
5
  Author-email: "Y.Q. Cui" <qianyun210603@hotmail.com>
6
6
  Classifier: Operating System :: POSIX :: Linux
@@ -75,3 +75,23 @@ then the system will send an email with the license file and a base64 key (Eithe
75
75
  - `-T 1000`: This sets the timeout in seconds for client queries. In this case, it's set to 1000 seconds.
76
76
 
77
77
  - `-U /opt/l64/trade.q`: This sets the access control list file. In this case, the file is located at `/opt/l64/trade.q`. This file contains a list of usernames and passwords for clients that are allowed to connect to the kdb+ process.
78
+
79
+ ### MetaData Initialization
80
+
81
+ Allowed instruments types are given in "Instrument Types" section of [meta_enumerations.md](doc/meta_enumerations.md).
82
+
83
+ ### Data Initialization for Instrument Type(s)
84
+ ```python
85
+ from trade_database_manager.manager import MetadataSql
86
+
87
+ metadatalib = MetadataSql()
88
+ metadatalib.initialize(for_inst_types="CB")
89
+ ```
90
+
91
+ This will try to create two tables, `instruments` and `instruments_cb` in the database if not yet exists. The `instruments` table will store the common information of all instruments, and the `instruments_cb` table will store the type-specific information of the instruments of type `CB`.
92
+
93
+ The table fields are listed in the [data_organization.md](doc/data_organization.md) file.
94
+
95
+
96
+
97
+
@@ -1,33 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- # @Time : 2024/4/19 16:44
3
- # @Author : YQ Tsui
4
- # @File : fields_data_type.py
5
- # @Purpose :
6
-
7
- from sqlalchemy import DOUBLE_PRECISION, Integer, String, Date
8
-
9
- FIELD_DATA_TYPE_SQL = {
10
- "ticker": String(20),
11
- "name": String(20),
12
- "currency": String(6),
13
- "exchange": String(10),
14
- "timezone": String(30),
15
- "tick_size": DOUBLE_PRECISION(),
16
- "lot_size": DOUBLE_PRECISION(),
17
- "min_lots": DOUBLE_PRECISION(),
18
- "market_tplus": Integer(),
19
- "listed_date": Date(),
20
- "delisted_date": Date(),
21
- "country": String(6),
22
- # STK
23
- "sector": String(30),
24
- "industry": String(36),
25
- "board_type": String(200),
26
- # LOF & ETF
27
- "issuer": String(60),
28
- "current_mgr": String(60),
29
- "custodian": String(60),
30
- "issuer_country": String(6),
31
- "fund_type": String(20),
32
- "benchmark": String(60),
33
- }