pyqqq 0.12.197__tar.gz → 0.12.198__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.
- {pyqqq-0.12.197 → pyqqq-0.12.198}/PKG-INFO +1 -1
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyproject.toml +1 -1
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/backtest/broker.py +8 -3
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/kis/domestic_stock.py +24 -24
- pyqqq-0.12.198/pyqqq/utils/backoff.py +32 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/market_schedule.py +1 -1
- {pyqqq-0.12.197 → pyqqq-0.12.198}/README.md +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/__init__.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/backtest/__init__.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/backtest/environment.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/backtest/logger.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/backtest/positionprovider.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/backtest/strategy.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/backtest/utils.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/backtest/wallclock.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/__init__.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/ebest/__init__.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/ebest/domestic_stock.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/ebest/oauth.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/ebest/simple.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/ebest/tr_client.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/helper.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/kis/__init__.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/kis/oauth.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/kis/overseas_stock.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/kis/simple.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/kis/simple_overseas.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/kis/tr_client.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/multiprocess_tracker.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/brokerage/tracker.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/config.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/data/__init__.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/data/daily.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/data/domestic.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/data/index.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/data/minutes.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/data/overseas.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/data/realtime.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/data/ticks.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/data/us_stocks.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/datatypes.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/executors/__init__.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/executors/hook.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/__init__.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/api_client.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/array.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/casting.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/compute.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/copycat.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/daily_tickers.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/display.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/indicators.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/kvstore.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/limiter.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/local_cache.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/logger.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/mock_api.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/position_classifier.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/retry.py +0 -0
- {pyqqq-0.12.197 → pyqqq-0.12.198}/pyqqq/utils/singleton.py +0 -0
|
@@ -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
|
|
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,
|
|
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
|
-
-
|
|
809
|
-
-
|
|
810
|
-
-
|
|
811
|
-
-
|
|
812
|
-
-
|
|
813
|
-
-
|
|
814
|
-
-
|
|
815
|
-
-
|
|
816
|
-
-
|
|
817
|
-
-
|
|
818
|
-
-
|
|
819
|
-
-
|
|
820
|
-
-
|
|
821
|
-
-
|
|
822
|
-
-
|
|
823
|
-
-
|
|
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
|
-
-
|
|
828
|
-
-
|
|
829
|
-
-
|
|
830
|
-
-
|
|
831
|
-
-
|
|
832
|
-
-
|
|
833
|
-
-
|
|
834
|
-
-
|
|
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 에러 발생시
|
|
@@ -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=
|
|
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}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|