通达信公式转Python 通达信指标转换_java

前言

通达信公式转Python 通达信指标转换_人工智能_02

通达信的公式编写功能非常流行,很多高手都是在通达信上编写公式来分析股票的。

作为过来人,建议大家在初期的策略研究阶段,选一个通用的平台进行策略研究,因为有现成的功能模块可以调用,这样就能把精力聚焦在设计策略层面。

当策略稳定之后,可以聚焦在个性化的应用层面。毕竟通用平台使用方式和自己的风格并不是百分之百契合的。

另外通用平台功能模块的底层实现逻辑是个黑箱子,我们只能靠猜测,有时候策略执行的结果不符合预期的时候,就很难去定位排查。

所以,从长远来看,当策略稳定后,建议把策略移植到自己的系统上面,这样对策略的运行能更了如指掌,增强对策略的信心,同时也更能符合自己风格去执行。 

通达信公式的表达十分简洁,其实Python也是以优雅著称的,那么怎么把通达信公式转换为Python语言呢? 

本期就以通达信“底部盘整,均线粘合,单阳突破选股公式”为例,手把手给大家展示下如何把通达信公式翻译为Python语句。

通达信公式转Python 通达信指标转换_python_03

转换公式

通达信公式转Python 通达信指标转换_机器学习_04

“底部盘整,均线粘合,单阳突破选股公式” 的总体思路是:股价在M日均线上下波动不超过10%,20日、30日、60日、120日均线收敛,当日涨幅超过5%且股价创M日新高。

此处的M我们选用偏中的参数60日。

完整的公式如下所示(

PZ := MA(CLOSE, M);
PZ2 := HHV(HIGH, M);
PZ3 := LLV(LOW, M);
PZ4 := (PZ2 - PZ1) / PZ1;
PZ5 := (PZ1 - PZ3) / PZ1;
PZ := REF(PZ4, 1) < 0.1 AND REF(PZ5, 1) < 0.1;
MA20:=MA(C,20);
MA30:=MA(C,30);
MA60:=MA(C,60);
MA120:=MA(C,120);
MAMAX:=MAX(MAX(MAX(MA10,MA20),MA50),MA120);
MAMIN:=MIN(MIN(MIN(MA10,MA20),MA50),MA120);
SL:=MAMAX/MAMIN<1.05;
ZF := C/REF(C, 1) > 1.05;
TP1 := HHV(HIGH, M);
TP := HIGH = TP1;
PZ AND SL AND ZF AND TP;

通达信指标转换说明:

  • 因为语法的问题,我们需要使用 `&` 代替 `and` ,用 `|` 代替 `or`
  • `HHV`表示n天内最大值
  • `LLV`表示n天内最小值
  • `REF`表示n天前的数据
  • `MIN`表示两个序列取最小值
  • `MAX`表示两个序列取最大值
  • `OPEN` `O`表示开盘价
  • `CLOSE` `C`表示收盘价
  • `HIGH` `H`表示最高价
  • `LOW` `L`表示最低价
  • `VOLUME` `V` `VOL`表示成交量

接下来我们就用Python来实现一番:

@staticmethod
def bottom_average_break(name, code, edate_val, stock_data, patlog_obj, **kwargs):
    # 底部盘整,均线粘合,单阳突破 通达信公式
    # 股价在M日均线上下波动不超过10%,20日、30日、60日、120日均线收敛,当日涨幅超过5%且股价创M日新高
    """
    :param name:
    :param code:
    :param edate_val:
    :param stock_data:
    :param patlog_obj:
    :param kwargs:
    :return:
    """
    M = 60 # 取周期值
    PZ1 = stock_data["收盘价"].rolling(window=M).mean() # 计算M日的移动平均线
    PZ2 = stock_data["最高价"].rolling(window=M).max() # 计算M日的最高价
    PZ3 = stock_data["最低价"].rolling(window=M).max() # 计算M日的最低价


    PZ4 = (PZ2 - PZ1) / PZ1 # 计算向上波动幅度
    PZ5 = (PZ1 - PZ3) / PZ1 # 计算向下波动幅度
    PZ = (PZ4.shift(1) < 0.1) & (PZ5.shift(1) < 0.1) # 选出符合上下波动幅度范围的数据


    MA10 = stock_data["收盘价"].rolling(window=20).mean() # 计算10日的移动平均线
    MA20 = stock_data["收盘价"].rolling(window=30).mean() # 计算20日的移动平均线
    MA50 = stock_data["收盘价"].rolling(window=60).mean() # 计算50日的移动平均线
    MA120 = stock_data["收盘价"].rolling(window=120).mean() # 计算120日的移动平均线
    MAMAX = np.maximum(np.maximum(np.maximum(MA20, MA30), MA60), MA120) # 选出各均线中最大值
    MAMIN = np.minimum(np.minimum(np.minimum(MA20, MA30), MA60), MA120) # 选出各均线中最小值
    SL = MAMAX / MAMIN < 1.05 # 选出符合收敛幅度的数据
    ZF = stock_data["收盘价"]/stock_data["收盘价"].shift(1) > 1.05 # 选出符合涨跌幅的数据
    TP1 = stock_data["最高价"].rolling(window=M).max() # 选出30日的最高价
    TP = stock_data["最高价"] == TP1 # 选出最高价是30日的最高价的数据
    if (PZ & SL & ZF & TP)[-1] == True:
        # 输出满足要求的股票
        patlog_obj.re_print("符合特征: 股票 {},代码 {}".format(name, code))

我们把“底部盘整,均线粘合,单阳突破选股公式”作为策略添加到QTYX的形态选股里面了,大家马上就能体验到这个选股公式的效果了!

通达信公式转Python 通达信指标转换_通达信公式转Python_05