%matplotlib inline
%time from hikyuu.interactive import *
warning: can't import TA-Lib, will be ignored! You can fetch ta-lib from https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib std::cout are redirected to python::stdout std::cerr are redirected to python::stderr 2023-10-14 02:22:48.762 [HKU-I] - Using SQLITE3 BaseInfoDriver (BaseInfoDriver.cpp:58) 2023-10-14 02:22:48.763 [HKU-I] - Loading market information... (StockManager.cpp:499) 2023-10-14 02:22:48.763 [HKU-I] - Loading stock type information... (StockManager.cpp:512) 2023-10-14 02:22:48.763 [HKU-I] - Loading stock information... (StockManager.cpp:426) 2023-10-14 02:22:48.816 [HKU-I] - Loading stock weight... (StockManager.cpp:529) 2023-10-14 02:22:49.158 [HKU-I] - Loading KData... (StockManager.cpp:134) 2023-10-14 02:22:49.162 [HKU-I] - Preloading all day kdata to buffer! (StockManager.cpp:157) 2023-10-14 02:22:49.163 [HKU-I] - Preloading all week kdata to buffer! (StockManager.cpp:160) 2023-10-14 02:22:49.163 [HKU-I] - Preloading all month kdata to buffer! (StockManager.cpp:163) 2023-10-14 02:22:49.176 [HKU-I] - 0.02s Loaded Data. (StockManager.cpp:145) Wall time: 1.09 s
s = sm['sz000001']
k = s.get_kdata(Query(-200))
#抽取K线收盘价指标,一般指标计算参数只能是指标类型,所以必须先将K线数据生成指标类型
c = CLOSE(k)
#计算收盘价的EMA指标
a = EMA(c)
#绘制指标
c.plot(legend_on=True)
a.plot(new=False, legend_on=True)
#绘制柱状图
a.bar()
#修正下柱状图,使其更美观
PRICELIST([x-9 for x in a]).bar()
print("k is a instance of KData:\n", k)
print("--------------------------\n")
kind = KDATA(k)
print("kind is a instance of Indicator:\n", kind)
k is a instance of KData: KData{ size : 200 stock: Stock(SZ, 000001, 平安银行, A股, 1, 1991-01-02 00:00:00, +infinity), query: KQuery(-200, 9223372036854775807, INDEX, DAY, NO_RECOVER) } -------------------------- kind is a instance of Indicator: Indicator{ name: KDATA size: 200 discard: 0 result sets: 6 params: params[kdata(KData): SZ000001, kpart(string): KDATA, ] support indicator param: False formula: KDATA }
#获取 ind 的结果集数量,如MACD通常返回3个结果集
r = kind.get_result_num()
print("result_num: ", r)
#获取第一个结果集
x = kind.get_result(0)
print(x)
result_num: 6 Indicator{ name: IndicatorImp size: 200 discard: 0 result sets: 1 params: params[kdata(KData): Null, ] support indicator param: False formula: IndicatorImp }
#以下效果相同
c1 = CLOSE(k)
c2 = KDATA_PART(k, 'close')
另外一个常用的特殊指标 PRICELIST将 Python 中的类 list 对象包装成ind。
x = PRICELIST([i for i in range(100)])
print(len(x), x)
100 Indicator{ name: PRICELIST size: 100 discard: 0 result sets: 1 params: params[data(PriceList): 100, discard(int): 0, kdata(KData): Null, result_index(int): 0, ] support indicator param: False formula: PRICELIST }
每一个指标函数,如EMA、HHV,调用后生成一个ind对象,该对象本身可以再次调用生成新的ind。无论指标函数还是 ind 对象调用生成 ind,都是立刻进行计算。
e1 = EMA(CLOSE(k), n=5)
e2 = e1(CLOSE(k))
e3 = e2
print(e1 == e2)
Indicator{ name: IndicatorImp size: 200 discard: 0 result sets: 1 params: params[kdata(KData): Null, ] support indicator param: False formula: IEma(CLOSE) == IEma(CLOSE) }
除在指标函数中指定参数外,可以通过 getParam、setParam 方法来获取和修改 ind 对象的参数。修改参数后,ind 本身并不会发生变化,需要调用生成新的 ind,新的 ind 才是使用新参数计算的结果。
e = EMA(c)
print(e)
print(e.get_param('n'))
e.plot(legend_on=True)
e.set_param('n', 30)
e = e(c)
e.plot(new=False, legend_on=True)
Indicator{ name: IEma size: 200 discard: 0 result sets: 1 params: params[kdata(KData): SZ000001, n(int): 22, ] support indicator param: True ind params: {} formula: IEma(CLOSE) } 22
查看 ind 参数。ind 参数支持:
#EMA指标有参数 "n",类型"i"代表整数
print(EMA())
Indicator{ name: IEma size: 0 discard: 0 result sets: 1 params: params[kdata(KData): Null, n(int): 22, ] support indicator param: True ind params: {} formula: IEma }
在交互工具里对TA-Lib进行了包装,命名方式统一为 TA_FUNC名称。其中,ta-lib指标的lookback属性,用discard属性代替。
x = TA_SMA(CLOSE(k))
print(x)
x.plot()
print(x.discard)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_26024\456156229.py in <module> ----> 1 x = TA_SMA(CLOSE(k)) 2 print(x) 3 x.plot() 4 5 print(x.discard) NameError: name 'TA_SMA' is not defined
个别的Ta-Lib函数需要两个数组参数,比如BETA、CORREL。此时需要利用特殊的 Indicator WEAVE 将两个数组包装到一个 ind 对象中。
query = Query(-200)
k1 = sm['sh000001'].get_kdata(query)
k2 = sm['sz000001'].get_kdata(query)
w = WEAVE(CLOSE(k1), CLOSE(k2))
print(w.get_result_num())
cr = TA_CORREL(w)
cr.plot()
在通道信等证券行情软件中,其技术指标中的窗口参数通常支持整数,也支持使用指标,如:
T1:=HHVBARS(H,120); {120内的最高点距今天的天数}
L120:=LLV(L,T1+1); {120内的最高点至今,这个区间的最低点}
*自 1.2.3 版本后,Hikyuu 也开始支持使用指标作为窗口参数*
h = HIGH(k)
l = LOW(k)
T1 = HHVBARS(h, 120)
L120 = LLV(l, T1+1)
L120.plot()
注意事项
由于无法区分 Indicator(ind) 形式时,ind 究竟是指标参数还是待计算的输出数据,此时如果希望 ind 作为参数,需要通过 IndParam 进行显示指定,如:EMA(IndParam(ind))。
最佳的方式,则是通过指定参数名,来明确说明使用的是参数:
x = EMA(c) # 以收盘价作为计算的输入
y = EMA(IndParam(c)) # 以收盘价作为 n 参数
z = EMA(n=c) # 以收盘价作为参数 n
# 或者以原型的方式,通过指定上下文计算
T1 = HHVBARS(H, 120)
L120 = LLV(L, T1+1)
L120.set_context(k)
L120.plot()