请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化策略 帖子:3364794 新帖:30

在外汇市场中货币篮子的运作

量化客发表于:4 月 17 日 19:38回复(1)

概论

每天我们都会从全球市场上读到多种财经消息, 包含诸如此类的短语 "美元兑主要货币疲软..." 这意味着一种货币的状态相对一组其它货币已发生了改变。这种动词结构的使用惯例是要生成完整的货币对列表, 并将它们切分为组和子组。

致力于将品种划分为组或是 "篮子" 的各种方法资料在各处交易论坛上也是屡见不鲜。货币对化分为 "篮子" 后, 便可精确分析 "篮子" 中彼此相邻品种的协同行为。假设这些货币对的通常行为以类似方式在大致相同的时刻形成极值, 并近乎以同向移动。这样的一个品种组 (或一个"篮子") 表现为一个虚拟货币对的均值, 并可适当地进行分析。

原理和定义

完整的思路是基于属性的重要性为交易者重组货币对。一些这样的属性对于大家是众所周知的, 例如油价和卢布汇率之间的关联性, 或是欧元兑美元和美元兑瑞郎之间的关联性。所以, 我们可以将它们组合为一个组 (货币篮子)。定义篮子的内容之后, 我们可以规划它可能的行动, 包括同时影响篮子内所有货币对 (在我们的例中这些是 EURUSD 和 USDCHF) 的行动。我们既可跟踪货币对的 "行为", 也可进行交易操作。

买入或卖出货币篮子涉及篮内每个货币的同时交易操作。在此情况下, 反向篮子指向的订单基于 "一个货币对 — 一笔订单" 的原则组成。所执行的交易操作条件, 表征货币篮子的状态。

货币对分组的原理自然且明显, 可应用于进一步的运作。所有 28 种主要货币对应根据当前每个货币对自身的基准货币 (或报价货币) 划分到篮子中。篮子的命名依据基准货币 (参见表 1 的示例)。在此情况下, 篮子状态由它的基准货币状态定义。状态参数包括超买/超卖状态, 和其它类似的属性。它们依照同样的技术分析手段提供, 我们用它来评估正常的货币对。

主要的货币篮子

让我们根据上述的原则来划分完整的货币对池子。其结果是, 我们得到 8 个货币篮子, 每个包含 7 种货币对:

 编号  篮子名  篮子货币  篮子货币对
1
澳元篮子
AUD
AUDUSD, AUDNZD, AUDJPY, AUDCAD, AUDCHF, EURAUD, GBPAUD
2
加元篮子
CAD
USDCAD, AUDCAD, NZDCAD, GBPCAD, EURCAD, CADCHF, CADJPY
3
瑞郎篮子
CHF
CHFJPY, USDCHF, GBPCHF, EURCHF, AUDCHF, NZDCHF, CADCHF
4
欧元篮子
EUR
EURUSD, EURJPY, EURCHF, EURGBP, EURNZD, EURCAD, EURAUD
5
英镑篮子
GBP
EURGBP, GBPAUD, GBPCAD, GBPCHF, GBPJPY, GBPNZD, GBPUSD
6
日元篮子
JPY
AUDJPY, CADJPY, CHFJPY, EURJPY, GBPJPY, NZDJPY, USDJPY
7
纽元篮子
NZD
NZDUSD, AUDNZD, NZDJPY, NZDCAD, NZDCHF, EURNZD, GBPNZD
8
美元篮子
USD
EURUSD, GBPUSD, AUDUSD, NZDUSD, USDCAD, USDCHF, USDJPY

表 1. 货币篮子

现在, 我们已定义了篮子的内容, 是时候来澄清它们的主要交易操作了。让我们来假设买入和卖出一个篮子, 意指买入和卖出其内的货币。

假定有关日元的利好消息到达暗示其可能走强。一位交易员决定买入 JPY。根据我们的范例, 这位交易员应做空所有货币对来买入 JPY 篮子。在相反的情况下, 交易员应做多篮内所有货币对来卖出 JPY 篮子。

当处理 EUR 篮子时, 情况看来不会那么困惑。如果交易员打算买入 EUR 篮子, 做多其内所有货币对, 反之亦然。对于 EUR 和 JPY, 篮内订单均由单向订单组成。

让我们依照下表安排, 以避免交易操作混淆:

编号 篮子名 篮内货币交易操作
篮内货币对交易操作

1

澳元篮子

 

AUDUSD AUDNZD AUDJPY AUDCAD AUDCHF EURAUD GBPAUD
做空 卖出 卖出 卖出 卖出 卖出 买入 买入
做多 买入 买入 买入 买入 买入 卖出 卖出

2

加元篮子

 

USDCAD AUDCAD NZDCAD GBPCAD EURCAD CADCHF CADJPY
做空 买入 买入 买入 买入 买入 卖出 卖出
做多 卖出 卖出 卖出 卖出 卖出 买入 买入

3

瑞郎篮子

 

