信号指示器|SG
信号指示器负责产生买入、卖出信号。
公共参数:
alternate (bool|True) :买入和卖出信号是否交替出现。单线型的信号通常通过拐点、斜率等判断信号的产生,此种情况下可能出现连续出现买入信号或连续出现卖出信号的情况,此时可通过该参数控制买入、卖出信号是否交替出现。而双线交叉型的信号通常本身买入和卖出已经是交替出现,此时该参数无效。
cycle (bool|False) : 配合 PF, 仅在PF调仓周期内计算
support_borrow_stock (bool|False) : 支持发出空头信号
通用信号指示器
通常使用技术指标判断买入、卖出时,依据的是快线和慢线的交叉、或是单曲线的拐点。下面的通用信号指示器足够应付大部分的情况。
| 代码 | 名称 | 描述 |
|---|---|---|
| SG_Cross | 双线交叉指示器 | 当快线从下向上穿越慢线时,买入; 当快线从上向下穿越慢线时,卖出。 |
| SG_CrossGold | 金叉指示器 | 当快线从下向上穿越慢线且快线和慢线的方向都是向上时为金叉,买入; 当快线从上向下穿越慢线且快线和慢线的方向都是向下时死叉,卖出。 |
| SG_Single | 单线拐点信号指示器 | 生成单线拐点信号指示器。使用《精明交易者》中给出的曲线拐点算法判断曲线趋势 |
| SG_Single2 | 单线拐点信号指示器2 | 生成单线拐点信号指示器。使用《精明交易者》中给出的曲线拐点算法判断曲线趋势 |
| SG_Flex | 自交叉单线拐点指示器 | 使用自身的EMA(slow_n)作为慢线,自身作为快线。 快线向上穿越慢线买入, 快线向下穿越慢线卖出。 |
| SG_Bool | 布尔信号指示器 | 使用运算结果为类似bool数组的Indicator分别作为买入、卖出指示。 |
| SG_OneSide | 单边信号指示器 | 根据输入指标构建单边信号(单纯的只包含买入或卖出信号), 如果指标值大于0,则加入信号 |
| SG_Buy | 单边买入信号指示器 | SG_OneSide 简化模式 |
| SG_OneSell | 单边卖出信号指示器 | SG_OneSide简化模式 |
| SG_Band | 区间突破信号指示器 | 指标区间指示器, 当指标超过上轨时,买入; 当指标低于下轨时,卖出。 |
| SG_AllwaysBuy | 持续买入信号指示器 | 一个特殊的SG,持续每天发出买入信号,通常配合 PF 使用 |
| SG_Cycle | PF调仓周期买入信号指示器 | 一个特殊的SG,配合PF使用,以 PF 调仓周期为买入信号 |
| SG_Add SG_Mul SG_Sub SG_Div |
SG运算辅助 | 由于 SG 的 alternate 默认为 True, 在使用如 "sg1 + sg2 + sg3" 的形式时,容易忽略 sg1 + sg2 的 alternate 属性 建议使用: SG_Add(sg1, sg2, False) + sg3 来避免 alternate 的问题 |
双线交叉信号指示器
金叉信号指示器
单线拐点信号指示器
- hikyuu.trade_sys.SG_Single(ind[, filter_n=10, filter_p=0.1])
生成单线拐点信号指示器。使用《精明交易者》 [BOOK1] 中给出的曲线拐点算法判断曲线趋势,公式见下:
filter = percentage * STDEV((AMA-AMA[1], N) Buy When AMA - AMA[1] > filter or Buy When AMA - AMA[2] > filter or Buy When AMA - AMA[3] > filter
- 参数:
ind (Indicator)
filer_n (int) -- N日周期
filter_p (float) -- 过滤器百分比
- 返回:
信号指示器
自交叉单线拐点指示器
布尔信号指示器
单边信号指示器
区间突破信号指示器
- hikyuu.trade_sys.SG_Band(ind, lower, upper)
指标区间指示器, 当指标超过上轨时,买入; 当指标低于下轨时,卖出。
SG_Band(MA(C, n=10), 100, 200) SG_Band(CLOSE, MA(LOW), MA(HIGH))
持续买入信号指示器
- hikyuu.trade_sys.SG_AllwaysBuy()
一个特殊的SG,持续每天发出买入信号,通常配合 PF 使用
PF调仓周期买入信号指示器
- hikyuu.trade_sys.SG_Cycle()
一个特殊的SG,配合PF使用,以 PF 调仓周期为买入信号
自定义信号指示器
快速创建不带私有属性的自定义信号指示器
- hikyuu.trade_sys.crtSG(func, params={}, name='crtSG')
快速创建自定义不带私有属性的信号指示器
- 参数:
func -- 信号策略函数
params ({}) -- 参数字典
name (str) -- 自定义名称
- 返回:
自定义信号指示器实例
示例:
#!/usr/bin/python
# -*- coding: utf8 -*-
# cp936
# ===============================================================================
# Aothor: fasiondog
# History: 20160407, Added by fasiondog
# ===============================================================================
from hikyuu import *
def TurtleSG(self, k):
n = self.get_param("n")
c = CLOSE(k)
h = REF(HHV(c, n), 1) # 前n日高点
L = REF(LLV(c, n), 1) # 前n日低点
for i in range(h.discard, len(k)):
if (c[i] >= h[i]):
self._add_buy_signal(k[i].datetime)
elif (c[i] <= L[i]):
self._add_sell_signal(k[i].datetime)
if __name__ == "__main__":
from examples_init import *
sg = crtSG(TurtleSG, {'n': 20}, 'TurtleSG')
s = get_stock("sh000001")
k = s.get_kdata(Query(-500))
# 只有设置交易对象时,才会开始实际计算
sg.to = k
dates = k.get_datetime_list()
for d in dates:
if (sg.should_buy(d)):
print("买入:%s" % d)
elif (sg.should_sell(d)):
print("卖出: %s" % d)
自定义的信号指示器接口:
SignalBase._calculate()- 【必须】子类计算接口SignalBase._clone()- 【必须】克隆接口SignalBase._reset()- 【可选】重载私有变量
示例1(不含私有变量,海龟交易策略):
#!/usr/bin/python
# -*- coding: utf8 -*-
# cp936
# ===============================================================================
# Aothor: fasiondog
# History: 20160407, Added by fasiondog
# ===============================================================================
from hikyuu import *
class TurtleSignal(SignalBase):
def __init__(self, n=20):
super(TurtleSignal, self).__init__("TurtleSignal")
self.set_param("n", 20)
def _clone(self):
return TurtleSignal()
def _calculate(self, k):
n = self.get_param("n")
c = CLOSE(k)
h = REF(HHV(c, n), 1) # 前n日高点
L = REF(LLV(c, n), 1) # 前n日低点
for i in range(h.discard, len(k)):
if (c[i] >= h[i]):
self._add_buy_signal(k[i].datetime)
elif (c[i] <= L[i]):
self._add_sell_signal(k[i].datetime)
if __name__ == "__main__":
from examples_init import *
sg = TurtleSignal()
s = get_stock("sh000001")
k = s.get_kdata(Query(-500))
# 只有设置交易对象时,才会开始实际计算
sg.to = k
dates = k.get_datetime_list()
for d in dates:
if (sg.should_buy(d)):
print("买入:%s" % d)
elif (sg.should_sell(d)):
print("卖出: %s" % d)
示例2(含私有属性):
class SignalPython(SignalBase):
def __init__(self):
super(SignalPython, self).__init__("SignalPython")
self._x = 0 #私有属性
self.setParam("test", 30)
def _reset(self):
self._x = 0
def _clone(self):
p = SignalPython()
p._x = self._x
return p
def _calculate(self, k):
self._addBuySignal(Datetime(201201210000))
self._addSellSignal(Datetime(201201300000))
信号指示器基类
- class hikyuu.trade_sys.SignalBase
信号指示器基类
- name 名称
- __init__(self[, name="SignalBase"])
- 参数:
name (str) -- 名称
- get_param(self, name)
获取指定的参数
- 参数:
name (str) -- 参数名称
- 返回:
参数值
- 抛出:
out_of_range -- 无此参数
- set_param(self, name, value)
设置参数
- 参数:
name (str) -- 参数名称
value (int | bool | float | string) -- 参数值
- 抛出:
logic_error -- Unsupported type! 不支持的参数类型
- next_time_should_buy(self)
下一时刻是否可以买入,相当于最后时刻是否指示买入
- next_time_should_sell(self)
下一时刻是否可以卖出,相当于最后时刻是否指示卖出
- get_buy_signal(self)
获取所有买入指示日期列表
- 返回类型:
- get_sell_signal(self)
获取所有卖出指示日期列表
- 返回类型:
- reset(self)
复位操作
- clone(self)
克隆操作
- _calculate(self, kdata)
【重载接口】子类计算接口
- _reset(self)
【重载接口】子类复位接口,复位内部私有变量
- _clone(self)
【重载接口】子类克隆接口