zerohertzLib.quant¶
Quant
FinanceDataReader
및 KoreaInvestment
를 통해 수집한 data를 이용해 매수, 매도 signal을 포착하고 test하는 quant 함수 및 class들
Important
signals["signals"]
부호의 의미
+1
: 매수-1
: 매도
- class zerohertzLib.quant.Balance(account_no, path='./', kor=True)[source]¶
Bases:
KoreaInvestment
한국투자증권의 국내 계좌 정보 조회 class
- Parameters:
- balance¶
현재 보유 주식과 계좌의 금액 정보
- Type:
Dict[str, Any]
- __contains__()[source]¶
- Parameters:
item (
Any
) – 보유 여부를 판단할 종목명- Returns:
입력 종목명의 보유 여부
- Return type:
bool
- __getitem__()[source]¶
- Parameters:
idx (
int
) – Index- Returns:
Index에 따른 주식의 매수 시점과 현재의 정보
- Return type:
List[Union[int, float, str]]
Examples
kor=True
:>>> balance = zz.quant.Balance("00000000-00") >>> "LG전자" in balance True >>> "삼성전자" in balance False >>> len(balance) 1 >>> balance[0] ['066570', 102200.0, 100200, 1, -1.95, -2000] >>> balance() 000
kor=False
:>>> balance = zz.quant.Balance("00000000-00", kor=False) >>> "아마존닷컴" in balance True >>> "삼성전자" in balance False >>> len(balance) 1 >>> balance[0] ['META', 488.74, 510.92, 1, 4.53, 22.18] >>> balance() 000.000
- barv()[source]¶
현재 보유 종목의 이익과 손실을 bar chart로 시각화
- Returns:
저장된 graph의 절대 경로
- Return type:
str
Examples
>>> balance.barv()
- bought_symbols()[source]¶
보유 주식의 종목 code return
- Returns:
보유 주식의 종목 code들
- Return type:
List[str]
Examples
>>> balance.bought_symbols(): ['066570']
- items()[source]¶
보유 주식의 반복문 사용을 위한 method
- Returns:
보유 종목 code와 그에 따른 정보들
- Return type:
ItemsView[str, List[Union[int, float, str]]]
Examples
>>> for k, v in balance.items(): >>> print(k, v)
- merge(balance)[source]¶
현재 계좌와 입력 계좌의 정보를 병합하는 함수
- Parameters:
balance¶ (
zerohertzLib.quant.Balance
) – 병합될 계좌 정보- Returns:
현재 계좌에 정보 update
- Return type:
None
Examples
>>> balance_1.merge(balance_2)
- class zerohertzLib.quant.Experiments(title, data, ohlc='', vis=False, report=True)[source]¶
Bases:
object
Full factorial design 기반의 backtest 수행 class
- Parameters:
Examples
>>> experiments = zz.quant.Experiments(title, data)
- bollinger_bands(exps=None)[source]¶
Bollinger bands 전략 실험
- Parameters:
exps¶ (
List[List[Any]]
) – 전략 함수에 입력될 변수들의 범위- Returns:
손실 거래 비율에 따른 수익률,
signals
, parameters- Return type:
Dict[str, List[Any]]
- macd(exps=None)[source]¶
MACD 전략 실험
- Parameters:
exps¶ (
List[List[Any]]
) – 전략 함수에 입력될 변수들의 범위- Returns:
손실 거래 비율에 따른 수익률,
signals
, parameters- Return type:
Dict[str, List[Any]]
- momentum(exps=None)[source]¶
Momentum 전략 실험
- Parameters:
exps¶ (
List[List[Any]]
) – 전략 함수에 입력될 변수들의 범위- Returns:
손실 거래 비율에 따른 수익률,
signals
, parameters- Return type:
Dict[str, List[Any]]
- class zerohertzLib.quant.Quant(title, data, ohlc='', top=1, methods=None, report=False)[source]¶
Bases:
Experiments
한 가지 종목에 대해 full factorial design 기반의 backtest를 수행하고 최적의 전략을 융합하는 class
- Parameters:
title¶ (
str
) – 종목 이름data¶ (
pd.DataFrame
) – OHLCV (Open, High, Low, Close, Volume) dataohlc¶ (
Optional[str]
) – 사용할data
의 column 이름top¶ (
Optional[int]
) – Experiment 과정에서 사용할 각 전략별 수methods¶ (
Optional[Dict[str, List[List[Any]]]]
) – 사용할 전략들의 함수명 및 parametersreport¶ (
Optional[bool]
) – Experiment 결과 출력 여부
- signals¶
융합된 전략의 signal
- Type:
pd.DataFrame
- methods¶
융합된 전략명
- Type:
Tuple[str]
- profit¶
융합된 전략의 backtest profit
- Type:
float
- buy¶
융합된 전략의 backtest 시 총 매수
- Type:
Union[int, float]
- sell¶
융합된 전략의 backtest 시 총 매도
- Type:
Union[int, float]
- transaction¶
융합된 전략의 backtest 시 거래 정보 (매수가, 매도가, 수익률, 거래 기간)
- Type:
Dict[str, Union[int, float]]
- threshold_buy¶
융합된 전략의 매수 signal threshold
- Type:
int
- threshold_sell¶
융합된 전략의 매도 signal threshold
- Type:
int
- total_cnt¶
융합된 전략의 수
- Type:
int
- methods_cnt¶
각 전략에 따른 이익이 존재하는 수
- Type:
Dict[str, int]
- exps_cnt¶
각 전략과 parameter에 따른 이익이 존재하는 수
- Type:
Dict[str, List[Dict[str, int]]]
- exps_str¶
각 전략에 따른 이익이 존재하는 paramter 문자열
- Type:
Dict[str, List[str]]
- __call__()[source]¶
입력된 날짜에 대해 분석 정보 return
- Parameters:
day (
Optional[str]
) – 분석할 날짜- Returns:
각 전략에 따른 분석 정보 및 결론
- Return type:
Dict[str, Any]
Examples
>>> qnt = zz.quant.Quant(title, data, top=3) >>> qnt.signals.columns Index(['moving_average', 'rsi', 'bollinger_bands', 'momentum', 'macd', 'signals', 'logic'], dtype='object') >>> qnt.methods ('moving_average', 'bollinger_bands', 'macd') >>> qnt.profit 23.749412256412935 >>> qnt.buy 3828200.0 >>> qnt.sell 4737375.0 >>> qnt.transaction defaultdict(<class 'list'>, {'buy': [92850.0, ...], 'sell': [105275.0, ...], 'profit': [11.802422227499406, ...], 'period': [205, ...]}) >>> qnt.threshold_buy 1 >>> qnt.threshold_sell -4 >>> qnt.total_cnt 9 >>> qnt.methods_cnt defaultdict(<class 'int'>, {'moving_average': 3, 'rsi': 3, 'bollinger_bands': 3, 'momentum': 1, 'macd': 3}) >>> qnt.exps_cnt defaultdict(None, {'moving_average': [defaultdict(<class 'int'>, {'20': 3}), ...], ...}) >>> qnt.exps_str defaultdict(<class 'list'>, {'moving_average': ['20-70-1.0', '20-60-1.0', '20-70-0.0'], ...}) >>> qnt() defaultdict(<class 'list'>, {'moving_average': [0, 0.0], 'bollinger_bands': [0, 0.0], 'macd': [0, 0.0], 'logic': 0, 'total': [0, 0.0], 'position': 'None'}) >>> qnt("20231211") defaultdict(<class 'list'>, {'moving_average': [0, 0.0], 'bollinger_bands': [3, 100.0], 'macd': [0, 0.0], 'logic': 1, 'total': [3, 33.33333333333333], 'position': 'Buy'}) >>> qnt("2023-12-08") defaultdict(<class 'list'>, {'moving_average': [0, 0.0], 'bollinger_bands': [3, 100.0], 'macd': [0, 0.0], 'logic': 1, 'total': [3, 33.33333333333333], 'position': 'Buy'})
- class zerohertzLib.quant.QuantSlackBot(symbols, start_day='', ohlc='', top=1, methods=None, report=False, token=None, channel=None, name=None, icon_emoji=None, mp_num=0, analysis=False, kor=True)[source]¶
Bases:
ABC
,SlackBot
입력된 여러 종목에 대해 매수, 매도 signal을 판단하고 Slack으로 message와 graph를 전송하는 class
Note
Abstract Base Class: 종목 code에 따른 종목명과 data를 불러오는 abstract method
_get_data
정의 후 사용def _get_data(self, symbol: str) -> Tuple[str, pd.DataFrame]: title = data = None return title, data
- Parameters:
symbols¶ (
List[str]
) – 종목 code들start_day¶ (
Optional[str]
) – 조회 시작 일자 (YYYYMMDD
)ohlc¶ (
Optional[str]
) – 사용할data
의 column 이름top¶ (
Optional[int]
) – Experiment 과정에서 사용할 각 전략별 수methods¶ (
Optional[Dict[str, List[List[Any]]]]
) – 사용할 전략들의 함수명 및 parametersreport¶ (
Optional[bool]
) – Experiment 결과 출력 여부token¶ (
Optional[str]
) – Slack Bot의 tokenchannel¶ (
Optional[str]
) – Slack Bot이 전송할 channelname¶ (
Optional[str]
) – Slack Bot의 표시될 이름icon_emoji¶ (
Optional[str]
) – Slack Bot의 표시될 사진 (emoji)mp_num¶ (
Optional[int]
) – 병렬 처리에 사용될 process의 수 (0
: 직렬 처리)analysis¶ (
Optional[bool]
) – 각 전략의 보고서 전송 여부kor¶ (
Optional[bool]
) – 국내 여부
- exps¶
각 전략에 따른 parameter 분포
- Type:
Dict[str, List[Dict[str, int]]]
Examples
>>> qsb = zz.quant.QuantSlackBot(symbols, token=token, channel=channel) >>> qsb.index()
- class zerohertzLib.quant.QuantSlackBotFDR(symbols, start_day='', ohlc='', top=1, methods=None, report=False, token=None, channel=None, name=None, icon_emoji=None, mp_num=0, analysis=False, kor=True)[source]¶
Bases:
QuantSlackBot
FinanceDataReader module 기반으로 입력된 여러 종목에 대해 매수, 매도 signal을 판단하고 Slack으로 message와 graph를 전송하는 class
- Parameters:
symbols¶ (
Union[int, List[str]]
) – 종목 code들 혹은 시가 총액 순위start_day¶ (
Optional[str]
) – 조회 시작 일자 (YYYYMMDD
)ohlc¶ (
Optional[str]
) – 사용할data
의 column 이름top¶ (
Optional[int]
) – Experiment 과정에서 사용할 각 전략별 수methods¶ (
Optional[Dict[str, List[List[Any]]]]
) – 사용할 전략들의 함수명 및 parametersreport¶ (
Optional[bool]
) – Experiment 결과 출력 여부token¶ (
Optional[str]
) – Slack Bot의 tokenchannel¶ (
Optional[str]
) – Slack Bot이 전송할 channelname¶ (
Optional[str]
) – Slack Bot의 표시될 이름icon_emoji¶ (
Optional[str]
) – Slack Bot의 표시될 사진 (emoji)mp_num¶ (
Optional[int]
) – 병렬 처리에 사용될 process의 수 (0
: 직렬 처리)analysis¶ (
Optional[bool]
) – 각 전략의 보고서 전송 여부kor¶ (
Optional[bool]
) – 국내 여부
- exps¶
각 전략에 따른 parameter 분포
- Type:
Dict[str, List[Dict[str, int]]]
- market¶
kor
에 따른 시장 목록- Type:
pd.DataFrame
Examples
>>> qsb = zz.quant.QuantSlackBotFDR(symbols, token=token, channel=channel) >>> qsb = zz.quant.QuantSlackBotFDR(10, token=token, channel=channel)
- class zerohertzLib.quant.QuantSlackBotKI(account_no, symbols=None, start_day='', ohlc='', top=1, methods=None, report=False, token=None, channel=None, name=None, icon_emoji=None, mp_num=0, analysis=False, kor=True, path='./')[source]¶
Bases:
Balance
,QuantSlackBot
한국투자증권 API를 기반으로 입력된 여러 종목에 대해 매수, 매도 signal을 판단하고 Slack으로 message와 graph를 전송하는 class
- Parameters:
account_no¶ (
str
) – API 호출 시 사용할 계좌 번호symbols¶ (
Optional[List[str]]
) – 종목 code들start_day¶ (
Optional[str]
) – 조회 시작 일자 (YYYYMMDD
)ohlc¶ (
Optional[str]
) – 사용할data
의 column 이름top¶ (
Optional[int]
) – Experiment 과정에서 사용할 각 전략별 수methods¶ (
Optional[Dict[str, List[List[Any]]]]
) – 사용할 전략들의 함수명 및 parametersreport¶ (
Optional[bool]
) – Experiment 결과 출력 여부token¶ (
Optional[str]
) – Slack Bot의 tokenchannel¶ (
Optional[str]
) – Slack Bot이 전송할 channelname¶ (
Optional[str]
) – Slack Bot의 표시될 이름icon_emoji¶ (
Optional[str]
) – Slack Bot의 표시될 사진 (emoji)mp_num¶ (
Optional[int]
) – 병렬 처리에 사용될 process의 수 (0
: 직렬 처리)analysis¶ (
Optional[bool]
) – 각 전략의 보고서 전송 여부kor¶ (
Optional[bool]
) – 국내 여부path¶ (
Optional[str]
) –secret.key
혹은token.dat
이 포함된 경로
- exps¶
각 전략에 따른 parameter 분포
- Type:
Dict[str, List[Dict[str, int]]]
Examples
>>> qsb = zz.quant.QuantSlackBotKI("00000000-00", token=token, channel=channel)
- zerohertzLib.quant.backtest(data, signals, ohlc='', threshold=1, signal_key='signals')[source]¶
전략에 의해 생성된
signals
backtest- Parameters:
data¶ (
pd.DataFrame
) – OHLCV (Open, High, Low, Close, Volume) datasignals¶ (
pd.DataFrame
) –"signals"
column이 포함된 data (다른 이름으로 지정했을 시signal_key
사용)ohlc¶ (
Optional[str]
) – 사용할data
의 column 이름threshold¶ (
Optional[Union[int, Tuple[int]]]
) – 매수, 매도를 결정할signals
경계값signal_key¶ (
Optional[str]
) –"signals"
의 key 값
- Returns:
총 수익률 (단위: %), 손실 거래 비율 (단위: %), 손실 거래 비율에 따른 수익률, 거래 정보 (매수가, 매도가, 수익률, 거래 기간), 총 매수, 총 매도
- Return type:
Dict[str, Any]
Examples
>>> results = zz.quant.backtest(data, signals) >>> results.keys() dict_keys(['profit', 'loss', 'weighted_profit', 'transaction', 'buy', 'sell']) >>> results["transaction"].keys() dict_keys(['buy', 'sell', 'profit', 'period'])
- zerohertzLib.quant.bollinger_bands(data, window=60, num_std_dev=2.5, ohlc='')[source]¶
Bollinger band 기반 매수 및 매도 signal을 생성하는 함수
Note
Bollinger Band
Definition: 1980년대에 John Bollinger에 의해 개발된 가격 변동성 및 추세 파악 기법
- Mean
Middle Band: 기본적인 중간 가격 추세
Upper Band: Middle band에서 일정 표준편차 위에 위치 (과도한 상승 추세나 고평가 상태)
Lower Band: Middle band에서 일정 표준편차 아래에 위치 (과도한 하락 추세나 저평가 상태)
매수 신호 (
+1
): 주가가 하단 Bollinger band (lower_band
) 아래로 감소할 때 생성 (과매도 상태)매도 신호 (
-1
): 주가가 상단 Bollinger band (upper_band
) 위로 상승할 때 생성 (과매수 상태)
- Parameters:
- Returns:
각 날짜에 대한 signal (
"signals"
) 정보- Return type:
pd.DataFrame
Examples
>>> zz.quant.bollinger_bands(data) middle_band upper_band lower_band signals Date 2022-01-03 NaN NaN NaN 0 ... ... ... ... ... 2023-12-19 102771.666667 111527.577705 94015.755629 0 [485 rows x 4 columns]
- zerohertzLib.quant.experiments(title, data, method, exps, ohlc='', vis=False, dpi=100, report=True)[source]¶
Full factorial design 기반의 backtest 수행 함수
- Parameters:
title¶ (
str
) – 종목 이름data¶ (
pd.DataFrame
) – OHLCV (Open, High, Low, Close, Volume) datamethod¶ (
Callable[[Any], pd.DataFrame]
) – Full factorial을 수행할 전략 함수exps¶ (
List[List[Any]]
) – 전략 함수에 입력될 변수들의 범위ohlc¶ (
Optional[str]
) – 사용할data
의 column 이름vis¶ (
Optional[bool]
) – Candle chart 시각화 여부dpi¶ (
Optional[int]
) – Graph 저장 시 DPI (Dots Per Inch)report¶ (
Optional[bool]
) – Experiment 결과 출력 여부
- Returns:
손실 거래 비율에 따른 수익률,
signals
, parameters- Return type:
Dict[str, List[Any]]
Examples
>>> exps = [[10, 20, 25, 30], [70, 75, 80, 85, 90], [14, 21, 31]] >>> results = zz.quant.experiments(title, data, zz.quant.rsi, exps) +----------------------+------------+------------+ | EXP | PROFIT | LOSS RATIO | +----------------------+------------+------------+ | 10-70-14 | 5.65% | 0.00% | | 10-70-21 | -100.00% | 100.00% | | ... | ... | ... | | 30-90-21 | 21.25% | 0.00% | | 30-90-31 | 20.98% | 0.00% | | ==================== | ========== | ========== | | WORST (10-70-21) | -100.00% | 100.00% | | BEST (25-90-31) | 21.53% | 0.00% | | OPTIM (25-75-31) | 21.53% | 0.00% | +----------------------+------------+------------+ >>> results.keys() dict_keys(['profits', 'signals', 'exps_str', 'exps_tup']) >>> results["profits"] [21.530811750223275, ...] >>> results["signals"][0].columns Index(['RSI', 'signals', 'logic'], dtype='object') >>> results["exps_str"] ['25-75-31', ...] >>> results["exps_tup"] [(25, 75, 31), ...]
- zerohertzLib.quant.macd(data, n_fast=12, n_signal=9, ohlc='')[source]¶
MACD 기반 매수 및 매도 signal을 생성하는 함수
Note
MACD (Moving Average Convergence Divergence)
- Definition: 빠른 EMA (
n_fast
)와 느린 EMA (n_slow
)의 차이 n_slow = n_fast * 2
- Definition: 빠른 EMA (
- Mean
EMA (Exponential Moving Average): 최근 가격에 더 많은 가중치를 두어 계산하는 이동 평균
Signal line: MACD의 추세를 평활화하여 추세의 방향과 강도를 파악
매수 신호 (
+1
): MACD가 signal line 위로 상승할 때 생성 (상승 추세)매도 신호 (
-1
): MACD가 signal line 아래로 하락할 때 생성 (하락 추세)
- Parameters:
- Returns:
각 날짜에 대한 signal (
"signals"
) 정보- Return type:
pd.DataFrame
Examples
>>> zz.quant.macd(data) MACD signals Date 2022-01-03 0.000000 0 ... ... ... 2023-12-19 -1950.006134 0 [485 rows x 2 columns]
- zerohertzLib.quant.momentum(data, window=5, ohlc='')[source]¶
Momentum 기반 매수 및 매도 signal을 생성하는 함수
Note
Momentum
Definition:
data[ohlc].diff(window)
를 통해window
일 전 가격 사이의 차이 계산- Mean
양의 momentum: 가격 상승
음의 momentum: 가격 하락
Momentum의 크기: 추세의 강도
매수 신호 (
+1
): 주가 momentum이 양수일 때 생성 (상승 추세)매도 신호 (
-1
): 주가 momentum이 음수일 때 생성 (하락 추세)
- Parameters:
- Returns:
각 날짜에 대한 signal (
"signals"
) 정보- Return type:
pd.DataFrame
Examples
>>> zz.quant.momentum(data) momentum signals Date 2022-01-03 NaN 0 ... ... ... 2023-12-19 550.0 0 [485 rows x 2 columns]
- zerohertzLib.quant.moving_average(data, short_window=40, long_window=80, threshold=0.0, ohlc='')[source]¶
단기 및 장기 이동 평균 기반 매수 및 매도 signal을 생성하는 함수
Note
Moving Average
Definition: 일정 기간 동안 평균화하여 추세 파악 및 noise 감소
매수 신호 (
+1
): 단기 이동 평균이 장기 이동 평균보다 높을 때 생성 (상승 추세)매도 신호 (
-1
): 단기 이동 평균이 장기 이동 평균보다 낮을 때 생성 (하락 추세)
- Parameters:
- Returns:
각 날짜에 대한 signal (
"signals"
) 정보- Return type:
pd.DataFrame
Examples
>>> zz.quant.moving_average(data) short_mavg long_mavg signals Date 2022-01-03 139375.000 139375.0000 0 ... ... ... ... 2023-12-19 102450.000 102337.1875 0 [485 rows x 3 columns]
- zerohertzLib.quant.rsi(data, lower_bound=20, upper_bound=80, window=30, ohlc='')[source]¶
RSI 기반 매수 및 매도 signal을 생성하는 함수
Note
RSI (Relative Strength Index)
- Definition
\(RS = \frac{Average\ Gain}{Average\ Loss}\)
\(RSI = 100 - \frac{100}{1+RS}\)
- Mean
-1
→0
: 과매수 상태에서 중립 상태로 변화 (매도 position 청산)0
→-1
: 과매수 상태로의 진입 (새로운 매도 position)+1
→0
: 과매도 상태에서 중립 상태로 변화 (매수 position 청산)0
→+1
: 과매도 상태로의 진입 (새로운 매수 position)
매수 신호 (
+1
): RSI 값이lower_bound
보다 낮을 때 생성 (과매도 상태)매도 신호 (
-1
): RSI 값이upper_bound
보다 높을 때 생성 (과매수 상태)
- Parameters:
- Returns:
각 날짜에 대한 signal (
"signals"
) 정보- Return type:
pd.DataFrame
Examples
>>> zz.quant.rsi(data) RSI signals Date 2022-01-03 NaN 0 ... ... ... 2023-12-19 35.671343 0 [485 rows x 2 columns]