Source code for czsc.signals.ta

# -*- coding: utf-8 -*-
"""
author: zengbin93
email: zeng_bin8888@163.com
create_dt: 2021/11/21 17:48
describe: 技术分析相关信号的计算

ta-lib 安装包:https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib
"""
import numpy as np
from collections import OrderedDict
from deprecated import deprecated

from .. import analyze
from ..objects import Signal
from ..enum import Freq
try:
    from ..utils.ta1 import MACD, SMA
except:
    from ..utils.ta import MACD, SMA


[docs]def get_s_single_k(c: analyze.CZSC, di: int = 1) -> OrderedDict: """获取倒数第i根K线的单K信号""" if c.freq not in [Freq.D, Freq.W]: return OrderedDict() if len(c.bars_raw) < di: return OrderedDict() s = OrderedDict() freq: Freq = c.freq k1 = str(freq.value) default_signals = [ Signal(k1=k1, k2=f"倒{di}K", k3="状态", v1="其他", v2='其他', v3='其他'), ] for signal in default_signals: s[signal.key] = signal.value k = c.bars_raw[-di] if k.close > k.open: v = Signal(k1=k1, k2=f"倒{di}K", k3="状态", v1="上涨") else: v = Signal(k1=k1, k2=f"倒{di}K", k3="状态", v1="下跌") s[v.key] = v.value return s
[docs]def get_s_three_k(c: analyze.CZSC, di: int = 1) -> OrderedDict: """倒数第i根K线的三K信号 :param c: CZSC 对象 :param di: 最近一根K线为倒数第i根 :return: 信号字典 """ assert di >= 1 freq: Freq = c.freq k1 = str(freq.value) k2 = f"倒{di}K" s = OrderedDict() v = Signal(k1=k1, k2=k2, k3="三K形态", v1="其他", v2='其他', v3='其他') s[v.key] = v.value if len(c.bars_ubi) < 3 + di: return s if di == 1: tri = c.bars_ubi[-3:] else: tri = c.bars_ubi[-3 - di + 1:-di + 1] if tri[0].high > tri[1].high < tri[2].high: v = Signal(k1=k1, k2=k2, k3="三K形态", v1="底分型") elif tri[0].high < tri[1].high < tri[2].high: v = Signal(k1=k1, k2=k2, k3="三K形态", v1="向上走") elif tri[0].high < tri[1].high > tri[2].high: v = Signal(k1=k1, k2=k2, k3="三K形态", v1="顶分型") elif tri[0].high > tri[1].high > tri[2].high: v = Signal(k1=k1, k2=k2, k3="三K形态", v1="向下走") else: v = None if v and "其他" not in v.value: s[v.key] = v.value return s
[docs]@deprecated(reason="使用 czsc.signals.tas 中对应的信号替换") def get_s_macd(c: analyze.CZSC, di: int = 1) -> OrderedDict: """获取倒数第i根K线的MACD相关信号""" freq: Freq = c.freq s = OrderedDict() k1 = str(freq.value) k2 = f"倒{di}K" default_signals = [ Signal(k1=k1, k2=k2, k3="DIF多空", v1="其他", v2='其他', v3='其他'), Signal(k1=k1, k2=k2, k3="DIF方向", v1="其他", v2='其他', v3='其他'), Signal(k1=k1, k2=k2, k3="DEA多空", v1="其他", v2='其他', v3='其他'), Signal(k1=k1, k2=k2, k3="DEA方向", v1="其他", v2='其他', v3='其他'), Signal(k1=k1, k2=k2, k3="MACD多空", v1="其他", v2='其他', v3='其他'), Signal(k1=k1, k2=k2, k3="MACD方向", v1="其他", v2='其他', v3='其他'), ] for signal in default_signals: s[signal.key] = signal.value if len(c.bars_raw) < 100: return s if di == 1: close = np.array([x.close for x in c.bars_raw[-100:]]) else: close = np.array([x.close for x in c.bars_raw[-100-di+1:-di+1]]) dif, dea, macd = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9) # DIF 多空信号 dif_base = sum([abs(dif[-2] - dif[-1]), abs(dif[-3] - dif[-2]), abs(dif[-4] - dif[-3])]) / 3 if dif[-1] > dif_base: v = Signal(k1=k1, k2=k2, k3="DIF多空", v1="多头") elif dif[-1] < -dif_base: v = Signal(k1=k1, k2=k2, k3="DIF多空", v1="空头") else: v = Signal(k1=k1, k2=k2, k3="DIF多空", v1="模糊") s[v.key] = v.value if dif[-1] > dif[-2] > dif[-3]: v = Signal(k1=k1, k2=k2, k3="DIF方向", v1="向上") elif dif[-1] < dif[-2] < dif[-3]: v = Signal(k1=k1, k2=k2, k3="DIF方向", v1="向下") else: v = Signal(k1=k1, k2=k2, k3="DIF方向", v1="模糊") s[v.key] = v.value # DEA 多空信号 dea_base = sum([abs(dea[-2] - dea[-1]), abs(dea[-3] - dea[-2]), abs(dea[-4] - dea[-3])]) / 3 if dea[-1] > dea_base: v = Signal(k1=k1, k2=k2, k3="DEA多空", v1="多头") elif dea[-1] < -dea_base: v = Signal(k1=k1, k2=k2, k3="DEA多空", v1="空头") else: v = Signal(k1=k1, k2=k2, k3="DEA多空", v1="模糊") s[v.key] = v.value # DEA 方向信号 if dea[-1] > dea[-2]: v = Signal(k1=k1, k2=k2, k3="DEA方向", v1="向上") elif dea[-1] < dea[-2]: v = Signal(k1=k1, k2=k2, k3="DEA方向", v1="向下") else: v = Signal(k1=k1, k2=k2, k3="DEA方向", v1="模糊") s[v.key] = v.value # MACD 多空信号 if macd[-1] >= 0: v = Signal(k1=k1, k2=k2, k3="MACD多空", v1="多头") else: v = Signal(k1=k1, k2=k2, k3="MACD多空", v1="空头") s[v.key] = v.value # MACD 方向信号 if macd[-1] > macd[-2] > macd[-3]: v = Signal(k1=k1, k2=k2, k3="MACD方向", v1="向上") elif macd[-1] < macd[-2] < macd[-3]: v = Signal(k1=k1, k2=k2, k3="MACD方向", v1="向下") else: v = Signal(k1=k1, k2=k2, k3="MACD方向", v1="模糊") s[v.key] = v.value return s
[docs]@deprecated(reason="使用 czsc.signals.tas 中对应的信号替换") def get_s_sma(c: analyze.CZSC, di: int = 1, t_seq=(5, 10, 20, 60)) -> OrderedDict: """获取倒数第i根K线的SMA相关信号""" freq: Freq = c.freq s = OrderedDict() k1 = str(freq.value) k2 = f"倒{di}K" for t in t_seq: x1 = Signal(k1=k1, k2=k2, k3=f"SMA{t}多空", v1="其他", v2='其他', v3='其他') x2 = Signal(k1=k1, k2=k2, k3=f"SMA{t}方向", v1="其他", v2='其他', v3='其他') s[x1.key] = x1.value s[x2.key] = x2.value n = max(t_seq) + 10 if len(c.bars_raw) < n: return s if di == 1: close = np.array([x.close for x in c.bars_raw[-n:]]) else: close = np.array([x.close for x in c.bars_raw[-n-di+1:-di+1]]) for t in t_seq: sma = SMA(close, timeperiod=t) if close[-1] >= sma[-1]: v1 = Signal(k1=k1, k2=k2, k3=f"SMA{t}多空", v1="多头") else: v1 = Signal(k1=k1, k2=k2, k3=f"SMA{t}多空", v1="空头") s[v1.key] = v1.value if sma[-1] >= sma[-2]: v2 = Signal(k1=k1, k2=k2, k3=f"SMA{t}方向", v1="向上") else: v2 = Signal(k1=k1, k2=k2, k3=f"SMA{t}方向", v1="向下") s[v2.key] = v2.value return s