Source code for czsc.signals.vol

# -*- coding: utf-8 -*-
"""
author: zengbin93
email: zeng_bin8888@163.com
create_dt: 2021/8/25 17:43
describe: 成交量相关信号
"""
import numpy as np
from collections import OrderedDict
from czsc import CZSC, Freq, Signal
from czsc.utils.ta import SMA


[docs]def get_s_vol_single_sma(c: CZSC, di: int = 1, t_seq=(5, 10, 20, 60)) -> OrderedDict: """获取倒数第i根K线的成交量单均线信号""" 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 min_k_nums = max(t_seq) + 10 if len(c.bars_raw) < min_k_nums: return s if di == 1: vol = np.array([x.vol for x in c.bars_raw[-min_k_nums:]], dtype=np.float) else: vol = np.array([x.vol for x in c.bars_raw[-min_k_nums-di+1:-di+1]], dtype=np.float) for t in t_seq: sma = SMA(vol[-t-10:], timeperiod=t) if vol[-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
[docs]def get_s_vol_double_sma(c: CZSC, di: int = 1, t1: int = 5, t2: int = 20) -> OrderedDict: """获取倒数第i根K线的成交量双均线信号""" assert t2 > t1, "t2必须是长线均线,t1为短线均线" freq: Freq = c.freq s = OrderedDict() k1 = str(freq.value) k2 = f"倒{di}K成交量" k3 = f"{t1}#{t2}双均线" v = Signal(k1=k1, k2=k2, k3=k3, v1="其他", v2='其他', v3='其他') s[v.key] = v.value min_len_bars = t2 + 10 if len(c.bars_raw) < min_len_bars: return s if di == 1: vol = np.array([x.vol for x in c.bars_raw[-min_len_bars:]], dtype=np.float) else: vol = np.array([x.vol for x in c.bars_raw[-min_len_bars-di+1: -di+1]], dtype=np.float) sma1 = SMA(vol, timeperiod=t1) sma2 = SMA(vol, timeperiod=t2) if sma2[-1] >= sma1[-1]: v = Signal(k1=k1, k2=k2, k3=k3, v1="多头") else: v = Signal(k1=k1, k2=k2, k3=k3, v1="空头") s[v.key] = v.value return s
[docs]def get_s_amount_n(c: CZSC, di=1, n=10, total_amount=10): """N日总成交额信号""" s = OrderedDict() if c.freq != Freq.D or len(c.bars_raw) <= di + n + 5: return s k1 = str(c.freq.value) k2 = f"倒{di}K成交额" k3 = f"近{n}日累计超{total_amount}亿" if di == 1: bars = c.bars_raw[-n:] else: bars = c.bars_raw[-n-di+1: -di+1] assert len(bars) == n n_total_amount = sum([x.amount for x in bars]) if n_total_amount > (total_amount * 1e8): v1 = "是" else: v1 = "否" v = Signal(k1=k1, k2=k2, k3=k3, v1=v1) s[v.key] = v.value return s