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.
- {trade_database_manager-0.0.6.dev0/trade_database_manager.egg-info → trade_database_manager-0.0.6.dev1}/PKG-INFO +21 -1
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/README.md +20 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/pyproject.toml +1 -1
- trade_database_manager-0.0.6.dev1/trade_database_manager/manager/fields_data_type.py +55 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/manager/metadata_sql.py +32 -9
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/manager/typedefs.py +1 -1
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1/trade_database_manager.egg-info}/PKG-INFO +21 -1
- trade_database_manager-0.0.6.dev0/trade_database_manager/manager/fields_data_type.py +0 -33
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/LICENSE +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/setup.cfg +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/__init__.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/config.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/__init__.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/kdb/__init__.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/kdb/kdbmanager.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/sql/__init__.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/sql/sqlmanager.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/sql/sqlreader.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/sql/sqlwriter.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/core/typedefs.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager/manager/__init__.py +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager.egg-info/SOURCES.txt +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager.egg-info/dependency_links.txt +0 -0
- {trade_database_manager-0.0.6.dev0 → trade_database_manager-0.0.6.dev1}/trade_database_manager.egg-info/requires.txt +0 -0
- {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.
|
|
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
|
+
|
|
@@ -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,
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
103
|
-
|
|
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 (
|
|
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", "
|
|
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.
|
|
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
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|