pyqqq 0.12.181__py3-none-any.whl → 0.12.182__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.
pyqqq/backtest/broker.py CHANGED
@@ -355,7 +355,7 @@ class TradingBroker(BaseBroker):
355
355
 
356
356
  def get_positions(self):
357
357
  """
358
- 포지션 조회 (단, NXT 프리마켓, 애프터마켓에서 현재 가격은 NXT 가격으로 조회되지 않음)
358
+ 포지션 조회 (NXT 가격 반영됨)
359
359
  """
360
360
  return self.trading_api.get_positions()
361
361
 
pyqqq/data/minutes.py CHANGED
@@ -29,6 +29,9 @@ def get_all_minute_data(
29
29
 
30
30
  NXT 거래소 데이터의 조회 가능 시작일은 데이터 소스에 따라 다릅니다. kis는 2025년 3월 4일부터, ebest는 2025년 5월 12일부터 데이터를 조회할 수 있습니다.
31
31
 
32
+ Note:
33
+ - KRX, NXT 거래소의 분봉 데이터를 조회할 수 있습니다. UN 거래소는 지원되지 않습니다.
34
+
32
35
  Args:
33
36
  time (datetime.datetime): 조회할 시간
34
37
  source (str): 데이터를 검색할 API. 'ebest' 또는 'kis'를 지정할 수 있습니다. 기본값은 'kis'입니다.
@@ -63,6 +66,9 @@ def get_all_minute_data(
63
66
  - mdvolumetm (int): 시간별매도체결량
64
67
  - msvolumetm (int): 시간별매수체결량
65
68
 
69
+ Raises:
70
+ ValueError: 지원하지 않는 거래소 코드가 전달된 경우.
71
+
66
72
  Examples:
67
73
  >>> df = get_all_minute_data(datetime.datetime(2024, 5, 2, 15, 30))
68
74
  >>> print(df)
@@ -77,7 +83,10 @@ def get_all_minute_data(
77
83
  [5 rows x 23 columns]
78
84
  """
79
85
  tz = pytz.timezone("Asia/Seoul")
86
+
80
87
  exchange = DataExchange.validate(exchange)
88
+ if exchange == DataExchange.UN:
89
+ raise ValueError("UN 거래소는 지원되지 않습니다.")
81
90
 
82
91
  url = f"{c.PYQQQ_API_URL}/domestic-stock/ohlcv/minutes/all/{time.date()}/{time.strftime('%H%M')}"
83
92
  params = {
@@ -142,6 +151,9 @@ def get_all_day_data(
142
151
 
143
152
  NXT 거래소 데이터의 조회 가능 시작일은 데이터 소스에 따라 다릅니다. kis는 2025년 3월 4일부터, ebest는 2025년 5월 12일부터 데이터를 조회할 수 있습니다.
144
153
 
154
+ Note:
155
+ - KRX, NXT 거래소의 분봉 데이터를 조회할 수 있습니다. UN 거래소는 지원되지 않습니다.
156
+
145
157
  Args:
146
158
  date (datetime.date): 데이터를 검색할 날짜.
147
159
  codes (list[str]): 조회할 주식 코드들의 리스트. 최대 20개까지 지정할 수 있습니다.
@@ -195,6 +207,7 @@ def get_all_day_data(
195
207
  2024-04-26 09:04:00 77400 77600 77400 77500 3268502 2 1200 1.57
196
208
  """
197
209
  assert isinstance(date, datetime.date), "date must be a datetime.date object"
210
+ assert type(date) is datetime.date, "date must be a datetime.date object"
198
211
  assert isinstance(codes, list) or isinstance(codes, str), "codes must be a list of strings or single code"
199
212
 
200
213
  if isinstance(codes, list):
@@ -210,7 +223,9 @@ def get_all_day_data(
210
223
  target_codes = codes if isinstance(codes, list) else [codes]
211
224
 
212
225
  exchange = DataExchange.validate(exchange)
213
- if exchange == DataExchange.NXT or source == "kis":
226
+ if exchange == DataExchange.UN:
227
+ raise ValueError("UN 거래소는 지원되지 않습니다.")
228
+ elif exchange == DataExchange.NXT or source == "kis":
214
229
  url = f"{c.PYQQQ_API_URL}/domestic-stock/ohlcv/minutes/{date}"
215
230
  else:
216
231
  url = f"{c.PYQQQ_API_URL}/domestic-stock/ohlcv/half-minutes/{date}"
pyqqq/data/realtime.py CHANGED
@@ -3,11 +3,12 @@ import datetime as dtm
3
3
  import inspect
4
4
  import json
5
5
  import os
6
- from typing import List
6
+ from typing import List, Union
7
7
 
8
8
  import websockets
9
9
 
10
10
  import pyqqq.config as c
11
+ from pyqqq.datatypes import DataExchange
11
12
  from pyqqq.utils.api_client import raise_for_status, send_request
12
13
  from pyqqq.utils.logger import get_logger
13
14
  from pyqqq.utils.singleton import singleton
@@ -15,10 +16,16 @@ from pyqqq.utils.singleton import singleton
15
16
  logger = get_logger(__name__)
16
17
 
17
18
 
18
- def get_all_last_trades(codes: List[str] = None, exchange: str = "KRX"):
19
+ def get_all_last_trades(
20
+ codes: List[str] = None,
21
+ exchange: Union[str, DataExchange] = "KRX",
22
+ ):
19
23
  """
20
24
  모든 종목의 최근 체결 정보를 반환합니다.
21
25
 
26
+ Note:
27
+ - KRX, UN 거래소의 최근 체결 정보를 조회할 수 있습니다. NXT 거래소는 지원되지 않습니다.
28
+
22
29
  Args:
23
30
  codes (List[str], optional): 종목 코드 리스트. 모든 종목의 체결 정보를 반환하려면 None을 전달합니다.
24
31
  exchange (str): 거래소. 기본값은 "KRX"입니다. 지원하는 거래소는 "KRX", "UN" 입니다.
@@ -50,9 +57,15 @@ def get_all_last_trades(codes: List[str] = None, exchange: str = "KRX"):
50
57
  - exchname (str): 거래소명
51
58
  - date (str): 체결일자
52
59
  - update_time (str): 업데이트 시간
60
+
61
+ Raises:
62
+ ValueError: 지원하지 않는 거래소 코드가 전달된 경우.
53
63
  """
64
+ exchange = DataExchange.validate(exchange)
65
+ if exchange == DataExchange.NXT:
66
+ raise ValueError("NXT 거래소는 지원되지 않습니다.")
54
67
 
55
- params = {"exchange": exchange}
68
+ params = {"exchange": exchange.value}
56
69
  if codes:
57
70
  params["codes"] = ",".join(codes) if isinstance(codes, list) else codes
58
71
 
@@ -137,6 +137,9 @@ def is_trading_time(
137
137
  Returns:
138
138
  bool: 거래 시간 여부
139
139
  """
140
+ if now is None:
141
+ now = datetime.datetime.now()
142
+
140
143
  exchange = _validate_exchange(exchange)
141
144
  if exchange == Exchange.NXT and now.date() < datetime.date(2025, 3, 4):
142
145
  raise ValueError("NXT 거래소는 2025년 3월 4일 부터 운영되었습니다. 이전 날짜는 지원하지 않습니다.")
@@ -170,7 +173,7 @@ def get_market_schedule(
170
173
  return _get_krx_schedule(date)
171
174
 
172
175
 
173
- @ttl_cache(maxsize=1, ttl=60)
176
+ @ttl_cache(maxsize=10, ttl=3600)
174
177
  def _get_nyse_schedule(date: datetime.date) -> MarketSchedule:
175
178
  """NYSE 시장 스케줄을 조회합니다."""
176
179
  cal = mcal.get_calendar("NYSE")
@@ -338,7 +341,7 @@ def get_trading_day_with_offset(from_date: Optional[datetime.date] = None, offse
338
341
  return offset_date
339
342
 
340
343
 
341
- @ttl_cache(maxsize=1, ttl=60)
344
+ @ttl_cache(maxsize=10, ttl=3600)
342
345
  def _fetch_market_scheldue(date: datetime.date, exchange: str) -> requests.Response | None:
343
346
  url = f"{c.PYQQQ_API_URL}/domestic-stock/market-schedules/{exchange}"
344
347
  params = {"date": date}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyqqq
3
- Version: 0.12.181
3
+ Version: 0.12.182
4
4
  Summary: Package for quantitative strategy development on the PyQQQ platform
5
5
  License: MIT
6
6
  Author: PyQQQ team
@@ -5,7 +5,7 @@ pyqqq/ai/domestic.py,sha256=FiJNInRlhcnxG7Jxmz2hDvaLhS8_jn-JFpQMze8Ch9s,1888
5
5
  pyqqq/ai/market_schedule.py,sha256=8HiivwC-xI2EKr8lXS_g4mTj2LYpCQ2QfZsJmIq61O0,818
6
6
  pyqqq/ai/minute.py,sha256=C0sTVkBY4-Vuj8Q9VZ7d9kZYAv963FUX4k3vIvhetng,1754
7
7
  pyqqq/backtest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- pyqqq/backtest/broker.py,sha256=MFQsJnu0dYW799YEcAnMS3Q0DUMWbHcnsgkl8fSRfdc,69389
8
+ pyqqq/backtest/broker.py,sha256=GCWkkPtDGWHzEQ5DfhB1yS-RjA92wENRO1wyV0pMiyQ,69311
9
9
  pyqqq/backtest/environment.py,sha256=wiL2JQtWF1-k4nw2BLryoa_cE1_yO0qNhwukWFp4GfU,10009
10
10
  pyqqq/backtest/logger.py,sha256=BmoEMjUU76z8rZtMCYCwbspD3AVaHJrdbbT1EAFgrAE,3294
11
11
  pyqqq/backtest/positionprovider.py,sha256=wrR7Bntg28Q5_vGQV6XNzxe-SYoO9_GLcV9gDVEDAN4,4164
@@ -33,9 +33,9 @@ pyqqq/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  pyqqq/data/daily.py,sha256=k4dSiXNnT_J3mo0j_6VDjkGezBieVpIaZT3W_M7EU1Y,8019
34
34
  pyqqq/data/domestic.py,sha256=2FOYxDGw2W7DGwY61p3uGFb4IWqWUKiNdR3RlewjkCU,30352
35
35
  pyqqq/data/index.py,sha256=d5b-8a7IXu7yNJWt1tIe1Mj83NW0ZnQq8nsj2Sl3Gx8,6988
36
- pyqqq/data/minutes.py,sha256=rTPvJaUM1Vwgd2C3y1HjHuRWdfxN4VY0rxtLf4Tw-Rs,14719
36
+ pyqqq/data/minutes.py,sha256=i3u-vlZwZq6Qkca7QSJpUXcu4Vb4W46-W0Q1udgy_1c,15373
37
37
  pyqqq/data/overseas.py,sha256=yx7tCZHW8AvjIbtrP4dqIeC6wseRSzbg5ag3dm6H0LY,1234
38
- pyqqq/data/realtime.py,sha256=yeSwlLHaV7p4v3NziTGL25TZFkyMyPmsI-jALkM1HBA,15567
38
+ pyqqq/data/realtime.py,sha256=YerYZU1ERGR1AxKsSBglUgj2dGO02ri82V5OI-dcdcQ,16038
39
39
  pyqqq/data/ticks.py,sha256=DXioiKBsGTzwXyvEH0lpm8t5g-1nHIOLKMXoSrE1Rko,4127
40
40
  pyqqq/data/us_stocks.py,sha256=jXR9dQEVigrwTLEpX1aX1_AQvOlBopW265gwx8Nq8OA,12959
41
41
  pyqqq/datatypes.py,sha256=JhsouFfSzAaK0p4FHIh0KZUuAeOzIDFBvfgYMp2-p20,8403
@@ -53,11 +53,11 @@ pyqqq/utils/kvstore.py,sha256=aAWQrs2IugHBPTRUkbYNxCKF9NZe2MCMD5nSj_lVbVw,4586
53
53
  pyqqq/utils/limiter.py,sha256=M4ApMyWNtibTmLEOLsMViKFs-HZewYf2MsLygH4AFcs,2641
54
54
  pyqqq/utils/local_cache.py,sha256=HvCyD1whixQWdVMxny5EPZwxKWQm-_Q34fKLXRvc3eU,2312
55
55
  pyqqq/utils/logger.py,sha256=neP2Cn9hKNoRd_PuyNwIca8WyhrYdcjgDZqzeGqWpOk,3770
56
- pyqqq/utils/market_schedule.py,sha256=D6oGECe-YGJA7qfJ8Iwlc4oHuYUMIoDPgPEpWYygCXo,12730
56
+ pyqqq/utils/market_schedule.py,sha256=Xg1cVapXIMTsYRxcShAWpX5-Ow3F4zF6sk1SutyVpaQ,12795
57
57
  pyqqq/utils/mock_api.py,sha256=7EsaVQ9mOVZQAqtQW24isPnk9QTbJII7x3guhFyEMAE,10569
58
58
  pyqqq/utils/position_classifier.py,sha256=tIbZMm_baru0F0qv6QDc5b2-oJYNvmn9HyrRr3xaAXU,14975
59
59
  pyqqq/utils/retry.py,sha256=4mw9MQvgSBC8bTLvDauaCEI5N9tL8upHCk8rSfaVRG8,2066
60
60
  pyqqq/utils/singleton.py,sha256=m6NZ8fwVDpI6U-gUUihMPgVK_NkDh-Z1NSAtjisrpjY,810
61
- pyqqq-0.12.181.dist-info/METADATA,sha256=q25sWkjewvFGTnAXgKpJE22kpRFOWjA_Fv_B1Ijv7ss,1664
62
- pyqqq-0.12.181.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
63
- pyqqq-0.12.181.dist-info/RECORD,,
61
+ pyqqq-0.12.182.dist-info/METADATA,sha256=2-KVpEWPwrEXbcwEKg8fdy84gRpAx7M7L7lrc4nlKzE,1664
62
+ pyqqq-0.12.182.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
63
+ pyqqq-0.12.182.dist-info/RECORD,,