pyqqq 0.12.197__py3-none-any.whl → 0.12.198__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 CHANGED
@@ -1,6 +1,6 @@
1
1
  import datetime as dtm
2
- import os
3
2
  import fcntl
3
+ import os
4
4
  from abc import ABC, abstractmethod
5
5
  from dataclasses import asdict
6
6
  from decimal import Decimal
@@ -9,6 +9,7 @@ from typing import List, Literal, Optional, Union
9
9
 
10
10
  import numpy as np
11
11
  import pandas as pd
12
+ from cachetools.func import ttl_cache
12
13
 
13
14
  from pyqqq.backtest.logger import Logger, get_logger
14
15
  from pyqqq.backtest.positionprovider import BasePositionProvider
@@ -20,11 +21,14 @@ from pyqqq.data.domestic import get_market_cap_by_codes
20
21
  from pyqqq.data.domestic import get_ticker_info as get_kr_ticker_info
21
22
  from pyqqq.data.minutes import get_all_day_data as get_kr_minute_data
22
23
  from pyqqq.data.us_stocks import get_all_day_data as get_us_minute_data
23
- from pyqqq.data.us_stocks import get_ohlcv_by_codes_for_period as get_us_daily_data
24
+ from pyqqq.data.us_stocks import \
25
+ get_ohlcv_by_codes_for_period as get_us_daily_data
24
26
  from pyqqq.data.us_stocks import get_ticker_info as get_us_ticker_info
25
27
  from pyqqq.datatypes import *
26
28
  from pyqqq.utils.casting import casting
27
- from pyqqq.utils.market_schedule import get_last_trading_day, get_market_schedule, get_trading_day_with_offset
29
+ from pyqqq.utils.market_schedule import (get_last_trading_day,
30
+ get_market_schedule,
31
+ get_trading_day_with_offset)
28
32
  from pyqqq.utils.position_classifier import PositionClassifier
29
33
 
30
34
  MarketType = Literal["kr_stock", "us_stock"]
@@ -781,6 +785,7 @@ class MockBroker(BaseBroker):
781
785
 
782
786
  return df
783
787
 
788
+ @ttl_cache(maxsize=100, ttl=300)
784
789
  def get_daily_price(self, code: str, from_date: Optional[dtm.date] = None, end_date: Optional[dtm.date] = None):
