请选择 进入手机版 | 继续访问电脑版
联系我们0592-5620660
电子邮箱info@immsee.cn

通达信公式改写成python代码

[复制链接]
admin 发表于 2021-1-15 17:18:47
119 0
[color=rgba(0, 0, 0, 0.75)]
[url=]funcat这个包有一部分功能,但大部分通达信函数是不支持的,[/url]



甚至有一些通达信用多维向量计算的方式,funcat只做成一维数据的循环
我自己对此有需求,所以实现了一部分代码
为什么设VIP呢,毕竟是我自己设计的,包括矩阵计算、向量循环,这些我的代码计算速度至少是比别快一些的,
其次,看到这有需求的朋友,
你如果是有通达信公式需要在python里回测的,可以直接留言联系我,我有一整套优化方案,
形态识别的,AI可以实现形态的缩放,还有因子阈值的匹配度调整,而且可以成功提高胜率(我自己的已经实现

  1. def REF(tp1, n):  
  2.     i = 0
  3.     ZB_l = []
  4.     y = 0
  5.     while i < n:
  6.         y=list(tp1)[i]   
  7.         ZB_l.append(y)
  8.         i=i+1
  9.     while i < len(tp1):  
  10.         y=list(tp1)[i-n]
  11.         ZB_l.append(y)  
  12.         i = i + 1         
  13. #    ZB_s = pd.Series(ZB_l)  
  14.     return ZB_l#[-1]s

  15. def zig(k,x):
  16.     #x = 0.055
  17. #    k = CLOSE.tolist()
  18.     #d = df["trade_date"]
  19. #    d = df['date'].tolist()
  20.     # 循环前的变量初始化
  21.     # 端点 候选点 扫描点 端点列表 拐点线列表 趋势状态
  22.     peer_i = 0
  23.     candidate_i = None
  24.     scan_i = 0
  25.     peers = [0]
  26. #    z = np.zeros(len(k))
  27.     state = ZIG_STATE_START
  28.     while True:
  29.         #print(peers)
  30.         scan_i += 1
  31.         if scan_i == len(k) - 1:
  32.             # 扫描到尾部
  33.             if candidate_i is None:
  34.                 peer_i = scan_i
  35.                 peers.append(peer_i)
  36.             else:
  37.                 if state == ZIG_STATE_RISE:
  38.                     if k[scan_i] >= k[candidate_i]:
  39.                         peer_i = scan_i
  40.                         peers.append(peer_i)
  41.                     else:
  42.                         peer_i = candidate_i
  43.                         peers.append(peer_i)
  44.                         peer_i = scan_i
  45.                         peers.append(peer_i)
  46.                 elif state == ZIG_STATE_FALL:
  47.                     if k[scan_i] <= k[candidate_i]:
  48.                         peer_i = scan_i
  49.                         peers.append(peer_i)
  50.                     else:
  51.                         peer_i = candidate_i
  52.                         peers.append(peer_i)
  53.                         peer_i = scan_i
  54.                         peers.append(peer_i)
  55.             break

  56.         if state == ZIG_STATE_START:
  57.             if k[scan_i] >= k[peer_i] * (1 + x):
  58.                 candidate_i = scan_i
  59.                 state = ZIG_STATE_RISE
  60.             elif k[scan_i] <= k[peer_i] * (1 - x):
  61.                 candidate_i = scan_i
  62.                 state = ZIG_STATE_FALL
  63.         elif state == ZIG_STATE_RISE:
  64.             if k[scan_i] >= k[candidate_i]:
  65.                 candidate_i = scan_i
  66.             elif k[scan_i] <= k[candidate_i]*(1-x):
  67.                 peer_i = candidate_i
  68.                 peers.append(peer_i)
  69.                 state = ZIG_STATE_FALL
  70.                 candidate_i = scan_i
  71.         elif state == ZIG_STATE_FALL:
  72.             if k[scan_i] <= k[candidate_i]:
  73.                 candidate_i = scan_i
  74.             elif k[scan_i] >= k[candidate_i]*(1+x):
  75.                 peer_i = candidate_i
  76.                 peers.append(peer_i)
  77.                 state = ZIG_STATE_RISE
  78.                 candidate_i = scan_i
  79.    
  80.     #线性插值, 计算出zig的值            
  81. #    for i in range(len(peers) - 1):
  82. #        peer_start_i = peers[i]
  83. #        peer_end_i = peers[i+1]
  84. #        start_value = k[peer_start_i]
  85. #        end_value = k[peer_end_i]
  86. #        a = (end_value - start_value)/(peer_end_i - peer_start_i)# 斜率
  87. #        for j in range(peer_end_i - peer_start_i +1):
  88. #            z[j + peer_start_i] = start_value + a*j#z是zig线
  89.     return [k[i] for i in peers]#,[d[i] for i in peers]
  90.    
  91. def LLV(s, n):
  92.     return s.rolling(n).min()

  93. def EMA(s, n):
  94.     return s.rolling(n).ema()

  95. def HHV(s, n):
  96.     if type(n)==int:
  97.         return s.rolling(n).max()
  98.     else:#当n不是单个值而是一个序列
  99.         result = [0]*len(s)
  100.         n=list(n)
  101.         for i in range(1,len(s)):
  102.             s_temp = s[0:i]
  103.             result[i] = s_temp[-int(n[i]):].max()#过去n天
  104.         return result


  105. def CROSS(cond1, cond2):
  106.     '''x1上穿x2'''
  107.     return np.where(eval(cond1)>eval(cond2),1,0).tolist()

  108. def barslast(df):
  109.     lst=list(df)
  110.     if sum(lst)>0:
  111.         first_=lst.index(1)#出现1的所有位置
  112.         bar_slast=[]
  113.         for i in range(first_):
  114.             bar_slast.append(np.nan)
  115.         for i in range(first_,len(lst)):#出现1后往后计数
  116.             if lst[i]==1:
  117.                 count_=0
  118.                 bar_slast.append(0)
  119.             else:
  120.                 count_+=1
  121.                 bar_slast.append(count_)
  122.         return bar_slast
  123.         
  124. # @nb.jit
  125. def COUNT(cond, n):
  126.     # TODO lazy compute
  127.     series = cond
  128.     size = len(cond) - n
  129.     try:
  130.         result = np.full(size, 0, dtype=np.int)
  131.     except :
  132.         pass
  133.     for i in range(size - 1, 0, -1):
  134.         s = series[-n:]
  135.         result[i] = len(s[s == True])
  136.         series = series[:-1]
  137.     return result

  138. # @nb.jit
  139. def COUNT_(cond, n):
  140.     if type(n)!=int:
  141.         #两列序列一一 正序对应
  142.         result = [0]*len(cond)
  143.         cond=list(cond)
  144.         n=list(n)
  145.         for i in range(1,len(cond)):
  146.             cond_temp = cond[0:i]
  147.             cond_n_ture=cond_temp[-n[i]:]#过去n天
  148.             result[i] = cond_n_ture[cond_n_ture == True]
  149.         return np.array(result)
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发表新帖

推荐学习课程

阅读排行

QQ| 

Powered by iMMSEE Inc. ( 闽ICP备09016880号 )

返回顶部 返回列表