hyperquant 1.48__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of hyperquant might be problematic. Click here for more details.

Files changed (42) hide show
  1. hyperquant/__init__.py +8 -0
  2. hyperquant/broker/auth.py +972 -0
  3. hyperquant/broker/bitget.py +311 -0
  4. hyperquant/broker/bitmart.py +720 -0
  5. hyperquant/broker/coinw.py +487 -0
  6. hyperquant/broker/deepcoin.py +651 -0
  7. hyperquant/broker/edgex.py +500 -0
  8. hyperquant/broker/hyperliquid.py +570 -0
  9. hyperquant/broker/lbank.py +661 -0
  10. hyperquant/broker/lib/edgex_sign.py +455 -0
  11. hyperquant/broker/lib/hpstore.py +252 -0
  12. hyperquant/broker/lib/hyper_types.py +48 -0
  13. hyperquant/broker/lib/polymarket/ctfAbi.py +721 -0
  14. hyperquant/broker/lib/polymarket/safeAbi.py +1138 -0
  15. hyperquant/broker/lib/util.py +22 -0
  16. hyperquant/broker/lighter.py +679 -0
  17. hyperquant/broker/models/apexpro.py +150 -0
  18. hyperquant/broker/models/bitget.py +359 -0
  19. hyperquant/broker/models/bitmart.py +635 -0
  20. hyperquant/broker/models/coinw.py +724 -0
  21. hyperquant/broker/models/deepcoin.py +809 -0
  22. hyperquant/broker/models/edgex.py +1053 -0
  23. hyperquant/broker/models/hyperliquid.py +284 -0
  24. hyperquant/broker/models/lbank.py +557 -0
  25. hyperquant/broker/models/lighter.py +868 -0
  26. hyperquant/broker/models/ourbit.py +1155 -0
  27. hyperquant/broker/models/polymarket.py +1071 -0
  28. hyperquant/broker/ourbit.py +550 -0
  29. hyperquant/broker/polymarket.py +2399 -0
  30. hyperquant/broker/ws.py +132 -0
  31. hyperquant/core.py +513 -0
  32. hyperquant/datavison/_util.py +18 -0
  33. hyperquant/datavison/binance.py +111 -0
  34. hyperquant/datavison/coinglass.py +237 -0
  35. hyperquant/datavison/okx.py +177 -0
  36. hyperquant/db.py +191 -0
  37. hyperquant/draw.py +1200 -0
  38. hyperquant/logkit.py +205 -0
  39. hyperquant/notikit.py +124 -0
  40. hyperquant-1.48.dist-info/METADATA +32 -0
  41. hyperquant-1.48.dist-info/RECORD +42 -0
  42. hyperquant-1.48.dist-info/WHEEL +4 -0