785
790
  """
786
791
  지정된 기간 동안의 정규장 시작부터 현재 시각 (이전) 까지의 일봉 데이터를 조회합니다.
@@ -805,33 +805,33 @@ class KISDomesticStock:
805
805
  - msg1 (str): 메시지1
806
806
  - output1 (object): 응답상세1
807
807
 
808
- - BSTP_NMIX_PRDY_VRSS: 업종 지수 전일 대비 - 업종 지수 전일 대비
809
- - PRDY_VRSS_SIGN: 전일 대비 부호 - 전일 대비 부호
810
- - BSTP_NMIX_PRDY_CTRT: 업종 지수 전일 대비율 - 업종 지수 전일 대비율
811
- - PRDY_NMIX: 전일 지수 - 전일 지수
812
- - ACML_VOL: 누적 거래량 - 누적 거래량
813
- - ACML_TR_PBMN: 누적 거래 대금 - 누적 거래 대금
814
- - HTS_KOR_ISNM: HTS 한글 종목명 - HTS 한글 종목명
815
- - BSTP_NMIX_PRPR: 업종 지수 현재가 - 업종 지수 현재가
816
- - BSTP_CLS_CODE: 업종 구분 코드 - 업종 구분 코드
817
- - PRDY_VOL: 전일 거래량 - 전일 거래량
818
- - BSTP_NMIX_OPRC: 업종 지수 시가 - 업종 지수 시가
819
- - BSTP_NMIX_HGPR: 업종 지수 최고가 - 업종 지수 최고가
820
- - BSTP_NMIX_LWPR: 업종 지수 최저가 - 업종 지수 최저가
821
- - FUTS_PRDY_OPRC: 업종 전일 시가 - 업종 전일 시가
822
- - FUTS_PRDY_HGPR: 업종 전일 최고가 - 업종 전일 최고가
823
- - FUTS_PRDY_LWPR: 업종 전일 최저가 - 업종 전일 최저가
808
+ - bstp_nmix_prdy_vrss: 업종 지수 전일 대비
809
+ - prdy_vrss_sign: 전일 대비 부호
810
+ - bstp_nmix_prdy_ctrt: 업종 지수 전일 대비율
811
+ - prdy_nmix: 전일 지수
812
+ - acml_vol: 누적 거래량
813
+ - acml_tr_pbmn: 누적 거래 대금
814
+ - hts_kor_isnm: hts 한글 종목명
815
+ - bstp_nmix_prpr: 업종 지수 현재가
816
+ - bstp_cls_code: 업종 구분 코드
817
+ - prdy_vol: 전일 거래량
818
+ - bstp_nmix_oprc: 업종 지수 시가
819
+ - bstp_nmix_hgpr: 업종 지수 최고가
820
+ - bstp_nmix_lwpr: 업종 지수 최저가
821
+ - futs_prdy_oprc: 업종 전일 시가
822
+ - futs_prdy_hgpr: 업종 전일 최고가
823
+ - futs_prdy_lwpr: 업종 전일 최저가
824
824
 
825
825
  - output2 (list): 응답상세2
826
826
 
827
- - STCK_BSOP_DATE: 영업 일자 - 영업 일자
828
- - BSTP_NMIX_PRPR: 업종 지수 현재가 - 업종 지수 현재가
829
- - BSTP_NMIX_OPRC: 업종 지수 시가 - 업종 지수 시가
830
- - BSTP_NMIX_HGPR: 업종 지수 최고가 - 업종 지수 최고가
831
- - BSTP_NMIX_LWPR: 업종 지수 최저가 - 업종 지수 최저가
832
- - ACML_VOL: 누적 거래량 - 누적 거래량
833
- - ACML_TR_PBMN: 누적 거래 대금 - 누적 거래 대금
834
- - MOD_YN: 변경 여부 - 변경 여부
827
+ - stck_bsop_date: 영업 일자
828
+ - bstp_nmix_prpr: 업종 지수 현재가
829
+ - bstp_nmix_oprc: 업종 지수 시가
830
+ - bstp_nmix_hgpr: 업종 지수 최고가
831
+ - bstp_nmix_lwpr: 업종 지수 최저가
832
+ - acml_vol: 누적 거래량
833
+ - acml_tr_pbmn: 누적 거래 대금
834
+ - mod_yn: 변경 여부
835
835
 
836
836
  Raise:
837
837
  ValueError: API 에러 발생시
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
@@ -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=10, ttl=3600)
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
  Metadata-Version: 2.1
2
2
  Name: pyqqq
3
- Version: 0.12.197
3
+ Version: 0.12.198
4
4
  Summary: Package for quantitative strategy development on the PyQQQ platform
5
5
  License: MIT
6
6
  Author: PyQQQ team
@@ -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=ctChBDuvjuRc54ACjH-2r4akAYKHuO9__-Axt3YT8Qw,73821
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,7 +15,7 @@ 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=VgeSyFTtwL1bsOlOqHZPOXKbf9ICbxqQpVjqZH-jj5k,233886
18
+ pyqqq/brokerage/kis/domestic_stock.py,sha256=8ENXqEj66I0qUrXobw26_Vjc-zEy8444AGNqKBW9_UI,233326
19
19
  pyqqq/brokerage/kis/oauth.py,sha256=jA7QydFEe5NN8t0QSwEhFoFtQiwTP4fr2segcibOXVU,7805
20
20
  pyqqq/brokerage/kis/overseas_stock.py,sha256=9QUkEX13Lev5BcXMfK2GLve4xwFptOd1vXh4lDbrpYw,90096
21
21
  pyqqq/brokerage/kis/simple.py,sha256=u0XdYtOL18urqQp9l4ekSDHDZBe-VRiO_cNcFdNu96c,43014
@@ -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=NAzRmAc1Bnj5M99Ho7UN8JlVDW-16kgvPGrMNmydaBY,12899
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.197.dist-info/METADATA,sha256=8XB8L9rMekKWzuvXR_f_8Sjvd1HB2FfEky4JWtEfiQw,1664
58
- pyqqq-0.12.197.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
59
- pyqqq-0.12.197.dist-info/RECORD,,
58
+ pyqqq-0.12.198.dist-info/METADATA,sha256=j9U0pZ00OmXRiVdFRe5yLVZwOA9QLFrgzmYxIgrwuB4,1664
59
+ pyqqq-0.12.198.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
60
+ pyqqq-0.12.198.dist-info/RECORD,,