量化交易中N字型技术形态的实现,天勤,mindgo,python版同花顺,okex,huobi,binance等平台都可正常使用

量化中N字型技术形态的实现
最近一个客户提出了使用N字型技术形态量化交易的思路,本人比较擅长技术或数据统计的编写,这种自定义的略费了一些时间,大约一天完工,简单说一下思路。
在这里插入图片描述通过波段可以简单的看到,在k线波段的走势中和sdkj的波段有些类似,也就是skdj的金叉-死叉之间往往是大概率的波段高点,死叉-金叉则是波段的低点,当然因为有些时候行情的波动高点低可能会在其他的地方,认真观察会发现,当金叉死叉间的k线数量大于10根以上的话,基本上90%的概率就是波段的高低点。有了这个思路就比较好写了。
编写sdkj指标的数据,获取金叉死叉k线,获取金叉死叉之间的高低点即可,为了减小出错的概率,以大于10根的k线的波段为基准,依次从高点低到下一个金死叉求高低点,然后高点低存储然后进行判断即可。
分享部分代码供朋友们参考。

		     
            #存储走出的波段的最高最低点位
            lowest = []
            highest = []
           #记录所有的金叉死叉的list,包括id及方向
            _md = []
            #计算sdkj数据,并把数据放置到天勤web guid的附图中
            nn, mm = 15, 3
            lowv = k1['low'].rolling(nn).min()
            highv = k1['high'].rolling(nn).max()
            rsv = tl.EMA((k1['close'] - lowv) / (highv - lowv) * 100, mm)
            k1['k'] = tl.EMA(rsv, mm)            
            k1['d'] = tl.MA(k1['k'], mm)                
            k1['zero'] = 50           
            k1['crossup'] = tafunc.crossup(k1['d'], k1['zero'])
            k1['crossdown'] = tafunc.crossdown(k1['d'], k1['zero'])
            #非天勤可以去除下面的代码,此几行代码为在附图画sdkj指标
            k1['k.board'] = 'SKDJ'           
            k1['d.board']='SKDJ'
             k1['d.color'] = 0xFF9933CC   
            k1['d.width'] = 4   
            k1['zero.board']='SKDJ'
            k1['crossup.board'] = 'SKDJ'
            k1['crossdown.board'] = 'SKDJ'
            #遍历所有数据,存储_md
            for i in range(500):
                if k1['crossup'].iloc[i] == 1:
                    _md.append([i, 1])
                if k1['crossdown'].iloc[i] == 1:
                    _md.append([i, -1])
             #倒序查找4个波段之前的符合10根k线的id,N字其实只需要高低点各2个数据即可
            for i in range(-4, -len(_md), -1):
                ss = 0
                if _md[i][0] - _md[i - 1][0] >= 10:
                    ss = i
                    ss1 = _md[i][1]
                    print('获取到符合条件的点位', i, _md[i][0], _md[i][1])
                    break
            if ss != 0:
                #如果此点是死叉,则先找低点
                if ss1 == -1:
                    index1 = k1['high'].iloc[_md[ss - 1][0]:_md[ss][0]].idxmax()
                    num1 = k1['high'].iloc[index1]
                    highest.append(num1)                    
                    ss2 = ss
                    while ss2 < 0:
                        if index1 < _md[ss2 + 1][0] <= 499:
                            index1 = k1['low'].iloc[(index1):_md[ss2 + 1][0]].idxmin()
                            num2 = k1['low'].iloc[index1]
                            lowest.append(num2)
                            
                        if index1 < _md[ss2 + 2][0] <= 499:
                            index1 = k1['high'].iloc[index1:_md[ss2 + 2][0]].idxmax()
                            num3 = k1['high'].iloc[index1]
                            highest.append(num3)
                            
                        ss2 = ss2 + 2
                 #如果此点是金叉,则先找高点
                elif ss1 == 1:
                    index1 = k1['low'].iloc[_md[ss - 1][0]:_md[ss][0]].idxmin()
                    num1 = k1['low'].iloc[index1]
                    lowest.append(num1)
                    ss2 = ss                    
                    while ss2 < 0:
                        if index1 < _md[ss2 + 1][0] <= 499:
                            index1 = k1['high'].iloc[(index1):_md[ss2 + 1][0]].idxmax()
                            num2 = k1['high'].iloc[index1]
                            highest.append(num2)                            
                        if index1 < _md[ss2 + 2][0] <= 499:
                            index1 = k1['low'].iloc[index1:_md[ss2 + 2][0]].idxmin()
                            num3 = k1['low'].iloc[index1]
                            lowest.append(num3)                            
                        ss2 = ss2 + 2
			#数据筛选并正序高低点数据打印
			highest=highest[-2:]
            lowest=lowest[-2:]
            print(f'高点\n{highest}')
            print(f'低点\n{lowest}')
            
            

到了这里,下一步就是判断了,有了2个高点 2个低点,n字自然就出来了
上升的用2个低点,一个高点
下降的用2个高点,一个低点。
在这里插入图片描述以上代码在天勤,mindgo,python版同花顺,okex,huobi,binance等平台都可正常使用,用的指标为ema,我直接调用了talib的,也可以自定义,代码可以参考:

def ema(series, n):
    """
    指数加权移动平均线: 求series序列n周期的指数加权移动平均

        计算公式:
            ema(x, n) = 2 * x / (n + 1) + (n - 1) * ema(x, n).shift(1) / (n + 1)

        注意:
            1. n 需大于等于1
            2. 对距离当前较近的k线赋予了较大的权重

    Args:
        series (pandas.Series): 数据序列

        n (int): 周期

    Returns:
        pandas.Series: 指数加权移动平均线序列

    """
    ema_data = series.ewm(span=n, adjust=False).mean()
    return ema_data
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
天勤量化是一个专注于量化投资领域的技术团队或平台,他们可能涉及的技术之一是“三角形收敛策略”(Triangle Convergence),这是一种技术分析方法,用于识别股票价格趋势反转的可能性。在图形上,这种策略观察的是短期、期和长期移动平均线形成的三角形态,当这些均线接近并有可能交叉时,可能会被视为买入或卖出信号。 具体代码实现涉及到金融工程和算法交易,通常会用到Python的pandas库处理数据,NumPy进行数学计算,以及如backtrader、Zipline等量化交易平台进行回测。以下是一个简单的概念性的Python代码示例(不包含完整的交易执行部分): ```python import pandas as pd import numpy as np from ta import add_all_ta_features, dropna # 假设df_data是你获取的股票历史数据 def triangle_converge(df_data): df.ta.add_all_ta_features() # 计算短期(如5日)、期(如20日)和长期(如50日)移动平均线 short_rolling = df_data['close'].rolling(window=5).mean() mid_rolling = df_data['close'].rolling(window=20).mean() long_rolling = df_data['close'].rolling(window=50).mean() # 创建一个新的DataFrame,存储MA信息 ma_df = pd.DataFrame({'short': short_rolling, 'mid': mid_rolling, 'long': long_rolling}) # 检查是否形成三角形收敛 convergence_points = (ma_df[['short', 'mid']].abs().idxmin()) & (ma_df[['mid', 'long']].abs().idxmin()) return convergence_points # 使用这个函数检查数据的三角形收敛点 convergence_points = triangle_converge(df_data) ``` 请注意,实际的交易策略应包括风险管理、资金管理等更多复杂因素,并且在生产环境还需要考虑实时数据流、交易所API调用以及其他技术细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_1985159637

感谢你的支持!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值