CHFJPY USDCHF GBPCHF EURCHF AUDCHF NZDCHF CADCHF
做空 卖出 买入 买入 买入 买入 买入 买入
做多 买入 卖出 卖出 卖出 卖出 卖出 卖出

4

欧元篮子

 

EURUSD EURJPY EURCHF EURGBP EURNZD EURCAD EURAUD
做空 卖出 卖出 卖出 卖出 卖出 卖出 卖出
做多 买入 买入 买入 买入 买入 买入 买入

5

英镑篮子

 

EURGBP GBPAUD GBPCAD GBPCHF GBPJPY GBPNZD GBPUSD
做空 买入 卖出 卖出 卖出 卖出 卖出 卖出
做多 卖出 买入 买入 买入 买入 买入 买入

6

日元篮子

 

AUDJPY CADJPY CHFJPY EURJPY GBPJPY NZDJPY USDJPY
做空 买入 买入 买入 买入 买入 买入 买入
做多 卖出 卖出 卖出 卖出 卖出 卖出 卖出

7

纽元篮子

 

NZDUSD AUDNZD NZDJPY NZDCAD NZDCHF EURNZD GBPNZD
做空 卖出 买入 卖出 卖出 卖出 买入 买入
做多 买入 卖出 买入 买入 买入 卖出 卖出

8

美元篮子

 

EURUSD GBPUSD AUDUSD NZDUSD USDCAD USDCHF USDJPY
做空 买入 买入 买入 买入 卖出 卖出 卖出
做多 卖出 卖出 卖出 卖出 买入 买入 买入

表 2. 篮子交易操作

篮子货币状态

我们应该如何决定针对一个货币篮子进行交易操作?仅仅根据单一货币对的行为来判断, 对于大尺寸的篮子, 这将是非常困难的事。我们需要更多篮子货币状态参数的技术数据。将我们的注意力集中到来自 GBP 篮子的三个货币对的 RSI 指标图形, 其名为 GBPUSD, GBPJPY 和 GBPCHF。D1 图形是以下显示的图像:


如您所见, 这三幅图有很多共同点: 许多极值位置相似, 而且上下间隔也有很多共同点。这种相似性可以解释为同样的篮子货币 — 英镑。它的坚挺和疲软导致这种上下间隔。

所有三个图形间的差别在很大程度上可解释为货币报价的不同行为。在此情况下, 在 "额外" 局部极值中可看到不同行为的影响, 下降和上升走势的各种梯度, 以及局部方向的变化。

如果我们定义了通用参数 (篮内所有货币对共享) 的行为, 并消除了货币对之间的差别, 我们将实现我们的主要目标 — 参数可视化。在当前的例子中, GBP 超买/超卖状态是通用货币状态参数, 作为 "统一的 RSI" 显示篮子货币的状态, 而非一个货币对。

当然, 我们不可仅用 RSI 来限制自己。也许是基于标准以外的其它类似指标。让我们将它们称为 "统一的指标"。


计算篮子货币状态参数的方法

为了解决这个任务, 我们需要考虑已经存在的, 并尝试类似行动。在这方面首先进入脑海的就是美元指数。正如我们记忆中的, 它显示出美元对比其它六种主要货币的状态。首先, 我们要关注计算方程。这是一个几何平均权重比。我们尝试将此理论应用于我们自定义货币对集合的美元篮子。让我们接受另一个假设 — 去除权重比并减少方程来计算一个正态几何均值。我们所实现的变化将应用于计算几何均值原理, 并在所有篮子上进行计算。在实际实践中, 我们不了解任何货币对的权重比。

让我们来看看, 我们的改变是否有啥影响。为此, 我们使用一个简单的指标:

#property copyright "版权所有 2016, MetaQuotes 软件公司"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict

#property indicator_separate_window
#property indicator_buffers 1

input int     iBarsTotal=300;       

string pair[]={"EURUSD","GBPUSD","AUDUSD","NZDUSD","USDCAD","USDCHF","USDJPY"};
bool bDirect[]={false,false,false,false,true,true,true};
int iCount=7;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetValue(int shift)
  {
   double res=1.0,t;
   for(int i=0; i<iCount; i++)
     {
      t=iClose(pair[i],0,shift);
      if(!bDirect[i]) t=1/t;
      res*=t;
     }//结束 for (int i = 0; i < iCount; i++)
   return (NormalizeDouble(MathPow (res, (double)1/iCount), _Digits) );
  }

double upp[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorShortName("testBasket");
   IndicatorDigits(_Digits);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2,clrGreen);
   SetIndexBuffer(0,upp);
   SetIndexLabel(0,"testBasket");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated==0)
     {

      int total;
      if(iBarsTotal==0) total=rates_total;
      else total= MathMin(iBarsTotal,rates_total);
      for(int i = 0; i<total; i++) upp[i] = GetValue(i);
     }//结束 if (prev_calculated == 0)
   else
     {
      upp[0]=GetValue(0);
     }
   return(rates_total);
  }

为了比较, 我们使用免费的 USDX.mq4 指标绘制标准方式的美元指数。以下是结果 (H1 时间帧):


