如何使用Python判断牛熊

开发 后端
有许多方法可以判断谁是公牛还是空头,而艾达透视指标的“牛熊力量指标”就是其中的一种,它使用简单的公式来近似估算这种隐含的技术实力。今天,我们将对指标进行编码和回测,然后从客观的角度对其进行判断。

[[387385]]

本文转载自微信公众号「区块链研究实验室」,作者链三丰。转载本文请联系区块链研究实验室公众号。  

 

有许多方法可以判断谁是公牛还是空头,而艾达透视指标的“牛熊力量指标”就是其中的一种,它使用简单的公式来近似估算这种隐含的技术实力。今天,我们将对指标进行编码和回测,然后从客观的角度对其进行判断。

创建牛市和熊市实力指数

上古雷指数MEAs数字购销压力量和两个柱状图,其中一个就是所谓的多头力量和其他的空头力量的。直方图是根据以下公式计算的:

EMA变量指的是指数移动平均线,它是一种移动平均线,将更多的权重放在最近的值上。

可以使用以下功能来计算指数移动平均值:

def ma(Data, lookback, what, where): 
     
    for i in range(len(Data)): 
      try: 
        Data[i, where] = (Data[i - lookback + 1:i + 1, what].mean()) 
         
            except IndexError: 
                pass 
    return Data 
