pyqqq 0.12.197__py3-none-any.whl → 0.12.199__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 pyqqq might be problematic. Click here for more details.
- pyqqq/backtest/broker.py +8 -3
- pyqqq/brokerage/kis/domestic_stock.py +24 -24
- pyqqq/brokerage/kis/overseas_stock.py +427 -514
- pyqqq/brokerage/kis/simple_overseas.py +6 -4
- pyqqq/utils/backoff.py +32 -0
- pyqqq/utils/market_schedule.py +1 -1
- {pyqqq-0.12.197.dist-info → pyqqq-0.12.199.dist-info}/METADATA +1 -1
- {pyqqq-0.12.197.dist-info → pyqqq-0.12.199.dist-info}/RECORD +9 -8
- {pyqqq-0.12.197.dist-info → pyqqq-0.12.199.dist-info}/WHEEL +0 -0
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import datetime as dtm
|
|
1
2
|
from dataclasses import asdict
|
|
2
3
|
from decimal import Decimal
|
|
4
|
+
from typing import Dict, List, Optional
|
|
5
|
+
from zoneinfo import ZoneInfo
|
|
6
|
+
|
|
7
|
+
import pandas as pd
|
|
8
|
+
|
|
3
9
|
from pyqqq.brokerage.kis.oauth import KISAuth
|
|
4
10
|
from pyqqq.brokerage.kis.overseas_stock import KISOverseasStock
|
|
5
11
|
from pyqqq.data.overseas import get_ticker_info
|
|
6
12
|
from pyqqq.datatypes import *
|
|
7
13
|
from pyqqq.utils.limiter import CallLimiter
|
|
8
14
|
from pyqqq.utils.local_cache import ttl_cache
|
|
9
|
-
from typing import Dict, List, Optional
|
|
10
|
-
from zoneinfo import ZoneInfo
|
|
11
|
-
import datetime as dtm
|
|
12
|
-
import pandas as pd
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
class KISSimpleOverseasStock:
|
pyqqq/utils/backoff.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import random
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def exponential_backoff_with_jitter(
|
|
5
|
+
attempt: int,
|
|
6
|
+
base_wait_time: float = 1.0,
|
|
7
|
+
max_wait_time: float = 30.0,
|
|
8
|
+
jitter: bool = True,
|
|
9
|
+
) -> float:
|
|
10
|
+
"""
|
|
11
|
+
지터와 최대 대기 시간을 포함한 지수 백오프 시간을 계산합니다.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
attempt (int): 현재 재시도 횟수 (1부터 시작).
|
|
15
|
+
base_wait_time (float): 기본 대기 시간 (초).
|
|
16
|
+
max_wait_time (float): 최대 대기 시간 (초).
|
|
17
|
+
jitter (bool): 무작위 지터 추가 여부.
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
float: 최종 백오프 대기 시간 (초).
|
|
21
|
+
"""
|
|
22
|
+
# 기본 백오프 시간 계산
|
|
23
|
+
backoff_time = base_wait_time * (2 ** (attempt - 1))
|
|
24
|
+
|
|
25
|
+
# 지터 추가 (full jitter)
|
|
26
|
+
if jitter:
|
|
27
|
+
backoff_time = random.uniform(0, backoff_time)
|
|
28
|
+
|
|
29
|
+
# 최대 대기 시간 적용
|
|
30
|
+
final_wait_time = min(backoff_time, max_wait_time)
|
|
31
|
+
|
|
32
|
+
return final_wait_time
|
pyqqq/utils/market_schedule.py
CHANGED
|
@@ -348,7 +348,7 @@ def get_trading_day_with_offset(from_date: Optional[datetime.date] = None, offse
|
|
|
348
348
|
return offset_date
|
|
349
349
|
|
|
350
350
|
|
|
351
|
-
@ttl_cache(maxsize=
|
|
351
|
+
@ttl_cache(maxsize=1000, ttl=3600)
|
|
352
352
|
def _fetch_market_scheldue(date: datetime.date, exchange: str) -> requests.Response | None:
|
|
353
353
|
url = f"{c.PYQQQ_API_URL}/domestic-stock/market-schedules/{exchange}"
|
|
354
354
|
params = {"date": date}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
pyqqq/__init__.py,sha256=s-r2WUo0H9OzuPiHSGtCjJMyEXfx8Cpt0hri8amUU2Y,1607
|
|
2
2
|
pyqqq/backtest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
pyqqq/backtest/broker.py,sha256=
|
|
3
|
+
pyqqq/backtest/broker.py,sha256=erLt83WG9zDzFZ9UoGk0sgllCzw3k5znngNjj09keiA,73986
|
|
4
4
|
pyqqq/backtest/environment.py,sha256=cAvXKtRR4xBLFzUo-6xkuihlqRE_Jd0ZYAQ29K5qirg,10229
|
|
5
5
|
pyqqq/backtest/logger.py,sha256=BmoEMjUU76z8rZtMCYCwbspD3AVaHJrdbbT1EAFgrAE,3294
|
|
6
6
|
pyqqq/backtest/positionprovider.py,sha256=wrR7Bntg28Q5_vGQV6XNzxe-SYoO9_GLcV9gDVEDAN4,4164
|
|
@@ -15,11 +15,11 @@ pyqqq/brokerage/ebest/simple.py,sha256=Ade3m18yhGt1fyn7ZbN-LmyNKiFP2ahUMSLLqMXWc
|
|
|
15
15
|
pyqqq/brokerage/ebest/tr_client.py,sha256=6vtod4xXr35yMAIji5qXUr_C3Bf4C_1NDLgELohDuks,7914
|
|
16
16
|
pyqqq/brokerage/helper.py,sha256=6pDiHo2eqsppC5ObIUMJibeMZ7cq8V9pVzNLTsdAy1w,6675
|
|
17
17
|
pyqqq/brokerage/kis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
-
pyqqq/brokerage/kis/domestic_stock.py,sha256=
|
|
18
|
+
pyqqq/brokerage/kis/domestic_stock.py,sha256=8ENXqEj66I0qUrXobw26_Vjc-zEy8444AGNqKBW9_UI,233326
|
|
19
19
|
pyqqq/brokerage/kis/oauth.py,sha256=jA7QydFEe5NN8t0QSwEhFoFtQiwTP4fr2segcibOXVU,7805
|
|
20
|
-
pyqqq/brokerage/kis/overseas_stock.py,sha256=
|
|
20
|
+
pyqqq/brokerage/kis/overseas_stock.py,sha256=Jh79ruHjD-MP3qguN2PFeWHJFyKO4vgq8VGxw-g3kVE,88380
|
|
21
21
|
pyqqq/brokerage/kis/simple.py,sha256=u0XdYtOL18urqQp9l4ekSDHDZBe-VRiO_cNcFdNu96c,43014
|
|
22
|
-
pyqqq/brokerage/kis/simple_overseas.py,sha256=
|
|
22
|
+
pyqqq/brokerage/kis/simple_overseas.py,sha256=hx18_RxFt5U72qUjiMuTtAjGXR9Qh05JMNZlx-QC3yU,50362
|
|
23
23
|
pyqqq/brokerage/kis/tr_client.py,sha256=3n4ywdJva7V843ffhQVVFctazc-dNIvLAxUIU8GSrds,5636
|
|
24
24
|
pyqqq/brokerage/multiprocess_tracker.py,sha256=Xx0hSpRZYITBGWjxclOEtNZdHV5agX94s34q1A8EE-Y,7283
|
|
25
25
|
pyqqq/brokerage/tracker.py,sha256=CmbsdKcKrc9adnDpQ8dZBZZ_p2FdavAyyZ4FPJyvNa8,24799
|
|
@@ -39,6 +39,7 @@ pyqqq/executors/hook.py,sha256=xV9SVUpUwGm8AgEuz8aD7U4ema47lRoKn4KFthuLJwQ,36985
|
|
|
39
39
|
pyqqq/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
40
|
pyqqq/utils/api_client.py,sha256=WLcvZ9sZp2b9YrTauZt2VkcikfByOhHxPHCvGXmgEzw,585
|
|
41
41
|
pyqqq/utils/array.py,sha256=8E8JW-P1GWzluiqIDuKdUEALZ30AkKRtfxgdrWmu__Q,1747
|
|
42
|
+
pyqqq/utils/backoff.py,sha256=75xpSQM4faLQW4o7TWPlAAw23zifYosepqMVrOK3uRU,916
|
|
42
43
|
pyqqq/utils/casting.py,sha256=nCHnJQ_F88R22xfnBg58fiJXwHYYnsnk3qSDw_rVIY8,135
|
|
43
44
|
pyqqq/utils/compute.py,sha256=dk515lUvmYXbp9v6btpLSDnpc-zX0moD7EcJ4l4HCqU,5665
|
|
44
45
|
pyqqq/utils/copycat.py,sha256=1cMuQKteOuzBbH3aAdsDCH7ZTxTyM6OyJ5Wii7gmBpk,10837
|
|
@@ -49,11 +50,11 @@ pyqqq/utils/kvstore.py,sha256=aAWQrs2IugHBPTRUkbYNxCKF9NZe2MCMD5nSj_lVbVw,4586
|
|
|
49
50
|
pyqqq/utils/limiter.py,sha256=0zTJitT-14Ve5aeT0zcNEWQGPyY_3FENorF3HS7WPyQ,2643
|
|
50
51
|
pyqqq/utils/local_cache.py,sha256=HvCyD1whixQWdVMxny5EPZwxKWQm-_Q34fKLXRvc3eU,2312
|
|
51
52
|
pyqqq/utils/logger.py,sha256=GZzefjhdL8ms-5nPwJFuMtuHsuTuoPMADUhqcz93N4s,4843
|
|
52
|
-
pyqqq/utils/market_schedule.py,sha256=
|
|
53
|
+
pyqqq/utils/market_schedule.py,sha256=3y6uI172Kx1Jcj9nbAuqBHZruKp4_hm_1nAaQ1BgIEg,12901
|
|
53
54
|
pyqqq/utils/mock_api.py,sha256=7EsaVQ9mOVZQAqtQW24isPnk9QTbJII7x3guhFyEMAE,10569
|
|
54
55
|
pyqqq/utils/position_classifier.py,sha256=tIbZMm_baru0F0qv6QDc5b2-oJYNvmn9HyrRr3xaAXU,14975
|
|
55
56
|
pyqqq/utils/retry.py,sha256=ENNvjRyswn6nwue5JSqyC82QlBJSAMlJYj_gj0kqutY,2187
|
|
56
57
|
pyqqq/utils/singleton.py,sha256=m6NZ8fwVDpI6U-gUUihMPgVK_NkDh-Z1NSAtjisrpjY,810
|
|
57
|
-
pyqqq-0.12.
|
|
58
|
-
pyqqq-0.12.
|
|
59
|
-
pyqqq-0.12.
|
|
58
|
+
pyqqq-0.12.199.dist-info/METADATA,sha256=w0KawVhD0_oEhBDyGyB4jxD2Gky6O1lBzZbQZwrWGq8,1664
|
|
59
|
+
pyqqq-0.12.199.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
60
|
+
pyqqq-0.12.199.dist-info/RECORD,,
|
|
File without changes
|