testBasket.mq4 指标在图像里显示为深绿色, 而 USDX.mq4 指标显示为红色和浅绿色 (均线)。我们也许会注意到在 H1 时间帧上完美匹配。走势方向几乎段落吻合, 局部极值点的大多数都如此。


在 D1 时间帧, 图片不太有利, 但依然可接受。大多数局部极值点的位置是相同的, 如同大部分区域的走势方向。在某些区域的差别可轻松解释为缺乏权重比, 以及货币对的集合不同。此外, 彼此相互叠加的图表尺度也是不同的。

在所取得的成果基础上, 我们研究可接受的计算不同篮子货币状态参数几何均值的计算方程。我们将称其为 方法 #1 函数。然而, 我们也应该知道有关方程的限制。更具体而言, 使用它时可取负值参数, 这应是一个馊主意。有相当多的技术指标有这样的参数。此外, 计算几何均值如果不是一个单独的库, 可能要考虑加载到终端。

我们可以应用另一方程, 就是说, 常见的算术平均, 以消除对使用负值作为参数的限制。让我们再基于此方程创建另一个测试指标进行计算。使用随机振荡指标值作为参数:

#property copyright "版权所有 2016, MetaQuotes 软件公司"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict

#property indicator_separate_window
#property indicator_minimum    0
#property indicator_maximum    100

#property indicator_buffers 2

input int     iBarsTotal=3000;

string pair[]={"EURUSD","EURJPY","EURCHF","EURGBP","EURNZD","EURCAD","EURAUD"};
int iCount=7;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GetValue(int shift,double &s1,double &s2)
  {
   s1=0; s2=1;
   for(int i=0; i<iCount; i++) 
     {
      s1 += iStochastic(pair[i],0,5,3,3,MODE_SMA,0,0,shift);
      s2 *= iStochastic(pair[i],0,5,3,3,MODE_SMA,0,0,shift);
     }
   s1 = NormalizeDouble(s1/iCount, _Digits);
   s2 = NormalizeDouble(MathPow (s2, (double)1/iCount), _Digits);
  }

double upp[],upp1[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorShortName("testBasketS");
   IndicatorDigits(_Digits);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2,clrRed);
   SetIndexBuffer(0,upp);
   SetIndexLabel(0,"testBasketSA");
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2,clrGreen);
   SetIndexBuffer(1,upp1);
   SetIndexLabel(1,"testBasketSG");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated==0)
     {

      int total;
      if(iBarsTotal==0) total=rates_total;
      else total= MathMin(iBarsTotal,rates_total);
      for(int i = 0; i<total; i++) GetValue(i,upp[i],upp1[i]);
     }//结束 if (prev_calculated == 0)
   else
     {
      GetValue(0,upp[0],upp1[0]);
     }
   return(rates_total);
  }

指标下载到 EURGBP D1 图表。得到的数值示意如下:


细线代表原始的随机振荡, 红色双实线是基于算术均值方程的新 统一随机振荡, 而绿色双实线表示基于几何均值的比较值。

分析方程, 我们可看到它们产生的结果非常相似。基于几何均值的图形具有较明显的极端点, 而基于算术平均值的那根则更光滑。虽然, 也许这并没什么, 仅是我们的主观印象。负数参数与 PC 计算力相关联的限制似乎是影响实际应用的最关键因素。一般而言, 算术平均值也可以如同 方法 #2 那样应用于计算。

初步的实际结论

读过了之前的段落之后, 您也许会问自己 "这一切的所有需要是什么?" 我们已经得到了绘制类似美元指数图形的新指标, 还有另一个指标可绘制随机振荡风格的图形。我们还得到了另一个指标可绘制类似于标准 RSI 的图表。但是我们已拥有传统的 RSI 和随机振荡。为什么我们还需要其它的呢?让我们来尝试回答这个问题。

  1. 统一指标提供一篮子货币的状态数据, 允许交易者预测篮子内所有货币对的走势。反过来, 这种预测可用于篮子内所有货币对的交易操作。
  2. 组合指标形成一个类似常规的 (像是在一幅大图像里包含一个随机振荡) 过滤器, 有助于交易者避免篮内某货币对入场, 分析图形交叉点并检测背离。
  3. 我们不要忘记两种货币组成一对, 且它们中的每一个都有自己的篮子。交易者可以得到它们当中每一个的数据, 并使用统一指标来规划它们的进一步行动。

所有这些点均可作为开发有效交易系统的基础。此外, 统一指标可与其它交易系统联用。不过, 这个话题已超出这篇介绍性文章的界限。


结论

请记住, 交易决策应基于若干个信号作出, 除非您应用了一个非指标交易方法。本文描述了一个相对新颖的获取信号的方法。然而, 不应考虑用它作为标准方法的完全替代品。统一 RSI, 随机指标和其它指标以及标准指标合并在一起使用, 可以提供足够的高质量确认信号, 从而改善您的交易效率。


全部回复

0/140

量化课程

    移动端课程