def ema(Data, alpha, lookback, what, where): 
     
    # alpha is the smoothing factor 
    # window is the lookback period 
    # what is the column that needs to have its average calculated 
    # where is where to put the exponential moving average 
     
    alpha = alpha / (lookback + 1.0) 
    beta  = 1 - alpha 
     
    # First value is a simple SMA 
    Data = ma(Data, lookback, what, where
     
    # Calculating first EMA 
    Data[lookback + 1, where] = (Data[lookback + 1, what] * alpha) + (Data[lookback, where] * beta)         
    # Calculating the rest of EMA 
    for i in range(lookback + 2, len(Data)): 
      try: 
        Data[i, where] = (Data[i, what] * alpha) + (Data[i - 1, where] * beta) 
         
            except IndexError: 
                pass 
    return Data 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

第一个面板中的EURUSD和50周期的牛熊指标

上面显示了EURUSD每小时数据,第二个面板中有50个周期的牛熊指标。在继续执行指标代码之前,我们必须编写两个简单的函数:

def deleter(Data, index, times): 
     
    for i in range(1, times + 1): 
     
        Data = np.delete(Data, index, axis = 1)return Data 
    
def jump(Data, jump): 
     
    Data = Data[jump:, ] 
     
    return Data 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

现在,我们准备好代码了。记住要准备好OHLC阵列。

def bull_bear_power(Data, lookback, what, high, low, where): 
     
    # Adding the required columns 
    Data = adder(Data, 3) 
     
    # Calculating the exponential moving average 
    Data = ema(Data, 2, lookback, what, where)     
     
    # Calculating the Bull Power 
    Data[:, where + 1] = Data[:, high] - Data[:, where
     
    # Calculating the Bear Power 
    Data[:, where + 2] = Data[:, where] - Data[:, low] 
     
    # Deleting initial empty rows 
    Data = jump(Data, lookback) 
     
    return Data 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

USDCHF位于第一个面板中,并且是50周期的牛熊指标。

要对上面的图表进行编码,我们可以使用以下函数:

def indicator_plot_double_bull_bear(Data, name = '', name_ind = '', window = 250): 
  fig, ax = plt.subplots(2, figsize = (10, 5)) 
  Chosen = Data[-window:, ] 
     
  for i in range(len(Chosen)): 
         
    ax[0].vlines(x = i, ymin = Chosen[i, 2], ymax = Chosen[i, 1], color = 'black', linewidth = 1)   
    
  ax[0].grid() 
  for i in range(len(Chosen)): 
         
    ax[1].vlines(x = i, ymin = 0, ymax = Chosen[i, 6], color = 'green', linewidth = 1) 
    ax[1].vlines(x = i, ymin = Chosen[i, 7], ymax = 0, color = 'red', linewidth = 1)   
             
  ax[1].grid()  
  ax[1].axhline(y = 0, color = 'black', linewidth = 0.5, linestyle = '--'
# The above code considers columns 6 and 7 to inhibit Bull Power and Bear Power respectively. 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

回测简单策略

与任何适当的研究方法一样,其目的是对指标进行回测,并能够自己查看是否值得将其作为我们先前存在的交易框架的补充。请注意,以下内容仅对过去10年中仅对10个货币对的一个时间范围进行回测。这可能不是该策略的最佳时限,但我们只是试图找到一种“一刀切”的“几乎适合所有人”的策略。

条件已简化,我们将基于主观障碍使用逆势方法:

  • 当牛市力量指标达到-0.001并且前两个值大于0.001时,做多(买入)。保持该位置,直到收到新信号(该位置已关闭)。
  • 每当熊市力量指标达到0.001(前两个值均低于0.001)时,做空(卖出)。保持该位置,直到收到新信号(该位置已关闭)。

欧元兑美元的信号图。

def signal(Data, bull_power, bear_power, buy, sell): 
     
  for i in range(len(Data)): 
    if Data[i, bull_power] < lower_barrier and Data[i - 1, bull_power] > lower_barrier : 
        Data[i, buy] = 1 
             
    if Data[i, bear_power] < lower_barrier and Data[i - 1, bear_power] > lower_barrier: 
        Data[i, sell] = -1 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

USDCHF上的信号图

根据自2010年以来按小时数据散布的0.5个基点得出的结果,并且没有采用风险管理算法,得出的结果如下。

效果表

遵循该策略的股权曲线

显然,该指标并没有增加价值。尝试优化甚至更改与之相关的策略可能会更好。我们可能可以添加一些熊市条件来验证看涨信号,并添加一些牛市条件来验证看跌信号。

我们还可以相应地调整回溯和障碍。我们可以做的最后一件事是将策略从逆势转变为遵循趋势。

结论

记住要经常做背部测试。即使我提供了指标的功能(而不只是吹牛说它是圣杯,并且它的功能是秘密),您也应该始终相信其他人是错误的。我的指标和交易风格对我有用,但可能并非对每个人都适用。我依靠以下规则:

市场价格在超过50%的时间内无法预测或很难预测。但是市场反应是可以预测的。

意思是,我们可以在一个区域周围形成一个小区域,并可以确信地说市场价格将对该区域周围的区域产生反应。但是我们不能真正说它会从那里下跌4%,然后再次测试,并在第三次尝试跌至103.85美元时突破。由于我们预测过度,因此误差项呈指数级增长。

 

责任编辑:武晓燕 来源: 区块链研究实验室
相关推荐

2020-11-25 08:24:13

人脸识别

2015-12-30 14:41:51

OpenStack

2018-02-24 15:48:53

2012-05-21 13:18:12

HTML5

2012-05-21 13:11:51

HTML5

2012-05-21 13:32:45

HTML5

2012-05-21 10:53:30

HTML5

2020-07-09 10:18:00

人工智能

2022-09-12 23:53:53

JavaScript条件判断开发

2020-12-07 16:20:53

Python 开发编程语言

2012-11-05 10:48:14

敏捷测试软件测试

2021-04-25 15:17:29

代码软件程序员

2021-07-26 05:16:24

HashCheck密码隐私

2010-02-22 09:17:39

使用Python

2021-07-21 14:29:27

Python编程语言软件开发

2024-11-18 16:24:19

SVN开发Python

2021-02-22 13:44:41

开发Python金融

2020-10-15 12:00:01

Python 开发编程语言

2010-03-15 10:49:57

Python函数变量

2021-05-14 14:33:07

Python加密货币
点赞
收藏

51CTO技术栈公众号