gjdatac-api 0.0.5__tar.gz → 0.0.6__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.
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/PKG-INFO +1 -1
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/gjdatac_api/data_api_class.py +720 -75
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/gjdatac_api.egg-info/PKG-INFO +1 -1
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/setup.py +1 -1
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/gjdatac_api/__init__.py +0 -0
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/gjdatac_api/dict_data.py +0 -0
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/gjdatac_api/dolphin_db_info.py +0 -0
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/gjdatac_api.egg-info/SOURCES.txt +0 -0
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/gjdatac_api.egg-info/dependency_links.txt +0 -0
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/gjdatac_api.egg-info/requires.txt +0 -0
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/gjdatac_api.egg-info/top_level.txt +0 -0
- {gjdatac_api-0.0.5 → gjdatac_api-0.0.6}/setup.cfg +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# 此文件用于编写数据接口---类方式实现
|
|
2
2
|
|
|
3
3
|
import datetime
|
|
4
|
-
import holidays
|
|
5
4
|
import asyncio
|
|
5
|
+
|
|
6
|
+
import holidays
|
|
6
7
|
import pandas as pd
|
|
8
|
+
import rqdatac as rq
|
|
7
9
|
import dolphindb as ddb
|
|
8
10
|
|
|
9
11
|
from .dict_data import get_price_frequency_dict, get_price_data_type_dict, get_instruments_type_dict
|
|
@@ -60,10 +62,22 @@ class GJDataC:
|
|
|
60
62
|
''' get_activate_contract 接口相关属性 '''
|
|
61
63
|
self.get_active_contract_data = None # 用于存放get_activate_contract接口数据
|
|
62
64
|
|
|
65
|
+
''' get_basic_data 接口相关属性 '''
|
|
66
|
+
self.get_basic_data_data = None # 用于获取get_basic_data接口数据
|
|
67
|
+
|
|
68
|
+
''' get_warehouse_stocks_future 接口相关属性 '''
|
|
69
|
+
self.get_warehouse_stocks_future_data = None # 用于获取get_warehouse_stocks_future接口数据
|
|
70
|
+
|
|
71
|
+
''' get_vwap 接口相关属性 '''
|
|
72
|
+
self.get_vwap_data = None # 用于获取get_vwap接口数据
|
|
73
|
+
|
|
74
|
+
''' get_twap 接口相关属性 '''
|
|
75
|
+
self.get_twap_data = None # 用于获取get_twap接口数据
|
|
76
|
+
|
|
63
77
|
# @staticmethod
|
|
64
78
|
def connect_db(self, table_name, db_path):
|
|
65
|
-
"""
|
|
66
|
-
此方法用于根据不同的数据表及数据库获取数据,只返回Table对象,对应的数据处理在对应的数据接口处理
|
|
79
|
+
"""
|
|
80
|
+
此方法用于根据不同的数据表及数据库获取数据,只返回Table对象,对应的数据处理在对应的数据接口处理
|
|
67
81
|
:param table_name: 数据表路径
|
|
68
82
|
:param db_path: 数据库路径
|
|
69
83
|
:return 根据数据库和表路径获取的数据(Table对象), 会话信息(db_session)
|
|
@@ -93,8 +107,8 @@ class GJDataC:
|
|
|
93
107
|
|
|
94
108
|
@staticmethod
|
|
95
109
|
def general_validate_either_or(field_1_name, field_1_value, field_2_name, field_2_value):
|
|
96
|
-
"""
|
|
97
|
-
此方法用于验证二选一的参数填写情况
|
|
110
|
+
"""
|
|
111
|
+
此方法用于验证二选一的参数填写情况
|
|
98
112
|
:param field_1_name: 参数1名称
|
|
99
113
|
:param field_1_value: 参数1值
|
|
100
114
|
:param field_2_name: 参数2名称
|
|
@@ -110,7 +124,7 @@ class GJDataC:
|
|
|
110
124
|
"""
|
|
111
125
|
判断字符串是否为datetime.date, datetime.datetime格式。
|
|
112
126
|
:param date_str: 待判断的字符串。
|
|
113
|
-
|
|
127
|
+
|
|
114
128
|
Returns:
|
|
115
129
|
True: 如果是日期格式,返回 True。
|
|
116
130
|
False: 否则返回 False。
|
|
@@ -124,7 +138,7 @@ class GJDataC:
|
|
|
124
138
|
"""
|
|
125
139
|
此方法用于验证日期字段是否为可以转换为datetime的类型
|
|
126
140
|
:param date_data: 日期字符串
|
|
127
|
-
|
|
141
|
+
|
|
128
142
|
:return : 如果可以转换为datetime类型,返回 True, 否则返回 False。
|
|
129
143
|
"""
|
|
130
144
|
|
|
@@ -139,7 +153,7 @@ class GJDataC:
|
|
|
139
153
|
"""
|
|
140
154
|
此方法用于验证日期字段是否为可以转换为date的类型
|
|
141
155
|
:param date_data: 日期字符串
|
|
142
|
-
|
|
156
|
+
|
|
143
157
|
:return : 如果可以转换为date类型,返回 True, 否则返回 False。
|
|
144
158
|
"""
|
|
145
159
|
|
|
@@ -167,7 +181,7 @@ class GJDataC:
|
|
|
167
181
|
校验参数是否为str类型
|
|
168
182
|
:param param_name: 参数名称
|
|
169
183
|
:param param_value: 参数值
|
|
170
|
-
|
|
184
|
+
|
|
171
185
|
:return: None (用于校验数据无需返回值)
|
|
172
186
|
"""
|
|
173
187
|
|
|
@@ -178,7 +192,7 @@ class GJDataC:
|
|
|
178
192
|
"""
|
|
179
193
|
对asset_type进行校验
|
|
180
194
|
:param asset_type: str, 合约类型
|
|
181
|
-
|
|
195
|
+
|
|
182
196
|
:return: None (用于校验数据无需返回值)
|
|
183
197
|
"""
|
|
184
198
|
self.general_validate_params_required(asset_type, "asset_type") # 校验必填参数
|
|
@@ -192,7 +206,7 @@ class GJDataC:
|
|
|
192
206
|
根据用户选择的字段进行字段筛选
|
|
193
207
|
:param fields: 字段列表--用户传入的需要返回的字段
|
|
194
208
|
:param data: 数据
|
|
195
|
-
|
|
209
|
+
|
|
196
210
|
:return data: 根据用户填写的字段筛选后的数据
|
|
197
211
|
"""
|
|
198
212
|
|
|
@@ -220,9 +234,9 @@ class GJDataC:
|
|
|
220
234
|
def _deal_fields(_field, columns_list):
|
|
221
235
|
"""
|
|
222
236
|
判断用户选择的字段是否存在
|
|
223
|
-
|
|
237
|
+
|
|
224
238
|
:param columns_list: 数据的所有字段
|
|
225
|
-
|
|
239
|
+
|
|
226
240
|
:return: None (用于校验数据无需返回值)
|
|
227
241
|
"""
|
|
228
242
|
if _field not in columns_list:
|
|
@@ -237,7 +251,7 @@ class GJDataC:
|
|
|
237
251
|
:param data: pandas.DataFrame, 数据
|
|
238
252
|
:param field_name: str, 过滤字段
|
|
239
253
|
:param field_value: str or list, 过滤值
|
|
240
|
-
|
|
254
|
+
|
|
241
255
|
:return 根据字段过滤后的数据
|
|
242
256
|
"""
|
|
243
257
|
|
|
@@ -250,15 +264,15 @@ class GJDataC:
|
|
|
250
264
|
:param data: 需要处理的数据
|
|
251
265
|
:param field_name: 字段名
|
|
252
266
|
:param field_value: 字段值
|
|
253
|
-
|
|
267
|
+
|
|
254
268
|
:return : 根据字段过滤后的数据
|
|
255
269
|
"""
|
|
256
270
|
self.general_validate_field_str_or_list(field_value, field_name)
|
|
257
271
|
return self.general_filter_data_by_field(data, field_name, field_value)
|
|
258
272
|
|
|
259
273
|
def general_date_str_to_date(self, date_str):
|
|
260
|
-
"""
|
|
261
|
-
将date类型的str转换成datetime.date类型
|
|
274
|
+
"""
|
|
275
|
+
将date类型的str转换成datetime.date类型
|
|
262
276
|
:param date_str: str, 日期字符串
|
|
263
277
|
"""
|
|
264
278
|
if not self.general_validate_date_str_is_date_type(date_str):
|
|
@@ -266,6 +280,12 @@ class GJDataC:
|
|
|
266
280
|
|
|
267
281
|
return datetime.datetime.strptime(date_str, "%Y-%m-%d")
|
|
268
282
|
|
|
283
|
+
@staticmethod
|
|
284
|
+
def general_date_str_to_datetime(date_str):
|
|
285
|
+
""" 将date类型的str转换成datetime.datetime类型 """
|
|
286
|
+
if isinstance(date_str, str):
|
|
287
|
+
return datetime.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
|
|
288
|
+
|
|
269
289
|
""" get_price(获取行情数据接口) """
|
|
270
290
|
|
|
271
291
|
def get_price(self, order_book_ids=None, asset_type="future", frequency=None, start_date=None, end_date=None,
|
|
@@ -318,8 +338,8 @@ class GJDataC:
|
|
|
318
338
|
"""
|
|
319
339
|
对order_book_ids 类型 以及 是否必填 进行校验
|
|
320
340
|
:param order_book_ids: 合约类型
|
|
321
|
-
|
|
322
|
-
:return: None
|
|
341
|
+
|
|
342
|
+
:return: None
|
|
323
343
|
"""
|
|
324
344
|
self.general_validate_params_required(order_book_ids, "order_book_ids") # 校验必填参数
|
|
325
345
|
self.general_validate_field_str_or_list(order_book_ids, "order_book_ids") # 校验参数类型
|
|
@@ -327,7 +347,7 @@ class GJDataC:
|
|
|
327
347
|
def get_price_validate_frequency(self, frequency):
|
|
328
348
|
"""
|
|
329
349
|
对frequency进行校验
|
|
330
|
-
|
|
350
|
+
|
|
331
351
|
:param frequency: 频率
|
|
332
352
|
:return: None
|
|
333
353
|
"""
|
|
@@ -340,7 +360,7 @@ class GJDataC:
|
|
|
340
360
|
"""
|
|
341
361
|
对 start_date 和 end_date 进行校验
|
|
342
362
|
校验 start_date 和 end_date 是否同时提供,或者都不提供。
|
|
343
|
-
|
|
363
|
+
|
|
344
364
|
:param start_date: 开始日期
|
|
345
365
|
:param end_date: 结束日期
|
|
346
366
|
:return: None
|
|
@@ -365,7 +385,7 @@ class GJDataC:
|
|
|
365
385
|
def _get_price_convert_start_end_date(start_date, end_date):
|
|
366
386
|
"""
|
|
367
387
|
将 start_date 和 end_date 转换为 datetime 类型。
|
|
368
|
-
|
|
388
|
+
|
|
369
389
|
:param start_date: 开始日期,可以是 datetime.datetime 对象或字符串。
|
|
370
390
|
:param end_date: 结束日期,可以是 datetime.datetime 对象或字符串。
|
|
371
391
|
:return: 转换后的 start_date 和 end_date。
|
|
@@ -403,7 +423,7 @@ class GJDataC:
|
|
|
403
423
|
"""
|
|
404
424
|
根据start_date和end_date筛选数据
|
|
405
425
|
此处order_book_ids参数用于处理未传递start_date和end_date的情况(根据order_book_ids返回距离当前时间最近的一条数据)
|
|
406
|
-
|
|
426
|
+
|
|
407
427
|
:param start_date: 开始时间
|
|
408
428
|
:param end_date: 结束时间
|
|
409
429
|
:param order_book_ids: 合约代码
|
|
@@ -440,7 +460,7 @@ class GJDataC:
|
|
|
440
460
|
"""
|
|
441
461
|
根据用户选择的字段返回数据
|
|
442
462
|
:param fields: 字段列表 -- 用户传入的需要返回的字段
|
|
443
|
-
|
|
463
|
+
|
|
444
464
|
:return : None
|
|
445
465
|
|
|
446
466
|
"""
|
|
@@ -449,7 +469,7 @@ class GJDataC:
|
|
|
449
469
|
def get_price_by_type_frequency(self, asset_type, frequency):
|
|
450
470
|
"""
|
|
451
471
|
根据合约类型和frequency筛选数据
|
|
452
|
-
|
|
472
|
+
|
|
453
473
|
:param asset_type: 合约类型
|
|
454
474
|
:param frequency: 频率
|
|
455
475
|
:return: None
|
|
@@ -483,7 +503,7 @@ class GJDataC:
|
|
|
483
503
|
def get_price_data_rename_columns(self, bar_or_tick):
|
|
484
504
|
"""
|
|
485
505
|
将从数据库中获取的数据列名重命名
|
|
486
|
-
|
|
506
|
+
|
|
487
507
|
:param bar_or_tick: 是bar类型数据还是tick类型(不同类型字段不同)
|
|
488
508
|
:return: None
|
|
489
509
|
"""
|
|
@@ -494,10 +514,10 @@ class GJDataC:
|
|
|
494
514
|
def _get_price_get_data(self, order_book_ids, table_name, db_path):
|
|
495
515
|
"""
|
|
496
516
|
用于接收数据表以及数据库,获取数据
|
|
497
|
-
: params order_book_ids: 合约代码
|
|
498
|
-
: params table_name: 数据表路径
|
|
517
|
+
: params order_book_ids: 合约代码
|
|
518
|
+
: params table_name: 数据表路径
|
|
499
519
|
: params db_path: 数据库路径
|
|
500
|
-
|
|
520
|
+
|
|
501
521
|
: return filtered_data: 从数据库获取并根据合约代码筛选后的数据
|
|
502
522
|
"""
|
|
503
523
|
get_price_data, db_session = self.connect_db(table_name, db_path)
|
|
@@ -508,6 +528,10 @@ class GJDataC:
|
|
|
508
528
|
else:
|
|
509
529
|
limit_data = get_price_data.where(f"instrument_id in {order_book_ids}")
|
|
510
530
|
|
|
531
|
+
print("开始处理数据\n")
|
|
532
|
+
if limit_data.rows > 1000000:
|
|
533
|
+
print(f"当前获取的数据量较大,总数据量为: {limit_data.rows}, 执行时间可能较久,建议调整参数范围,多次获取")
|
|
534
|
+
|
|
511
535
|
# 分批处理
|
|
512
536
|
filtered_data = self._get_price_get_data_todf(limit_data)
|
|
513
537
|
|
|
@@ -581,8 +605,8 @@ class GJDataC:
|
|
|
581
605
|
# return data.toDF()
|
|
582
606
|
|
|
583
607
|
def get_price_data_get_data(self, order_book_ids, asset_type, frequency):
|
|
584
|
-
"""
|
|
585
|
-
根据参数获取数据库和表名,调用接口获取数据
|
|
608
|
+
"""
|
|
609
|
+
根据参数获取数据库和表名,调用接口获取数据
|
|
586
610
|
|
|
587
611
|
:param order_book_ids: 合约代码列表
|
|
588
612
|
:param asset_type: 合约类型
|
|
@@ -640,7 +664,7 @@ class GJDataC:
|
|
|
640
664
|
self.get_instruments_data_rename_columns(asset_type)
|
|
641
665
|
|
|
642
666
|
# 从交易参数中填充commodity和trading_hour的值
|
|
643
|
-
|
|
667
|
+
self.get_instruments_deal_commodity_trading_hour()
|
|
644
668
|
|
|
645
669
|
''' 按照文档筛选需要返回的字段 '''
|
|
646
670
|
self.get_instruments_data_filter_return_fileds(asset_type)
|
|
@@ -716,7 +740,7 @@ class GJDataC:
|
|
|
716
740
|
def _get_instruments_data_get_data(self, order_book_ids, table_name, db_path):
|
|
717
741
|
"""
|
|
718
742
|
用于接收数据表以及数据库,获取数据
|
|
719
|
-
|
|
743
|
+
|
|
720
744
|
:param order_book_ids: 合约代码
|
|
721
745
|
:param table_name: 数据表路径
|
|
722
746
|
:param db_path: 数据库路径
|
|
@@ -737,9 +761,9 @@ class GJDataC:
|
|
|
737
761
|
return filtered_data
|
|
738
762
|
|
|
739
763
|
def get_instruments_data_get_data(self, asset_type=None, order_book_ids=None, commodity=None):
|
|
740
|
-
"""
|
|
741
|
-
根据参数获取数据库和表名,调用接口获取数据
|
|
742
|
-
|
|
764
|
+
"""
|
|
765
|
+
根据参数获取数据库和表名,调用接口获取数据
|
|
766
|
+
|
|
743
767
|
:param asset_type: 合约类型
|
|
744
768
|
:param order_book_ids: 合约代码
|
|
745
769
|
:param commodity: 合约品种
|
|
@@ -784,7 +808,7 @@ class GJDataC:
|
|
|
784
808
|
def get_instruments_data_rename_columns(self, asset_type):
|
|
785
809
|
"""
|
|
786
810
|
将从数据库中获取的数据列名重命名为文档要求的名字
|
|
787
|
-
|
|
811
|
+
|
|
788
812
|
:param asset_type: 合约类型
|
|
789
813
|
:return: None
|
|
790
814
|
"""
|
|
@@ -832,7 +856,7 @@ class GJDataC:
|
|
|
832
856
|
def get_trading_dates_validate_date_n_start_end(self, date, n, start_date, end_date):
|
|
833
857
|
"""
|
|
834
858
|
校验date、n和start_date、end_date有效性
|
|
835
|
-
|
|
859
|
+
|
|
836
860
|
:param date: str-- 日期
|
|
837
861
|
:param n: str--根据不同值获取对应的交易日历
|
|
838
862
|
:param start_date: str(datetime.date, datetime.datetime)--开始日期
|
|
@@ -876,7 +900,7 @@ class GJDataC:
|
|
|
876
900
|
根据start_date和end_date获取交易日历
|
|
877
901
|
:param start_date: str(datetime.date, datetime.datetime)--选填, 开始日期
|
|
878
902
|
:param end_date: str(datetime.date, datetime.datetime)--选填, 结束日期
|
|
879
|
-
|
|
903
|
+
|
|
880
904
|
:return: 根据start_date和end_date筛选后的数据
|
|
881
905
|
"""
|
|
882
906
|
|
|
@@ -906,7 +930,7 @@ class GJDataC:
|
|
|
906
930
|
def _get_trading_dates_by_start_end(time_data):
|
|
907
931
|
"""
|
|
908
932
|
将时间str数据处理成对应的时间类型(例如:date类型的str,处理成datetime.date类型)
|
|
909
|
-
|
|
933
|
+
|
|
910
934
|
:param time_data: 时间数据
|
|
911
935
|
:return: 转换后的时间数据类型
|
|
912
936
|
"""
|
|
@@ -926,7 +950,7 @@ class GJDataC:
|
|
|
926
950
|
其中,如果是str类型,还要判断是否是datetime.date, datetime.datetime两种类型的字符串.
|
|
927
951
|
:params _start_date: 开始日期
|
|
928
952
|
:params _end_date: 结束日期
|
|
929
|
-
|
|
953
|
+
|
|
930
954
|
:return: 如果类型正确,返回 True。否则返回 False,并打印错误信息
|
|
931
955
|
"""
|
|
932
956
|
if isinstance(_start_date, (str, datetime.date, datetime.datetime)) and \
|
|
@@ -956,11 +980,11 @@ class GJDataC:
|
|
|
956
980
|
def get_date_get_week_month_year(data, start_date, end_date):
|
|
957
981
|
"""
|
|
958
982
|
用于获取当前日期所在周、月、年的交易日数据
|
|
959
|
-
|
|
983
|
+
|
|
960
984
|
:param data: 交易日历数据
|
|
961
985
|
:param start_date: 开始日期
|
|
962
986
|
:param end_date: 结束日期
|
|
963
|
-
|
|
987
|
+
|
|
964
988
|
:return: 交易日历数据
|
|
965
989
|
|
|
966
990
|
"""
|
|
@@ -1025,7 +1049,7 @@ class GJDataC:
|
|
|
1025
1049
|
:param commodity: str--选填(和order_book_id二选一),合约品种,如果入参为品种,则返回该品种条件下所有合约的保证金list
|
|
1026
1050
|
:param date: datetime--必填(默认今天),日期
|
|
1027
1051
|
:param exchange: str--必填,交易所
|
|
1028
|
-
:return:
|
|
1052
|
+
:return: 期货保证金数据
|
|
1029
1053
|
"""
|
|
1030
1054
|
|
|
1031
1055
|
""" 校验数据 """
|
|
@@ -1048,7 +1072,11 @@ class GJDataC:
|
|
|
1048
1072
|
return self.get_margin_ratio_data[["order_book_id", "commodity", "date", "exchange"]]
|
|
1049
1073
|
|
|
1050
1074
|
def get_margin_ratio_validate_exchange(self, exchange):
|
|
1051
|
-
"""
|
|
1075
|
+
"""
|
|
1076
|
+
校验exchange
|
|
1077
|
+
:param exchange: str--必填,交易所
|
|
1078
|
+
:return: None
|
|
1079
|
+
"""
|
|
1052
1080
|
|
|
1053
1081
|
self.general_validate_params_required(exchange, "exchange") # 校验必填参数
|
|
1054
1082
|
|
|
@@ -1056,7 +1084,12 @@ class GJDataC:
|
|
|
1056
1084
|
raise ValueError("exchange should be str")
|
|
1057
1085
|
|
|
1058
1086
|
def get_margin_ratio_validate_order_book_id_commodity(self, order_book_id, commodity):
|
|
1059
|
-
"""
|
|
1087
|
+
"""
|
|
1088
|
+
校验order_book_id和commodity
|
|
1089
|
+
:param order_book_id: str--二选一,合约代码
|
|
1090
|
+
:param commodity: str--二选一,品种
|
|
1091
|
+
:return: None
|
|
1092
|
+
"""
|
|
1060
1093
|
|
|
1061
1094
|
''' 对order_book_ids和commodity_type进行校验 '''
|
|
1062
1095
|
self.general_validate_either_or("order_book_id", order_book_id, "commodity", commodity)
|
|
@@ -1071,18 +1104,24 @@ class GJDataC:
|
|
|
1071
1104
|
commodity)
|
|
1072
1105
|
|
|
1073
1106
|
def get_margin_ratio_validate_date(self, date):
|
|
1074
|
-
"""
|
|
1107
|
+
"""
|
|
1108
|
+
校验date
|
|
1109
|
+
:param date: datetime--日期
|
|
1110
|
+
:return: None
|
|
1111
|
+
"""
|
|
1075
1112
|
|
|
1076
1113
|
if isinstance(date, (str, datetime.date, datetime.datetime)):
|
|
1077
1114
|
if isinstance(date, str) and not self.general_validate_date(date):
|
|
1078
|
-
raise ValueError("date
|
|
1079
|
-
return True
|
|
1115
|
+
raise ValueError("date is not a valid date string format")
|
|
1116
|
+
# return True
|
|
1080
1117
|
else:
|
|
1081
|
-
raise ValueError("date
|
|
1118
|
+
raise ValueError("date type error, please pass in str, datetime.date or datetime.datetime type")
|
|
1082
1119
|
|
|
1083
1120
|
def get_margin_ratio_data_by_date(self, date):
|
|
1084
1121
|
"""
|
|
1085
1122
|
根据date筛选数据
|
|
1123
|
+
:param date: datetime--日期
|
|
1124
|
+
:return: None
|
|
1086
1125
|
"""
|
|
1087
1126
|
|
|
1088
1127
|
if isinstance(date, str):
|
|
@@ -1092,6 +1131,8 @@ class GJDataC:
|
|
|
1092
1131
|
def get_margin_ratio_data_by_exchange(self, exchange):
|
|
1093
1132
|
"""
|
|
1094
1133
|
根据exchange筛选数据
|
|
1134
|
+
:param exchange: str--交易所
|
|
1135
|
+
:return: None
|
|
1095
1136
|
"""
|
|
1096
1137
|
|
|
1097
1138
|
self.get_margin_ratio_data = self.get_margin_ratio_data[self.get_margin_ratio_data["exchange"] == exchange]
|
|
@@ -1105,7 +1146,7 @@ class GJDataC:
|
|
|
1105
1146
|
:param commodity: str--选填(和order_book_id二选一),合约品种,如果入参为品种,则返回该品种条件下所有合约的交割手续费list
|
|
1106
1147
|
:param date: datetime--必填(默认今天),日期
|
|
1107
1148
|
:param exchange: str--必填,交易所
|
|
1108
|
-
:return:
|
|
1149
|
+
:return: 期货交割手续费
|
|
1109
1150
|
"""
|
|
1110
1151
|
|
|
1111
1152
|
""" 校验数据 """
|
|
@@ -1128,7 +1169,11 @@ class GJDataC:
|
|
|
1128
1169
|
return self.get_fee_data[["order_book_id", "commodity", "date", "exchange"]]
|
|
1129
1170
|
|
|
1130
1171
|
def get_fee_validate_exchange(self, exchange):
|
|
1131
|
-
"""
|
|
1172
|
+
"""
|
|
1173
|
+
校验exchange
|
|
1174
|
+
:param exchange: str--必填,交易所
|
|
1175
|
+
:return: None
|
|
1176
|
+
"""
|
|
1132
1177
|
# 是否必填
|
|
1133
1178
|
self.general_validate_params_required(exchange, "exchange")
|
|
1134
1179
|
|
|
@@ -1136,7 +1181,12 @@ class GJDataC:
|
|
|
1136
1181
|
raise ValueError("exchange should be str")
|
|
1137
1182
|
|
|
1138
1183
|
def get_fee_validate_order_book_id_commodity(self, order_book_id, commodity):
|
|
1139
|
-
"""
|
|
1184
|
+
"""
|
|
1185
|
+
校验order_book_id和commodity
|
|
1186
|
+
:param order_book_id: str--二选一,合约代码
|
|
1187
|
+
:param commodity: str--二选一,品种
|
|
1188
|
+
:return: None
|
|
1189
|
+
"""
|
|
1140
1190
|
|
|
1141
1191
|
''' 对order_book_ids和commodity_type进行校验 '''
|
|
1142
1192
|
self.general_validate_either_or("order_book_id", order_book_id, "commodity", commodity)
|
|
@@ -1151,18 +1201,24 @@ class GJDataC:
|
|
|
1151
1201
|
commodity)
|
|
1152
1202
|
|
|
1153
1203
|
def get_fee_validate_date(self, date):
|
|
1154
|
-
"""
|
|
1204
|
+
"""
|
|
1205
|
+
校验date
|
|
1206
|
+
:param date: datetime--日期
|
|
1207
|
+
:return: None
|
|
1208
|
+
"""
|
|
1155
1209
|
|
|
1156
1210
|
if isinstance(date, (str, datetime.date, datetime.datetime)):
|
|
1157
1211
|
if isinstance(date, str) and not self.general_validate_date(date):
|
|
1158
|
-
raise ValueError("date
|
|
1159
|
-
return True
|
|
1212
|
+
raise ValueError("date is not a valid date string format")
|
|
1213
|
+
# return True
|
|
1160
1214
|
else:
|
|
1161
|
-
raise ValueError("date
|
|
1215
|
+
raise ValueError("date type error, please pass in str, datetime.date or datetime.datetime type")
|
|
1162
1216
|
|
|
1163
1217
|
def get_fee_data_by_date(self, date):
|
|
1164
1218
|
"""
|
|
1165
1219
|
根据date筛选数据
|
|
1220
|
+
:param date: datetime--日期
|
|
1221
|
+
:return: None
|
|
1166
1222
|
"""
|
|
1167
1223
|
|
|
1168
1224
|
if isinstance(date, str):
|
|
@@ -1172,6 +1228,8 @@ class GJDataC:
|
|
|
1172
1228
|
def get_fee_data_by_exchange(self, exchange):
|
|
1173
1229
|
"""
|
|
1174
1230
|
根据exchange筛选数据
|
|
1231
|
+
:param exchange: str--交易所
|
|
1232
|
+
:return: None
|
|
1175
1233
|
"""
|
|
1176
1234
|
|
|
1177
1235
|
self.get_fee_data = self.get_fee_data[self.get_fee_data["exchange"] == exchange]
|
|
@@ -1184,9 +1242,10 @@ class GJDataC:
|
|
|
1184
1242
|
:param order_book_ids: str or list--选填(和commodity二选一),合约代码
|
|
1185
1243
|
:param commodity: str or list--选填(和order_book_ids二选一),合约品种
|
|
1186
1244
|
:param date: datetime.date--选填(默认今天),日期
|
|
1187
|
-
:return:
|
|
1245
|
+
:return: 期货限仓数据
|
|
1188
1246
|
|
|
1189
1247
|
"""
|
|
1248
|
+
|
|
1190
1249
|
""" 校验数据 """
|
|
1191
1250
|
# 校验order_book_ids和commodity
|
|
1192
1251
|
self.get_limit_position_validate_order_book_ids_commodity(order_book_ids, commodity)
|
|
@@ -1201,7 +1260,12 @@ class GJDataC:
|
|
|
1201
1260
|
return self.get_limit_position_data
|
|
1202
1261
|
|
|
1203
1262
|
def get_limit_position_validate_order_book_ids_commodity(self, order_book_ids, commodity):
|
|
1204
|
-
"""
|
|
1263
|
+
"""
|
|
1264
|
+
对order_book_ids和commodity_type进行校验
|
|
1265
|
+
:param order_book_ids: str or list--选填(和commodity二选一),合约代码
|
|
1266
|
+
:param commodity: str or list--选填(和order_book_ids二选一),合约品种
|
|
1267
|
+
:return: None
|
|
1268
|
+
"""
|
|
1205
1269
|
self.general_validate_either_or("order_book_ids", order_book_ids, "commodity", commodity)
|
|
1206
1270
|
|
|
1207
1271
|
''' 根据order_book_ids和commodity_type进行筛选 '''
|
|
@@ -1216,18 +1280,23 @@ class GJDataC:
|
|
|
1216
1280
|
commodity)
|
|
1217
1281
|
|
|
1218
1282
|
def get_limit_position_validate_date(self, date):
|
|
1219
|
-
"""
|
|
1283
|
+
"""
|
|
1284
|
+
校验date
|
|
1285
|
+
:param date: datetime.date--选填,日期
|
|
1286
|
+
:return: None
|
|
1287
|
+
"""
|
|
1220
1288
|
|
|
1221
1289
|
if isinstance(date, (str, datetime.date, datetime.datetime)):
|
|
1222
1290
|
if isinstance(date, str) and not self.general_validate_date(date):
|
|
1223
|
-
raise ValueError("date
|
|
1224
|
-
return True
|
|
1291
|
+
raise ValueError("date is not a valid date string format")
|
|
1292
|
+
# return True
|
|
1225
1293
|
else:
|
|
1226
|
-
raise ValueError("date
|
|
1294
|
+
raise ValueError("date type error, please pass in str, datetime.date or datetime.datetime type")
|
|
1227
1295
|
|
|
1228
1296
|
def get_limit_position_data_by_date(self, date):
|
|
1229
1297
|
"""
|
|
1230
1298
|
根据date筛选数据
|
|
1299
|
+
:param date: datetime.date--选填,日期
|
|
1231
1300
|
"""
|
|
1232
1301
|
|
|
1233
1302
|
if isinstance(date, str):
|
|
@@ -1249,7 +1318,7 @@ class GJDataC:
|
|
|
1249
1318
|
:param fields: str or str list--选填,返回字段,默认全部
|
|
1250
1319
|
:param source: str--选填,数据源,默认研究所, 3个来源可选:1-数据中台, 2-米筐, 3-研究所
|
|
1251
1320
|
|
|
1252
|
-
:return:
|
|
1321
|
+
:return: 主力/次主力合约
|
|
1253
1322
|
"""
|
|
1254
1323
|
|
|
1255
1324
|
""" 校验参数 """
|
|
@@ -1259,10 +1328,13 @@ class GJDataC:
|
|
|
1259
1328
|
# 校验日期参数类型
|
|
1260
1329
|
self.get_active_contract_validate_date_type(begin_date, start_date, end_date)
|
|
1261
1330
|
|
|
1331
|
+
""" 校验code类型 """
|
|
1332
|
+
self.get_active_contract_validate_code(code)
|
|
1333
|
+
|
|
1262
1334
|
""" 筛选数据 """
|
|
1263
1335
|
|
|
1264
1336
|
# 根据code筛选数据
|
|
1265
|
-
self.
|
|
1337
|
+
self.get_active_contract_filter_by_code(code)
|
|
1266
1338
|
|
|
1267
1339
|
# 根据日期数据筛选数据
|
|
1268
1340
|
self.get_active_contract_filter_by_date(begin_date, start_date, end_date)
|
|
@@ -1279,7 +1351,15 @@ class GJDataC:
|
|
|
1279
1351
|
return self.get_active_contract_data
|
|
1280
1352
|
|
|
1281
1353
|
def get_active_contract_validate_required_params(self, code, begin_date, start_date, end_date, asset_type):
|
|
1282
|
-
"""
|
|
1354
|
+
"""
|
|
1355
|
+
校验参数是否必填
|
|
1356
|
+
:param code: str or str list--必填,品种
|
|
1357
|
+
:param begin_date: datetime--必填,指定日期
|
|
1358
|
+
:param start_date: date--必填,默认当天
|
|
1359
|
+
:param end_date: date--必填,默认当天
|
|
1360
|
+
:param asset_type: str--必填,active指主力;next_active次主力
|
|
1361
|
+
:return: None
|
|
1362
|
+
"""
|
|
1283
1363
|
|
|
1284
1364
|
params_dict = {
|
|
1285
1365
|
"code": code,
|
|
@@ -1292,8 +1372,20 @@ class GJDataC:
|
|
|
1292
1372
|
self.general_validate_params_required(value, key) # 校验必填参数
|
|
1293
1373
|
|
|
1294
1374
|
def get_active_contract_validate_code(self, code):
|
|
1295
|
-
"""
|
|
1375
|
+
"""
|
|
1376
|
+
校验code 类型
|
|
1377
|
+
:param code: str or str list--必填,品种
|
|
1378
|
+
:return: None
|
|
1379
|
+
"""
|
|
1296
1380
|
self.general_validate_field_str_or_list(code, "code")
|
|
1381
|
+
|
|
1382
|
+
def get_active_contract_filter_by_code(self, code):
|
|
1383
|
+
"""
|
|
1384
|
+
根据code过滤数据
|
|
1385
|
+
:param code: str or str list--必填,品种
|
|
1386
|
+
:return: None
|
|
1387
|
+
"""
|
|
1388
|
+
|
|
1297
1389
|
self.get_active_contract_data = self.get_active_contract_data[
|
|
1298
1390
|
self.get_active_contract_data["code"].isin(code)] if isinstance(code, list) else \
|
|
1299
1391
|
self.get_active_contract_data[self.get_active_contract_data["code"] == code]
|
|
@@ -1301,28 +1393,36 @@ class GJDataC:
|
|
|
1301
1393
|
def get_active_contract_validate_date_type(self, begin_date, start_date, end_date):
|
|
1302
1394
|
"""
|
|
1303
1395
|
校验日期数据的类型
|
|
1396
|
+
:param begin_date: datetime--必填,指定日期
|
|
1397
|
+
:param start_date: date--必填,默认当天
|
|
1398
|
+
:param end_date: date--必填,默认当天
|
|
1399
|
+
:return: None
|
|
1304
1400
|
"""
|
|
1305
1401
|
# 校验start_date 和 end_date 是否为datetime.date类型或者可以转换成该类型的str
|
|
1306
1402
|
if isinstance(start_date, (str, datetime.date)) and isinstance(end_date, (str, datetime.date)):
|
|
1307
1403
|
if isinstance(start_date, str) and not self.general_validate_date_str_is_date_type(start_date):
|
|
1308
|
-
raise ValueError("start_date
|
|
1404
|
+
raise ValueError("start_date type error, please enter datetime.date type")
|
|
1309
1405
|
if isinstance(end_date, str) and not self.general_validate_date_str_is_date_type(end_date):
|
|
1310
|
-
raise ValueError("
|
|
1406
|
+
raise ValueError("start_date type error, please enter datetime.date type")
|
|
1311
1407
|
else:
|
|
1312
|
-
raise ValueError("start_date
|
|
1408
|
+
raise ValueError("start_date or end_date type error, please enter datetime.date type")
|
|
1313
1409
|
|
|
1314
1410
|
# 校验begin_date 是否为datetime.datetime类型或者为可以转换为该类型的字符串
|
|
1315
1411
|
if isinstance(begin_date, (str, datetime.datetime)):
|
|
1316
1412
|
if isinstance(begin_date, str) and not self.general_validate_date_str_is_datetime_type(begin_date):
|
|
1317
|
-
raise ValueError("begin_date
|
|
1413
|
+
raise ValueError("begin_date type error, please enter datetime.datetime type")
|
|
1318
1414
|
else:
|
|
1319
|
-
raise ValueError("begin_date
|
|
1415
|
+
raise ValueError("begin_date type error, please enter datetime.datetime type")
|
|
1320
1416
|
|
|
1321
1417
|
def get_active_contract_filter_by_date(self, begin_date, start_date, end_date):
|
|
1322
1418
|
"""
|
|
1323
1419
|
根据日期筛选数据
|
|
1420
|
+
:param begin_date: datetime--必填,指定日期
|
|
1421
|
+
:param start_date: date--必填,默认当天
|
|
1422
|
+
:param end_date: date--必填,默认当天
|
|
1423
|
+
:return: None
|
|
1324
1424
|
"""
|
|
1325
|
-
|
|
1425
|
+
|
|
1326
1426
|
if start_date > end_date:
|
|
1327
1427
|
raise ValueError("start_date should be earlier than end_date")
|
|
1328
1428
|
|
|
@@ -1337,6 +1437,8 @@ class GJDataC:
|
|
|
1337
1437
|
def get_active_contract_filter_by_asset_type(self, asset_type):
|
|
1338
1438
|
"""
|
|
1339
1439
|
根据asset_type筛选数据
|
|
1440
|
+
:param asset_type: str--必填,active指主力;next_active次主力
|
|
1441
|
+
:return: None
|
|
1340
1442
|
"""
|
|
1341
1443
|
|
|
1342
1444
|
self.get_active_contract_data = self.general_filter_data_by_field(self.get_active_contract_data,
|
|
@@ -1346,6 +1448,8 @@ class GJDataC:
|
|
|
1346
1448
|
def get_active_contract_filter_data_by_fields(self, fields):
|
|
1347
1449
|
"""
|
|
1348
1450
|
根据fields筛选数据
|
|
1451
|
+
:param fields: str or str list--选填,返回字段,默认全部
|
|
1452
|
+
:return: None
|
|
1349
1453
|
"""
|
|
1350
1454
|
|
|
1351
1455
|
if isinstance(fields, (str, list)):
|
|
@@ -1356,6 +1460,8 @@ class GJDataC:
|
|
|
1356
1460
|
def get_active_contract_data_by_source(source):
|
|
1357
1461
|
"""
|
|
1358
1462
|
根据数据源筛选数据
|
|
1463
|
+
:param source: str--选填,数据源,默认研究所, 3个来源可选:1-数据中台, 2-米筐, 3-研究所
|
|
1464
|
+
:return: None
|
|
1359
1465
|
"""
|
|
1360
1466
|
|
|
1361
1467
|
if not isinstance(source, str):
|
|
@@ -1379,6 +1485,7 @@ class GJDataC:
|
|
|
1379
1485
|
:param asset_type: str--必填,枚举值:库存、基差、现货
|
|
1380
1486
|
:param start_date: str, datetime.date, datetime.datetime, pandasTimestamp--必填,开始日期
|
|
1381
1487
|
:param end_date: str, datetime.date, datetime.datetime, pandasTimestamp--必填,结束日期
|
|
1488
|
+
:return: 库存/基差/现货价格-数据(日频)
|
|
1382
1489
|
"""
|
|
1383
1490
|
|
|
1384
1491
|
""" 校验参数 """
|
|
@@ -1395,7 +1502,14 @@ class GJDataC:
|
|
|
1395
1502
|
# 校验start_date 和 end_date 类型
|
|
1396
1503
|
self.get_basic_data_validate_date(start_date, end_date)
|
|
1397
1504
|
|
|
1398
|
-
|
|
1505
|
+
""" 筛选数据 """
|
|
1506
|
+
# 根据start_date 和 end_date 筛选数据
|
|
1507
|
+
# self.get_basic_data_filter_data_by_date(start_date, end_date)
|
|
1508
|
+
|
|
1509
|
+
# 根据asset_type 筛选数据
|
|
1510
|
+
# self.get_basic_data_filter_data_by_asset_type(asset_type)
|
|
1511
|
+
|
|
1512
|
+
return self.get_basic_data_data
|
|
1399
1513
|
|
|
1400
1514
|
def get_basic_data_validate_required_params(self, order_book_id, asset_type, start_date, end_date):
|
|
1401
1515
|
params_dict = {
|
|
@@ -1410,6 +1524,8 @@ class GJDataC:
|
|
|
1410
1524
|
def get_basic_data_validate_order_book_id(self, order_book_id):
|
|
1411
1525
|
"""
|
|
1412
1526
|
校验order_book_id 类型
|
|
1527
|
+
:param order_book_id: str--必填,合约代码
|
|
1528
|
+
:return: None
|
|
1413
1529
|
"""
|
|
1414
1530
|
|
|
1415
1531
|
self.general_validate_param_is_str("order_book_id", order_book_id)
|
|
@@ -1417,6 +1533,8 @@ class GJDataC:
|
|
|
1417
1533
|
def get_basic_data_validate_asset_type(self, asset_type):
|
|
1418
1534
|
"""
|
|
1419
1535
|
校验asset_type 类型
|
|
1536
|
+
:param asset_type: str--必填,枚举值:库存、基差、现货
|
|
1537
|
+
:return: None
|
|
1420
1538
|
"""
|
|
1421
1539
|
|
|
1422
1540
|
self.general_validate_param_is_str("asset_type", asset_type)
|
|
@@ -1424,8 +1542,11 @@ class GJDataC:
|
|
|
1424
1542
|
def get_basic_data_validate_date(self, start_date, end_date):
|
|
1425
1543
|
"""
|
|
1426
1544
|
校验start_date 和 end_date 类型
|
|
1545
|
+
:param start_date: 开始日期
|
|
1546
|
+
:param end_date: 结束日期
|
|
1547
|
+
:return: None
|
|
1427
1548
|
"""
|
|
1428
|
-
error_msg = "start_date
|
|
1549
|
+
error_msg = "start_date or end_date type error, datetime.date, datetime.datetime, pandasTimestamp type or can be converted to the type"
|
|
1429
1550
|
|
|
1430
1551
|
# 校验start_date 和 end_date 是否为datetime.date, datetime.datetime, pandasTimestamp类型或者可以转换成该类型的str
|
|
1431
1552
|
if isinstance(start_date, (str, datetime.date, datetime.datetime, pd.Timestamp)) and isinstance(end_date, (
|
|
@@ -1436,3 +1557,527 @@ class GJDataC:
|
|
|
1436
1557
|
raise ValueError(error_msg)
|
|
1437
1558
|
else:
|
|
1438
1559
|
raise ValueError(error_msg)
|
|
1560
|
+
|
|
1561
|
+
@staticmethod
|
|
1562
|
+
def get_basic_data_get_data(order_book_ids, table_name, db_path):
|
|
1563
|
+
"""
|
|
1564
|
+
获取get_basic_data数据
|
|
1565
|
+
:param order_book_ids: 合约代码
|
|
1566
|
+
:param table_name: 表名
|
|
1567
|
+
:param db_path: 数据库路径
|
|
1568
|
+
:return: 从对应数据库中获取的数据
|
|
1569
|
+
|
|
1570
|
+
"""
|
|
1571
|
+
|
|
1572
|
+
# get_basic_data_data, db_session = self.connect_db(table_name, db_path)
|
|
1573
|
+
get_basic_data_data = pd.DataFrame() # 测试,用了数据库信息后需要替换成上面的代码
|
|
1574
|
+
|
|
1575
|
+
filtered_data = pd.DataFrame()
|
|
1576
|
+
# 使用 DolphinDB 的 where 子句筛选数据
|
|
1577
|
+
if isinstance(order_book_ids, str):
|
|
1578
|
+
filtered_data = get_basic_data_data.where(f"instrumentid='{order_book_ids}'").toDF()
|
|
1579
|
+
elif isinstance(order_book_ids, list):
|
|
1580
|
+
filtered_data = get_basic_data_data.where(f"instrumentid in {order_book_ids}").toDF()
|
|
1581
|
+
|
|
1582
|
+
# 关闭数据库连接
|
|
1583
|
+
# db_session.close() # 用了数据库信息后,需要取消注释
|
|
1584
|
+
|
|
1585
|
+
return filtered_data
|
|
1586
|
+
|
|
1587
|
+
def get_basic_data_filter_data_by_date(self, start_date, end_date):
|
|
1588
|
+
"""
|
|
1589
|
+
根据日期过滤get_basic_data数据
|
|
1590
|
+
:param start_date: 开始日期
|
|
1591
|
+
:param end_date: 结束日期
|
|
1592
|
+
:return: 过滤后的数据
|
|
1593
|
+
"""
|
|
1594
|
+
|
|
1595
|
+
start_date = self._get_basic_data_filter_data_by_date_conversion(start_date)
|
|
1596
|
+
end_date = self._get_basic_data_filter_data_by_date_conversion(end_date)
|
|
1597
|
+
|
|
1598
|
+
# 根据转换后的日期过滤数据
|
|
1599
|
+
self.get_basic_data_data = self.get_basic_data_data[
|
|
1600
|
+
(self.get_basic_data_data['date'] >= start_date) & (self.get_basic_data_data['date'] <= end_date)]
|
|
1601
|
+
|
|
1602
|
+
return self.get_basic_data_data
|
|
1603
|
+
|
|
1604
|
+
def _get_basic_data_filter_data_by_date_conversion(self, date_str):
|
|
1605
|
+
"""
|
|
1606
|
+
将日期字符串转换成对应格式的日期数据
|
|
1607
|
+
:param date_str: 日期字符串
|
|
1608
|
+
:return: 转换后的日期数据
|
|
1609
|
+
"""
|
|
1610
|
+
|
|
1611
|
+
if isinstance(date_str, str):
|
|
1612
|
+
if self.general_validate_date_str_is_datetime_type(date_str):
|
|
1613
|
+
return self.general_date_str_to_datetime(date_str)
|
|
1614
|
+
if self.general_validate_date_str_is_date_type(date_str):
|
|
1615
|
+
return self.general_date_str_to_date(date_str).date()
|
|
1616
|
+
|
|
1617
|
+
return date_str
|
|
1618
|
+
|
|
1619
|
+
def get_basic_data_filter_data_by_asset_type(self, asset_type):
|
|
1620
|
+
"""
|
|
1621
|
+
根据数据类型过滤数据
|
|
1622
|
+
:param asset_type: 数据类型
|
|
1623
|
+
:return: 过滤后的数据
|
|
1624
|
+
"""
|
|
1625
|
+
self.get_basic_data_data = self.get_basic_data_data[self.get_basic_data_data['type'] == asset_type]
|
|
1626
|
+
return self.get_basic_data_data
|
|
1627
|
+
|
|
1628
|
+
""" get_warehouse_stocks_future 仓单数据 """
|
|
1629
|
+
|
|
1630
|
+
def get_warehouse_stocks_future(self, commodity=None, start_date=None,
|
|
1631
|
+
end_date=datetime.date.today() - datetime.timedelta(days=1)):
|
|
1632
|
+
"""
|
|
1633
|
+
获取仓单数据
|
|
1634
|
+
:param commodity: str--必填,期货合约品种
|
|
1635
|
+
:param start_date: str--必填,开始日期
|
|
1636
|
+
:param end_date: str--必填,结束日期 (默认为策略当天日期的前一天)
|
|
1637
|
+
:return: 仓单数据
|
|
1638
|
+
"""
|
|
1639
|
+
|
|
1640
|
+
""" 校验必填参数 """
|
|
1641
|
+
# 校验commodity, start_date, end_date 是否为必填参数
|
|
1642
|
+
self.get_warehouse_stocks_future_validate_required_params(commodity, start_date, end_date)
|
|
1643
|
+
|
|
1644
|
+
# 校验commodity, start_date, end_date 是否为str类型
|
|
1645
|
+
self.get_warehouse_stocks_future_validate_type_str(commodity, start_date, end_date)
|
|
1646
|
+
|
|
1647
|
+
""" 获取数据 """
|
|
1648
|
+
# 从数据库中获取数据
|
|
1649
|
+
# self.get_warehouse_stocks_future_get_data(commodity)
|
|
1650
|
+
|
|
1651
|
+
""" 筛选数据 """
|
|
1652
|
+
# 根据日期筛选数据
|
|
1653
|
+
# self.get_warehouse_stocks_future_filter_data_by_date(start_date, end_date)
|
|
1654
|
+
|
|
1655
|
+
return self.get_warehouse_stocks_future_data
|
|
1656
|
+
|
|
1657
|
+
def get_warehouse_stocks_future_validate_required_params(self, commodity, start_date, end_date):
|
|
1658
|
+
"""
|
|
1659
|
+
校验仓单数据必填参数
|
|
1660
|
+
:param commodity: str--必填,期货合约品种
|
|
1661
|
+
:param start_date: str--必填,开始日期
|
|
1662
|
+
:param end_date: str--必填,结束日期 (默认为策略当天日期的前一天)
|
|
1663
|
+
:return: None
|
|
1664
|
+
"""
|
|
1665
|
+
|
|
1666
|
+
params_dict = {
|
|
1667
|
+
"commodity": commodity,
|
|
1668
|
+
"start_date": start_date,
|
|
1669
|
+
"end_date": end_date
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
for key, value in params_dict.items():
|
|
1673
|
+
self.general_validate_params_required(value, key)
|
|
1674
|
+
|
|
1675
|
+
def get_warehouse_stocks_future_validate_type_str(self, commodity, start_date, end_date):
|
|
1676
|
+
"""
|
|
1677
|
+
校验参数类型是否为str
|
|
1678
|
+
:param commodity: str--必填,期货合约品种
|
|
1679
|
+
:param start_date: str--必填,开始日期
|
|
1680
|
+
:param end_date: str--必填,结束日期 (默认为策略当天日期的前一天)
|
|
1681
|
+
:return: None
|
|
1682
|
+
"""
|
|
1683
|
+
|
|
1684
|
+
params_dict = {
|
|
1685
|
+
"commodity": commodity,
|
|
1686
|
+
"start_date": start_date,
|
|
1687
|
+
"end_date": end_date
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1690
|
+
for key, value in params_dict.items():
|
|
1691
|
+
self.general_validate_param_is_str(key, value)
|
|
1692
|
+
|
|
1693
|
+
@staticmethod
|
|
1694
|
+
def get_warehouse_stocks_future_get_data(commodity):
|
|
1695
|
+
"""
|
|
1696
|
+
获取get_basic_data数据
|
|
1697
|
+
:param commodity: 期货合约品种
|
|
1698
|
+
:return: 从对应数据库中获取的数据
|
|
1699
|
+
|
|
1700
|
+
"""
|
|
1701
|
+
|
|
1702
|
+
# get_warehouse_stocks_future_data, db_session = self.connect_db(table_name, db_path)
|
|
1703
|
+
get_warehouse_stocks_future_data = pd.DataFrame() # 测试,用了数据库信息后需要替换成上面的代码
|
|
1704
|
+
|
|
1705
|
+
filtered_data = pd.DataFrame()
|
|
1706
|
+
# 使用 DolphinDB 的 where 子句筛选数据
|
|
1707
|
+
if isinstance(commodity, str):
|
|
1708
|
+
filtered_data = get_warehouse_stocks_future_data.where(f"instrumentid='{commodity}'").toDF()
|
|
1709
|
+
elif isinstance(commodity, list):
|
|
1710
|
+
filtered_data = get_warehouse_stocks_future_data.where(f"instrumentid in {commodity}").toDF()
|
|
1711
|
+
|
|
1712
|
+
# 关闭数据库连接
|
|
1713
|
+
# db_session.close() # 用了数据库信息后,需要取消注释
|
|
1714
|
+
|
|
1715
|
+
return filtered_data
|
|
1716
|
+
|
|
1717
|
+
def get_warehouse_stocks_future_filter_data_by_date(self, start_date, end_date):
|
|
1718
|
+
"""
|
|
1719
|
+
根据日期过滤get_basic_data数据
|
|
1720
|
+
:param start_date: 开始日期
|
|
1721
|
+
:param end_date: 结束日期
|
|
1722
|
+
:return: 过滤后的数据
|
|
1723
|
+
"""
|
|
1724
|
+
|
|
1725
|
+
start_date = self._get_warehouse_stocks_future_date_conversion(start_date)
|
|
1726
|
+
end_date = self._get_warehouse_stocks_future_date_conversion(end_date)
|
|
1727
|
+
|
|
1728
|
+
# 根据转换后的日期过滤数据
|
|
1729
|
+
self.get_warehouse_stocks_future_data = self.get_warehouse_stocks_future_data[
|
|
1730
|
+
(self.get_warehouse_stocks_future_data['date'] >= start_date) & (
|
|
1731
|
+
self.get_warehouse_stocks_future_data['date'] <= end_date)]
|
|
1732
|
+
|
|
1733
|
+
return self.get_warehouse_stocks_future_data
|
|
1734
|
+
|
|
1735
|
+
def _get_warehouse_stocks_future_date_conversion(self, date_str):
|
|
1736
|
+
"""
|
|
1737
|
+
将日期字符串转换成对应格式的日期数据
|
|
1738
|
+
:param date_str: 日期字符串
|
|
1739
|
+
:return: 转换后的日期数据
|
|
1740
|
+
"""
|
|
1741
|
+
|
|
1742
|
+
if isinstance(date_str, str):
|
|
1743
|
+
if self.general_validate_date_str_is_datetime_type(date_str):
|
|
1744
|
+
return self.general_date_str_to_datetime(date_str)
|
|
1745
|
+
if self.general_validate_date_str_is_date_type(date_str):
|
|
1746
|
+
return self.general_date_str_to_date(date_str).date()
|
|
1747
|
+
|
|
1748
|
+
return date_str
|
|
1749
|
+
|
|
1750
|
+
""" get_vwap 获取vwap成交量加权价格指标 """
|
|
1751
|
+
|
|
1752
|
+
def get_vwap(self, order_book_ids=None, start_date=None, end_date=None, frequency='1d'):
|
|
1753
|
+
"""
|
|
1754
|
+
获取vwap成交量加权价格指标
|
|
1755
|
+
:param order_book_ids: str OR str list--必填, 合约代码
|
|
1756
|
+
:param start_date: datetime--必填, 开始日期
|
|
1757
|
+
:param end_date: datetime--必填, 结束日期
|
|
1758
|
+
:param frequency: str--必填, 历史数据的频率
|
|
1759
|
+
:return: vwap成交量加权价格指标
|
|
1760
|
+
"""
|
|
1761
|
+
|
|
1762
|
+
""" 校验必填参数 """
|
|
1763
|
+
# 校验oder_book_ids, start_date, end_date, frequency 是否为必填参数
|
|
1764
|
+
self.get_vwap_validate_required_params(order_book_ids, start_date, end_date, frequency)
|
|
1765
|
+
|
|
1766
|
+
# 校验order_book_ids是否为str OR str list
|
|
1767
|
+
self.get_vwap_validate_order_book_ids(order_book_ids)
|
|
1768
|
+
|
|
1769
|
+
# 校验start_date, end_date是否为datetime 或 对应格式的字符串
|
|
1770
|
+
self.get_vwap_validate_date_type(start_date, end_date)
|
|
1771
|
+
|
|
1772
|
+
# 校验frequency是否为str
|
|
1773
|
+
self.get_vwap_validate_frequency(frequency)
|
|
1774
|
+
|
|
1775
|
+
""" 筛选数据 """
|
|
1776
|
+
# 根据start_date, end_date筛选数据
|
|
1777
|
+
self.get_vwap_filter_by_date(start_date, end_date)
|
|
1778
|
+
|
|
1779
|
+
# 根据order_book_ids, frequency, start_date, end_date筛选数据
|
|
1780
|
+
self.get_vwap_get_data_by_frequency(order_book_ids, frequency, start_date, end_date)
|
|
1781
|
+
|
|
1782
|
+
return self.get_vwap_data
|
|
1783
|
+
|
|
1784
|
+
def get_vwap_validate_required_params(self, order_book_ids, start_date, end_date, frequency):
|
|
1785
|
+
"""
|
|
1786
|
+
校验必填参数
|
|
1787
|
+
:param order_book_ids: str OR str list--必填, 合约代码
|
|
1788
|
+
:param start_date: datetime--必填, 开始日期
|
|
1789
|
+
:param end_date: datetime--必填, 结束日期
|
|
1790
|
+
:param frequency: str--必填, 历史数据的频率
|
|
1791
|
+
:return: None
|
|
1792
|
+
"""
|
|
1793
|
+
|
|
1794
|
+
params_dict = {
|
|
1795
|
+
"order_book_ids": order_book_ids,
|
|
1796
|
+
"start_date": start_date,
|
|
1797
|
+
"end_date": end_date,
|
|
1798
|
+
"frequency": frequency
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
for key, value in params_dict.items():
|
|
1802
|
+
self.general_validate_params_required(value, key)
|
|
1803
|
+
|
|
1804
|
+
def get_vwap_validate_order_book_ids(self, order_book_ids):
|
|
1805
|
+
"""
|
|
1806
|
+
校验order_book_ids参数类型是否为str OR str list
|
|
1807
|
+
:param order_book_ids: str OR str list--必填, 合约代码
|
|
1808
|
+
:return: None
|
|
1809
|
+
"""
|
|
1810
|
+
|
|
1811
|
+
self.general_validate_field_str_or_list(order_book_ids, "order_book_ids")
|
|
1812
|
+
|
|
1813
|
+
def get_vwap_validate_date_type(self, start_date, end_date):
|
|
1814
|
+
"""
|
|
1815
|
+
校验start_date和end_date参数类型是否为datetime
|
|
1816
|
+
:param start_date: datetime--必填, 开始日期
|
|
1817
|
+
:param end_date: datetime--必填, 结束日期
|
|
1818
|
+
:return: None
|
|
1819
|
+
"""
|
|
1820
|
+
|
|
1821
|
+
self._get_vwap_validate_date_type(start_date, "start_date")
|
|
1822
|
+
self._get_vwap_validate_date_type(end_date, "end_date")
|
|
1823
|
+
|
|
1824
|
+
def _get_vwap_validate_date_type(self, date_str, date_str_name):
|
|
1825
|
+
"""
|
|
1826
|
+
校验date_str参数类型是否为datetime格式的字符串
|
|
1827
|
+
:param date_str: str, 日期
|
|
1828
|
+
:return: None
|
|
1829
|
+
"""
|
|
1830
|
+
|
|
1831
|
+
if isinstance(date_str, str) and not self.general_validate_date_str_is_datetime_type(date_str):
|
|
1832
|
+
raise ValueError(f"{date_str_name} type error, datetime.datetime type or can be converted to the type")
|
|
1833
|
+
if not isinstance(date_str, str) and not isinstance(date_str, datetime.datetime):
|
|
1834
|
+
raise ValueError(f"{date_str_name} type error, datetime.datetime type or can be converted to the type")
|
|
1835
|
+
|
|
1836
|
+
def _get_vwap_date_conversion(self, date_str):
|
|
1837
|
+
"""
|
|
1838
|
+
将日期字符串转换成对应格式的日期数据
|
|
1839
|
+
:param date_str: 日期字符串
|
|
1840
|
+
:return: 转换后的日期数据
|
|
1841
|
+
"""
|
|
1842
|
+
|
|
1843
|
+
if isinstance(date_str, str):
|
|
1844
|
+
if self.general_validate_date_str_is_datetime_type(date_str):
|
|
1845
|
+
return self.general_date_str_to_datetime(date_str)
|
|
1846
|
+
if self.general_validate_date_str_is_date_type(date_str):
|
|
1847
|
+
return self.general_date_str_to_date(date_str).date()
|
|
1848
|
+
|
|
1849
|
+
return date_str
|
|
1850
|
+
|
|
1851
|
+
def get_vwap_filter_by_date(self, start_date, end_date):
|
|
1852
|
+
"""
|
|
1853
|
+
校验start_date和end_date参数类型是否为str格式的字符串
|
|
1854
|
+
:param start_date: str, 开始日期
|
|
1855
|
+
:param end_date: str, 结束日期
|
|
1856
|
+
:return: None
|
|
1857
|
+
"""
|
|
1858
|
+
|
|
1859
|
+
start_date = self._get_vwap_date_conversion(start_date)
|
|
1860
|
+
end_date = self._get_vwap_date_conversion(end_date)
|
|
1861
|
+
|
|
1862
|
+
self.get_vwap_data = self.get_vwap_data[
|
|
1863
|
+
(self.get_vwap_data['datetime'] >= start_date) & (self.get_vwap_data['datetime'] <= end_date)]
|
|
1864
|
+
|
|
1865
|
+
def get_vwap_validate_frequency(self, frequency):
|
|
1866
|
+
"""
|
|
1867
|
+
校验frequency参数类型是否为str格式的字符串
|
|
1868
|
+
:param frequency: str, 历史数据的频率
|
|
1869
|
+
:return: None
|
|
1870
|
+
"""
|
|
1871
|
+
|
|
1872
|
+
self.general_validate_param_is_str("frequency", frequency)
|
|
1873
|
+
|
|
1874
|
+
def get_vwap_get_data_by_frequency(self, order_book_ids, frequency, start_date, end_date):
|
|
1875
|
+
"""
|
|
1876
|
+
根据频率获取数据
|
|
1877
|
+
|
|
1878
|
+
:param order_book_ids: str, 合约代码
|
|
1879
|
+
:param frequency: str, 历史数据的频率
|
|
1880
|
+
:param start_date: str, 开始日期
|
|
1881
|
+
:param end_date: str, 结束日期
|
|
1882
|
+
:return: None
|
|
1883
|
+
"""
|
|
1884
|
+
|
|
1885
|
+
frequency_date_format_dict = {
|
|
1886
|
+
"1m": "%Y-%m-%d %H:%M:%S",
|
|
1887
|
+
"1d": "%Y-%m-%d"
|
|
1888
|
+
}
|
|
1889
|
+
result = rq.get_price(order_book_ids, start_date=start_date, end_date=end_date, frequency=frequency)
|
|
1890
|
+
|
|
1891
|
+
# result["vwap_value"] = result["total_turnover"] / result["volume"]
|
|
1892
|
+
result = self.get_vwap_compute_value(result)
|
|
1893
|
+
|
|
1894
|
+
# 根据频率设置返回值的日期格式,1m为"%Y-%m-%d %H:%M:%S", 1d为"%Y-%m-%d"
|
|
1895
|
+
result["datetime"] = pd.to_datetime(result["datetime"], format=frequency_date_format_dict[frequency])
|
|
1896
|
+
self.get_vwap_data = result
|
|
1897
|
+
|
|
1898
|
+
@staticmethod
|
|
1899
|
+
def get_vwap_compute_value(df):
|
|
1900
|
+
"""
|
|
1901
|
+
此方法用于按照规则计算vwap_value的值
|
|
1902
|
+
合成规则:
|
|
1903
|
+
合成vwap数据来源:米筐分钟k数据/米筐日k数据(需要根据下述逻辑合成)
|
|
1904
|
+
vwap=成交额/成交量
|
|
1905
|
+
举例:2024-05-20 09:31:00的vwap行情为2024-05-20【 09:30:00, 09:31:00)bar数据中的成交额/成交量。
|
|
1906
|
+
"""
|
|
1907
|
+
|
|
1908
|
+
df["before_datetime"] = df['datetime'] - datetime.timedelta(minutes=1)
|
|
1909
|
+
|
|
1910
|
+
# 使用 apply 函数计算每行的 vwap_value 列
|
|
1911
|
+
df['vwap_value'] = df.apply(
|
|
1912
|
+
lambda row: df[(df['datetime'] >= row['before_datetime']) & (df['datetime'] <= row['datetime'])][
|
|
1913
|
+
'total_turnover'].sum() /
|
|
1914
|
+
df[(df['datetime'] >= row['before_datetime']) & (df['datetime'] <= row['datetime'])][
|
|
1915
|
+
'volume'].sum(),
|
|
1916
|
+
axis=1)
|
|
1917
|
+
|
|
1918
|
+
return df
|
|
1919
|
+
|
|
1920
|
+
""" get_twap 获取twap时间加权价格 """
|
|
1921
|
+
|
|
1922
|
+
def get_twap(self, order_book_ids=None, start_date=None, end_date=None, frequency='1d'):
|
|
1923
|
+
"""
|
|
1924
|
+
获取twap成交量加权价格指标
|
|
1925
|
+
:param order_book_ids: str OR str list--必填, 合约代码
|
|
1926
|
+
:param start_date: datetime--必填, 开始日期
|
|
1927
|
+
:param end_date: datetime--必填, 结束日期
|
|
1928
|
+
:param frequency: str--必填, 历史数据的频率
|
|
1929
|
+
:return: vwap成交量加权价格指标
|
|
1930
|
+
"""
|
|
1931
|
+
|
|
1932
|
+
""" 校验必填参数 """
|
|
1933
|
+
# 校验oder_book_ids, start_date, end_date, frequency 是否为必填参数
|
|
1934
|
+
self.get_twap_validate_required_params(order_book_ids, start_date, end_date, frequency)
|
|
1935
|
+
|
|
1936
|
+
# 校验order_book_ids是否为str OR str list
|
|
1937
|
+
self.get_twap_validate_order_book_ids(order_book_ids)
|
|
1938
|
+
|
|
1939
|
+
# 校验start_date, end_date是否为datetime 或 对应格式的字符串
|
|
1940
|
+
self.get_twap_validate_date_type(start_date, end_date)
|
|
1941
|
+
|
|
1942
|
+
# 校验frequency是否为str
|
|
1943
|
+
self.get_twap_validate_frequency(frequency)
|
|
1944
|
+
|
|
1945
|
+
""" 筛选数据 """
|
|
1946
|
+
# 根据start_date, end_date筛选数据
|
|
1947
|
+
self.get_twap_filter_by_date(start_date, end_date)
|
|
1948
|
+
|
|
1949
|
+
# 根据order_book_ids, frequency, start_date, end_date筛选数据
|
|
1950
|
+
self.get_twap_get_data_by_frequency(order_book_ids, frequency, start_date, end_date)
|
|
1951
|
+
|
|
1952
|
+
return self.get_twap_data
|
|
1953
|
+
|
|
1954
|
+
def get_twap_validate_required_params(self, order_book_ids, start_date, end_date, frequency):
|
|
1955
|
+
"""
|
|
1956
|
+
校验必填参数
|
|
1957
|
+
:param order_book_ids: str OR str list--必填, 合约代码
|
|
1958
|
+
:param start_date: datetime--必填, 开始日期
|
|
1959
|
+
:param end_date: datetime--必填, 结束日期
|
|
1960
|
+
:param frequency: str--必填, 历史数据的频率
|
|
1961
|
+
:return: None
|
|
1962
|
+
"""
|
|
1963
|
+
|
|
1964
|
+
params_dict = {
|
|
1965
|
+
"order_book_ids": order_book_ids,
|
|
1966
|
+
"start_date": start_date,
|
|
1967
|
+
"end_date": end_date,
|
|
1968
|
+
"frequency": frequency
|
|
1969
|
+
}
|
|
1970
|
+
|
|
1971
|
+
for key, value in params_dict.items():
|
|
1972
|
+
self.general_validate_params_required(value, key)
|
|
1973
|
+
|
|
1974
|
+
def get_twap_validate_order_book_ids(self, order_book_ids):
|
|
1975
|
+
"""
|
|
1976
|
+
校验order_book_ids参数类型是否为str OR str list
|
|
1977
|
+
:param order_book_ids: str OR str list--必填, 合约代码
|
|
1978
|
+
:return: None
|
|
1979
|
+
"""
|
|
1980
|
+
|
|
1981
|
+
self.general_validate_field_str_or_list(order_book_ids, "order_book_ids")
|
|
1982
|
+
|
|
1983
|
+
def get_twap_validate_date_type(self, start_date, end_date):
|
|
1984
|
+
"""
|
|
1985
|
+
校验start_date和end_date参数类型是否为datetime
|
|
1986
|
+
:param start_date: datetime--必填, 开始日期
|
|
1987
|
+
:param end_date: datetime--必填, 结束日期
|
|
1988
|
+
:return: None
|
|
1989
|
+
"""
|
|
1990
|
+
|
|
1991
|
+
self._get_twap_validate_date_type(start_date, "start_date")
|
|
1992
|
+
self._get_twap_validate_date_type(end_date, "end_date")
|
|
1993
|
+
|
|
1994
|
+
def _get_twap_validate_date_type(self, date_str, date_str_name):
|
|
1995
|
+
"""
|
|
1996
|
+
校验date_str参数类型是否为datetime格式的字符串
|
|
1997
|
+
:param date_str: str, 日期
|
|
1998
|
+
:return: None
|
|
1999
|
+
"""
|
|
2000
|
+
|
|
2001
|
+
if isinstance(date_str, str) and not self.general_validate_date_str_is_datetime_type(date_str):
|
|
2002
|
+
raise ValueError(f"{date_str_name} type error, datetime.datetime type or can be converted to the type")
|
|
2003
|
+
if not isinstance(date_str, str) and not isinstance(date_str, datetime.datetime):
|
|
2004
|
+
raise ValueError(f"{date_str_name} type error, datetime.datetime type or can be converted to the type")
|
|
2005
|
+
|
|
2006
|
+
def _get_twap_date_conversion(self, date_str):
|
|
2007
|
+
"""
|
|
2008
|
+
将日期字符串转换成对应格式的日期数据
|
|
2009
|
+
:param date_str: 日期字符串
|
|
2010
|
+
:return: 转换后的日期数据
|
|
2011
|
+
"""
|
|
2012
|
+
|
|
2013
|
+
if isinstance(date_str, str):
|
|
2014
|
+
if self.general_validate_date_str_is_datetime_type(date_str):
|
|
2015
|
+
return self.general_date_str_to_datetime(date_str)
|
|
2016
|
+
if self.general_validate_date_str_is_date_type(date_str):
|
|
2017
|
+
return self.general_date_str_to_date(date_str).date()
|
|
2018
|
+
|
|
2019
|
+
return date_str
|
|
2020
|
+
|
|
2021
|
+
def get_twap_filter_by_date(self, start_date, end_date):
|
|
2022
|
+
"""
|
|
2023
|
+
校验start_date和end_date参数类型是否为str格式的字符串
|
|
2024
|
+
:param start_date: str, 开始日期
|
|
2025
|
+
:param end_date: str, 结束日期
|
|
2026
|
+
:return: None
|
|
2027
|
+
"""
|
|
2028
|
+
|
|
2029
|
+
start_date = self._get_twap_date_conversion(start_date)
|
|
2030
|
+
end_date = self._get_twap_date_conversion(end_date)
|
|
2031
|
+
|
|
2032
|
+
self.get_twap_data = self.get_twap_data[
|
|
2033
|
+
(self.get_twap_data['datetime'] >= start_date) & (self.get_twap_data['datetime'] <= end_date)]
|
|
2034
|
+
|
|
2035
|
+
def get_twap_validate_frequency(self, frequency):
|
|
2036
|
+
"""
|
|
2037
|
+
校验frequency参数类型是否为str格式的字符串
|
|
2038
|
+
:param frequency: str, 历史数据的频率
|
|
2039
|
+
:return: None
|
|
2040
|
+
"""
|
|
2041
|
+
|
|
2042
|
+
self.general_validate_param_is_str("frequency", frequency)
|
|
2043
|
+
|
|
2044
|
+
def get_twap_get_data_by_frequency(self, order_book_ids, frequency, start_date, end_date):
|
|
2045
|
+
"""
|
|
2046
|
+
根据频率获取数据
|
|
2047
|
+
|
|
2048
|
+
:param order_book_ids: str, 合约代码
|
|
2049
|
+
:param frequency: str, 历史数据的频率
|
|
2050
|
+
:param start_date: str, 开始日期
|
|
2051
|
+
:param end_date: str, 结束日期
|
|
2052
|
+
:return: None
|
|
2053
|
+
"""
|
|
2054
|
+
|
|
2055
|
+
frequency_date_format_dict = {
|
|
2056
|
+
"1m": "%Y-%m-%d %H:%M:%S",
|
|
2057
|
+
"1d": "%Y-%m-%d"
|
|
2058
|
+
}
|
|
2059
|
+
result = rq.get_price(order_book_ids, start_date=start_date, end_date=end_date, frequency=frequency)
|
|
2060
|
+
|
|
2061
|
+
result = self.get_twap_compute_value(result)
|
|
2062
|
+
|
|
2063
|
+
# 根据频率设置返回值的日期格式,1m为"%Y-%m-%d %H:%M:%S", 1d为"%Y-%m-%d"
|
|
2064
|
+
result["datetime"] = pd.to_datetime(result["datetime"], format=frequency_date_format_dict[frequency])
|
|
2065
|
+
self.get_twap_data = result
|
|
2066
|
+
|
|
2067
|
+
@staticmethod
|
|
2068
|
+
def get_twap_compute_value(df):
|
|
2069
|
+
"""
|
|
2070
|
+
此方法用于按照规则计算twap_value的值
|
|
2071
|
+
twap计算数据来源:米筐原始历史tick数据(需要根据下述逻辑合成)
|
|
2072
|
+
举例;2024-05-20 09:31:00的twap行情为2024-05-20【 09:30:00, 09:31:00)时间段内所有tick数据的最新价相加之和/tick数据的个数。
|
|
2073
|
+
"""
|
|
2074
|
+
|
|
2075
|
+
df["before_datetime"] = df['datetime'] - datetime.timedelta(minutes=1)
|
|
2076
|
+
|
|
2077
|
+
# 使用 apply 函数计算每行的 twap_value 列
|
|
2078
|
+
df['twap_value'] = df.apply(
|
|
2079
|
+
lambda row: df[(df['datetime'] >= row['before_datetime']) & (df['datetime'] <= row['datetime'])][
|
|
2080
|
+
'last'].mean(),
|
|
2081
|
+
axis=1)
|
|
2082
|
+
|
|
2083
|
+
return df
|
|
@@ -5,7 +5,7 @@ with open('description_info.md', 'r', encoding='utf-8') as f:
|
|
|
5
5
|
|
|
6
6
|
setup(
|
|
7
7
|
name='gjdatac_api', # 你的包名
|
|
8
|
-
version='0.0.
|
|
8
|
+
version='0.0.6', # 版本号
|
|
9
9
|
description='主动管理项目第一版(部分接口)', # 包的简要描述
|
|
10
10
|
long_description=long_description, # 包的详细描述
|
|
11
11
|
long_description_content_type='text/markdown', # 描述文件的类型
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|