hyperquant/logkit.py ADDED
@@ -0,0 +1,205 @@
1
+ import logging
2
+ import sys
3
+ import unicodedata
4
+ from datetime import datetime
5
+ from zoneinfo import ZoneInfo
6
+ from colorama import Fore, Style, init
7
+ import os
8
+ import traceback
9
+
10
+ init(autoreset=True)
11
+
12
+ # ====================================================================================================
13
+ # ** 添加ok的日志级别 **
14
+ # 给默认的logging模块,添加一个用于表达成功的级别
15
+ # ====================================================================================================
16
+ OK_LEVEL = 25
17
+ logging.addLevelName(OK_LEVEL, "OK")
18
+
19
+ def ok(self, message, *args, **kwargs):
20
+ if self.isEnabledFor(OK_LEVEL):
21
+ self._log(OK_LEVEL, message, args, **kwargs)
22
+
23
+ logging.Logger.ok = ok
24
+
25
+ # ====================================================================================================
26
+ # ** 辅助函数 **
27
+ # - get_display_width(): 获取文本的显示宽度,中文字符算作1.685个宽度单位,以尽量保持显示居中
28
+ # ====================================================================================================
29
+ def get_display_width(text: str) -> int:
30
+ width = 0
31
+ for char in text:
32
+ if unicodedata.east_asian_width(char) in ('F', 'W', 'A'):
33
+ width += 1.685
34
+ else:
35
+ width += 1
36
+ return int(width)
37
+
38
+ # ====================================================================================================
39
+ # ** 自定义Logger类封装所有功能 **
40
+ # ====================================================================================================
41
+ class Logger:
42
+ OK_LEVEL = 25
43
+ FORMATS = {
44
+ logging.DEBUG: ('', ''),
45
+ logging.INFO: (Fore.BLUE, "🔵 "),
46
+ logging.WARNING: (Fore.YELLOW, "🔔 "),
47
+ logging.ERROR: (Fore.RED, "❌ "),
48
+ logging.CRITICAL: (Fore.RED + Style.BRIGHT, "⭕ "),
49
+ OK_LEVEL: (Fore.GREEN, "✅ "),
50
+ }
51
+
52
+ def __init__(self, name='Log', show_time=False, use_color=True, timezone="Asia/Shanghai"):
53
+ # 设置日志级别
54
+ self.logger = logging.getLogger(name)
55
+ self.logger.setLevel(logging.DEBUG)
56
+ self.show_time = show_time
57
+ self.timezone = timezone # 新增时区配置
58
+
59
+ # 如果已存在 handlers,先清理
60
+ if self.logger.hasHandlers():
61
+ self.logger.handlers.clear()
62
+
63
+ # 控制台输出 handler
64
+ console_handler = MinConsoleHandler(sys.stdout)
65
+ console_handler.setFormatter(MinFormatter(use_color=use_color, show_time=show_time, timezone=timezone))
66
+ self.logger.addHandler(console_handler)
67
+
68
+ # 禁用传播到根日志记录器
69
+ self.logger.propagate = False
70
+
71
+ def divider(self, name='', sep='=', display_time=True):
72
+ """打印带时间戳的分割线"""
73
+ seperator_len = 72
74
+ now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
75
+ middle = f' {name} {now} ' if display_time else f' {name} '
76
+ middle_width = get_display_width(middle)
77
+ decoration_count = max(4, (seperator_len - middle_width) // 2)
78
+ line = sep * decoration_count + middle + sep * decoration_count
79
+
80
+ if get_display_width(line) < seperator_len:
81
+ line += sep
82
+
83
+ self.logger.debug(line)
84
+
85
+ def get_logger(self):
86
+ """返回 logger 实例"""
87
+ return self.logger
88
+
89
+ # 为各个日志级别创建方法,便于编辑器提示
90
+ def ok(self, message, *args, **kwargs):
91
+ return self.logger.ok(message, *args, **kwargs)
92
+
93
+ def info(self, message, *args, **kwargs):
94
+ return self.logger.info(message, *args, **kwargs)
95
+
96
+ def debug(self, message, *args, **kwargs):
97
+ return self.logger.debug(message, *args, **kwargs)
98
+
99
+ def warning(self, message, *args, **kwargs):
100
+ return self.logger.warning(message, *args, **kwargs)
101
+
102
+ def error(self, message, *args, **kwargs):
103
+ return self.logger.error(message, *args, **kwargs)
104
+
105
+ def critical(self, message, *args, **kwargs):
106
+ return self.logger.critical(message, *args, **kwargs)
107
+
108
+ def exception(self, message, *args, **kwargs):
109
+ return self.logger.exception(message, *args, **kwargs)
110
+
111
+ class MinFormatter(logging.Formatter):
112
+ def __init__(self, use_color=True, show_time=False, timezone="Asia/Shanghai"):
113
+ super().__init__("%(message)s")
114
+ self.use_color = use_color
115
+ self.show_time = show_time
116
+ self.timezone = timezone # 新增时区配置
117
+
118
+ def format(self, record):
119
+ original_message = record.getMessage()
120
+
121
+ # 使用配置的时区
122
+ local_tz = ZoneInfo(self.timezone)
123
+ timestamp = f"[{datetime.now(local_tz).strftime('%Y-%m-%d %H:%M:%S')}] " if self.show_time else ""
124
+
125
+ if self.use_color:
126
+ color, prefix = Logger.FORMATS.get(record.levelno, ('', ''))
127
+ formatted_message = f"{timestamp}{color}{prefix}{original_message}{Style.RESET_ALL}"
128
+ else:
129
+ _, prefix = Logger.FORMATS.get(record.levelno, ('', ''))
130
+ formatted_message = f"{timestamp}{prefix}{original_message}"
131
+
132
+ # 添加异常信息
133
+ if record.exc_info:
134
+ exc_text = ''.join(traceback.format_exception(*record.exc_info))
135
+ formatted_message += f"\n{Fore.RED}{exc_text}{Style.RESET_ALL}" if self.use_color else f"\n{exc_text}"
136
+
137
+ return formatted_message
138
+
139
+ class MinConsoleHandler(logging.StreamHandler):
140
+ def emit(self, record):
141
+ if record.levelno == logging.DEBUG:
142
+ print(self.format(record), flush=True)
143
+ elif record.levelno == Logger.OK_LEVEL:
144
+ super().emit(record)
145
+ print()
146
+ else:
147
+ super().emit(record)
148
+
149
+ # ====================================================================================================
150
+ # ** NullLogger 类,用于禁用日志 **
151
+ # ====================================================================================================
152
+ class NullLogger:
153
+ def debug(self, *a, **k): pass
154
+ def info(self, *a, **k): pass
155
+ def ok(self, *a, **k): pass
156
+ def warning(self, *a, **k): pass
157
+ def error(self, *a, **k): pass
158
+ def critical(self, *a, **k): pass
159
+ def exception(self, *a, **k): pass
160
+ def divider(self, *a, **k): pass
161
+
162
+ # ====================================================================================================
163
+ # ** 功能函数 **
164
+ # ====================================================================================================
165
+ def get_logger(name=None, file_path=None, show_time=False, use_color=True, timezone="Asia/Shanghai", level: object = None, enable_console: bool = True, enabled: bool = True):
166
+ if not enabled:
167
+ return NullLogger()
168
+ if name is None:
169
+ name = '_'
170
+ logger_instance = Logger(name, show_time, use_color, timezone) # 传递时区参数
171
+ if file_path:
172
+ # 如果目录不存在,创建目录
173
+ os.makedirs(os.path.dirname(file_path), exist_ok=True)
174
+ add_file_handler(logger_instance.get_logger(), file_path, show_time, timezone)
175
+ return logger_instance
176
+
177
+ def add_file_handler(logger: logging.Logger, path: str, show_time=False, timezone="Asia/Shanghai"):
178
+ # 添加文件日志输出,启用时间戳
179
+ file_handler = logging.FileHandler(path)
180
+ file_handler.setFormatter(MinFormatter(use_color=False, show_time=show_time, timezone=timezone)) # 传递时区参数
181
+ logger.addHandler(file_handler)
182
+
183
+ # ====================================================================================================
184
+ # ** 示例使用 **
185
+ # ====================================================================================================
186
+ if __name__ == '__main__':
187
+ # 获取日志对象
188
+ logger = get_logger('xx', 'logs/application.log', show_time=True, use_color=True) # This will use Logger
189
+
190
+ # 输出日志信息
191
+ logger.debug("调试信息,没有标记和颜色,等同于print")
192
+ logger.info("提示信息,蓝色的,可以记录一些中间结果")
193
+ logger.ok("完成提示,绿色的,通常表示成功和完成")
194
+ logger.warning("警告信息,黄色的,通常表示警告")
195
+ logger.error("错误信息,红色的,通常是报错的相关提示")
196
+ logger.critical("重要提示,深红色。通常是非常关键的信息")
197
+
198
+ # 使用 divider 方法
199
+ logger.divider("这是一个分割线", sep='*', display_time=True)
200
+
201
+ # 触发一个异常
202
+ try:
203
+ 1 / 0
204
+ except Exception:
205
+ logger.exception("捕获到一个异常,程序将继续运行。")
hyperquant/notikit.py ADDED
@@ -0,0 +1,124 @@
1
+ """
2
+ 通知类的功能简单封装,非必要别修改 :)
3
+ 只要知道怎么使用以下函数:
4
+ - send_wecom_msg
5
+ - send_wecom_img
6
+
7
+ Binance期现套利 | 邢不行 | 2024分享会
8
+ author: 邢不行
9
+ 微信: xbx6660
10
+ """
11
+ import base64
12
+ import hashlib
13
+ import os.path
14
+ import json
15
+ import traceback
16
+ import aiohttp
17
+ import asyncio
18
+ from datetime import datetime
19
+
20
+ from hyperquant.logkit import get_logger
21
+ logger = get_logger('notikit', './data/logs/notikit.log', show_time=True)
22
+
23
+
24
+
25
+ proxy = {}
26
+
27
+
28
+ def handle_exception(e: Exception, msg: str = '') -> None:
29
+ logger.error(f"{msg}:{e}")
30
+ logger.error(e)
31
+ logger.error(traceback.format_exc())
32
+
33
+
34
+ # 企业微信通知
35
+ async def send_wecom_msg(content: str, webhook_url: str) -> None:
36
+ if not webhook_url:
37
+ logger.warning('未配置wecom_webhook_url,不发送信息')
38
+ return
39
+ if not content:
40
+ logger.warning('未配置content,不发送信息')
41
+ return
42
+
43
+ try:
44
+ data = {
45
+ "msgtype": "text",
46
+ "text": {
47
+ "content": content + '\n' + datetime.now().strftime("%Y-%m-%d %H:%M:%S")
48
+ }
49
+ }
50
+
51
+ async with aiohttp.ClientSession() as session:
52
+ async with session.post(
53
+ webhook_url,
54
+ json=data,
55
+ proxy=proxy.get('http') if proxy else None,
56
+ timeout=aiohttp.ClientTimeout(total=10)
57
+ ) as response:
58
+ result = await response.text()
59
+ logger.info(f'调用企业微信接口返回: {result}')
60
+ logger.ok('成功发送企业微信')
61
+ except Exception as e:
62
+ handle_exception(e, '发送企业微信失败')
63
+
64
+
65
+ # 上传图片,解析bytes
66
+ class MyEncoder(json.JSONEncoder):
67
+ def default(self, obj):
68
+ """
69
+ 只要检查到了是bytes类型的数据就把它转为str类型
70
+ :param obj:
71
+ :return:
72
+ """
73
+ if isinstance(obj, bytes):
74
+ return str(obj, encoding='utf-8')
75
+ return json.JSONEncoder.default(self, obj)
76
+
77
+
78
+ # 企业微信发送图片
79
+ async def send_wecom_img(file_path: str, webhook_url: str) -> None:
80
+ """
81
+ 企业微信发送图片
82
+ :param file_path: 图片地址
83
+ :param webhook_url: 企业微信webhook网址
84
+ :return:
85
+ """
86
+ if not os.path.exists(file_path):
87
+ logger.warning('找不到图片')
88
+ return
89
+ if not webhook_url:
90
+ logger.warning('未配置wecom_webhook_url,不发送信息')
91
+ return
92
+
93
+ try:
94
+ with open(file_path, 'rb') as f:
95
+ image_content = f.read()
96
+
97
+ image_base64 = base64.b64encode(image_content).decode('utf-8')
98
+ md5 = hashlib.md5()
99
+ md5.update(image_content)
100
+ image_md5 = md5.hexdigest()
101
+
102
+ data = {
103
+ 'msgtype': 'image',
104
+ 'image': {
105
+ 'base64': image_base64,
106
+ 'md5': image_md5
107
+ }
108
+ }
109
+
110
+ async with aiohttp.ClientSession() as session:
111
+ async with session.post(
112
+ webhook_url,
113
+ json=data,
114
+ proxy=proxy.get('http') if proxy else None,
115
+ timeout=aiohttp.ClientTimeout(total=10)
116
+ ) as response:
117
+ result = await response.text()
118
+ logger.info(f'调用企业微信接口返回: {result}')
119
+ logger.ok('成功发送企业微信图片')
120
+ except Exception as e:
121
+ handle_exception(e, '发送企业微信图片失败')
122
+ finally:
123
+ if os.path.exists(file_path):
124
+ os.remove(file_path)
@@ -0,0 +1,32 @@
1
+ Metadata-Version: 2.4
2
+ Name: hyperquant
3
+ Version: 1.48
4
+ Summary: A minimal yet hyper-efficient backtesting framework for quantitative trading
5
+ Project-URL: Homepage, https://github.com/yourusername/hyperquant
6
+ Project-URL: Issues, https://github.com/yourusername/hyperquant/issues
7
+ Author-email: MissinA <1421329142@qq.com>
8
+ License: MIT
9
+ Keywords: backtesting,hyperquant,quant,trading
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Topic :: Office/Business :: Financial :: Investment
15
+ Requires-Python: >=3.13
16
+ Requires-Dist: aiohttp>=3.13
17
+ Requires-Dist: coincurve>=21.0.0
18
+ Requires-Dist: colorama>=0.4.6
19
+ Requires-Dist: cryptography>=44.0.2
20
+ Requires-Dist: duckdb>=1.2.2
21
+ Requires-Dist: eth-account>=0.10.0
22
+ Requires-Dist: numpy>=1.21.0
23
+ Requires-Dist: pandas>=2.2.3
24
+ Requires-Dist: pybotters>=1.10
25
+ Requires-Dist: pyecharts>=2.0.8
26
+ Requires-Dist: python-dotenv>=1.2.1
27
+ Requires-Dist: web3>=7.14.0
28
+ Description-Content-Type: text/markdown
29
+
30
+ # hyperquant
31
+
32
+ hyperquant is a minimalistic framework for quantitative trading strategies. It allows users to quickly validate their strategy ideas with ease and efficiency.
@@ -0,0 +1,42 @@
1
+ hyperquant/__init__.py,sha256=UpjiX4LS5jmrBc2kE8RiLR02eCfD8JDQrR1q8zkLNcQ,161
2
+ hyperquant/core.py,sha256=RzRFbyImqzBiaA-9lQzvxPfxwcOvScdABZviS4y0kqM,20783
3
+ hyperquant/db.py,sha256=i2TjkCbmH4Uxo7UTDvOYBfy973gLcGexdzuT_YcSeIE,6678
4
+ hyperquant/draw.py,sha256=up_lQ3pHeVLoNOyh9vPjgNwjD0M-6_IetSGviQUgjhY,54624
5
+ hyperquant/logkit.py,sha256=nUo7nx5eONvK39GOhWwS41zNRL756P2J7-5xGzwXnTY,8462
6
+ hyperquant/notikit.py,sha256=x5yAZ_tAvLQRXcRbcg-VabCaN45LUhvlTZnUqkIqfAA,3596
7
+ hyperquant/broker/auth.py,sha256=JVv04m-Z2fnM0Fds-nRjbVEXMnf-JrK7sk2URvUMsC4,37102
8
+ hyperquant/broker/bitget.py,sha256=X_S0LKZ7FZAEb6oEMr1vdGP1fondzK74BhmNTpRDSEA,9488
9
+ hyperquant/broker/bitmart.py,sha256=7j_8TU3Dxjj5HCNX7CbSO3nPZcQH1t31A9UOv5tTbg0,25974
10
+ hyperquant/broker/coinw.py,sha256=SnJU0vASh77rfcpMGWaIfTblQSjQk3vjlW_4juYdbcs,17214
11
+ hyperquant/broker/deepcoin.py,sha256=DdXQRuL1m0FeFRmGVC3hvQLXXXaDOsXK-p2zZoFWODE,22997
12
+ hyperquant/broker/edgex.py,sha256=TqUO2KRPLN_UaxvtLL6HnA9dAQXC1sGxOfqTHd6W5k8,18378
13
+ hyperquant/broker/hyperliquid.py,sha256=7MxbI9OyIBcImDelPJu-8Nd53WXjxPB5TwE6gsjHbto,23252
14
+ hyperquant/broker/lbank.py,sha256=98M5wmSoeHwbBYMA3rh25zqLb6fQKVaEmwqALF5nOvY,22181
15
+ hyperquant/broker/lighter.py,sha256=xyF967a-AwzecJ9qRPatxEzqis-J8dKQB6Xh1deR9Vc,25611
16
+ hyperquant/broker/ourbit.py,sha256=NUcDSIttf-HGWzoW1uBTrGLPHlkuemMjYCm91MigTno,18228
17
+ hyperquant/broker/polymarket.py,sha256=Js6_joi00144uS9J7uz44S4PpETyH7a85Dm9rNf-YmU,90516
18
+ hyperquant/broker/ws.py,sha256=3r8PGxR_1IflcY8fXc4EWwG7LWo_ylVXFFDZIPrXllM,4704
19
+ hyperquant/broker/lib/edgex_sign.py,sha256=lLUCmY8HHRLfLKyGrlTJYaBlSHPsIMWg3EZnQJKcmyk,95785
20
+ hyperquant/broker/lib/hpstore.py,sha256=LnLK2zmnwVvhEbLzYI-jz_SfYpO1Dv2u2cJaRAb84D8,8296
21
+ hyperquant/broker/lib/hyper_types.py,sha256=HqjjzjUekldjEeVn6hxiWA8nevAViC2xHADOzDz9qyw,991
22
+ hyperquant/broker/lib/util.py,sha256=iMU1qF0CHj5zzlIMEQGwjz-qtEVosEe7slXOCuB7Rcw,566
23
+ hyperquant/broker/lib/polymarket/ctfAbi.py,sha256=E6cdz5tQpfoz8qmLZ4_nmzqsodiPzLZ45RDpMw_PmqU,15004
24
+ hyperquant/broker/lib/polymarket/safeAbi.py,sha256=oenPmWl8rK_153ItkNAPmPhlKwivCAGL-cmUQVD7HDc,24373
25
+ hyperquant/broker/models/apexpro.py,sha256=fJvMTXHJFQqhDtQ4qWi3WKYexCWIYRRKy-tEtvkl2vY,4197
26
+ hyperquant/broker/models/bitget.py,sha256=0RwDY75KrJb-c-oYoMxbqxWfsILe-n_Npojz4UFUq7c,11389
27
+ hyperquant/broker/models/bitmart.py,sha256=O9RnU-XBeR9SzicG15jzuzK5oy2kMrRJAyZSqC8DXUw,21938
28
+ hyperquant/broker/models/coinw.py,sha256=LvLMVP7i-qkkTK1ubw8eBkMK2RQmFoKPxdKqmC4IToY,22157
29
+ hyperquant/broker/models/deepcoin.py,sha256=6JlCWpK9UOYlfyinR5REpWqFqJCzydnD7pS8nRjy06s,25692
30
+ hyperquant/broker/models/edgex.py,sha256=vPAkceal44cjTYKQ_0BoNAskOpmkno_Yo1KxgMLPc6Y,33954
31
+ hyperquant/broker/models/hyperliquid.py,sha256=c4r5739ibZfnk69RxPjQl902AVuUOwT8RNvKsMtwXBY,9459
32
+ hyperquant/broker/models/lbank.py,sha256=vHkNKxIMzpoC_EwcZnEOPOupizF92yGWi9GKxvYYFUQ,19181
33
+ hyperquant/broker/models/lighter.py,sha256=I6hjM0of8NLtjSmI6OlbJlvpYDDswLn9yyQLz0I1Mes,30495
34
+ hyperquant/broker/models/ourbit.py,sha256=xMcbuCEXd3XOpPBq0RYF2zpTFNnxPtuNJZCexMZVZ1k,41965
35
+ hyperquant/broker/models/polymarket.py,sha256=d3XD1RUeiMjV8ru0wCY1Uv6JIjmnfTG_mqeXapGpJ2g,38372
36
+ hyperquant/datavison/_util.py,sha256=92qk4vO856RqycO0YqEIHJlEg-W9XKapDVqAMxe6rbw,533
37
+ hyperquant/datavison/binance.py,sha256=3yNKTqvt_vUQcxzeX4ocMsI5k6Q6gLZrvgXxAEad6Kc,5001
38
+ hyperquant/datavison/coinglass.py,sha256=PEjdjISP9QUKD_xzXNzhJ9WFDTlkBrRQlVL-5pxD5mo,10482
39
+ hyperquant/datavison/okx.py,sha256=yg8WrdQ7wgWHNAInIgsWPM47N3Wkfr253169IPAycAY,6898
40
+ hyperquant-1.48.dist-info/METADATA,sha256=xYfb3OlarL3T3kh7rlNVcztVmrdpcqFtKN5Xz7mPNW4,1245
41
+ hyperquant-1.48.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
42
+ hyperquant-1.48.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any