使用OANDA分析外汇数据

刚开始准备在MT4中写EA。MQL4语言有点像C,读起来还相对简单。

比较有意思的是通过OANDA下载的MT4客户端,会给你提供两个应用程序,一个editor,一个交易窗口。

editor中有非常详细的帮助文档,强调一遍,非常详细。而且还支持中文。

在editor里面编写完成之后,调试的内容都会反应在你的交易窗口中,非常方便。

但是对于python,没有像MT4那么完整的一套外汇交易框架,起码现在我没有找到。

我寻思着,反正学习MQL4和ORANDA v20的接口都是学,倒不如用一个现成的框架,因为调试起来真是太方便了,如果有两三块屏幕的话就更是锦上添花了。

之后逛了些外汇论坛,呵呵,MT4可以挂在专用的VPS执行,但是要是布在自己搭的服务器上可能要费点事,甚至我根本不会完成这件事。

算了,毕竟python相对还算熟,在一阵选择恐惧症过后,坚决选择了python,开始学习OANDA的接口v20

分析思路

上篇文章我通过分析外汇市场每天的交易量,得到了一些规律。通过这些规律,我们可以设计一个策略。

使用OANDA分析外汇数据_第1张图片

首先需要纠正一下。上篇文章在解释这张图的时候有些不准确。我上网查了些资料

The foreign exchange ("forex" or "FX") currency market is not traded on a regulated exchange like stocks and commodities.

 Rather, the market consists of a network of financial institutions and retail trading brokers which each have their own individual hours of operation. Since most participants trade between the hours of 8:00 a.m. and 4:00 p.m. in their local time zone, these times are used as the market open and close times, respectively.

使用OANDA分析外汇数据_第2张图片

通过以上信息可知,大部分交易所的开放时间都在本地的8:00AM至4:00PM。所以对于那张趋势图,我简单修改下。

图中的5点,其实是纽约的本地时间3点,也就是说伦敦的8点,正是伦敦交易所开始营业的时间,图中的10点,是纽约的8点,是纽约交易所营业的时间。

可以看到,在伦敦时间12点的时候,交易量已经有上升的趋势。在纽约开盘的时候,交易量达到了以小峰值。

之后的时间,之后英镑/美元货币对仍然会活跃交易,其他的货币对都会出现下降趋势。伦敦交易所在图中的13点闭市。之后交易量开始上升,直至纽约时间的13点,达到全天的峰值。

但是没有维持太长时间就迅速回落。之后在纽约时间19点的时候,东京开始交易,交易量达到峰值,balabala....

这次分析和之前的分析还是有些出入的。之前说交易量的最高峰在欧洲市场和北美市场重叠的部分,不过今天来看,情况不是这样的。

在纽约时间13点的时候,交易量达到了全天的峰值,对此我又展开一次分析调查。也不知道分析得对不对,看到这里的朋友,觉得有错误请指正,谢谢。

我看了下Economic Calendar。发现美国发生经济活动的时间大多在纽约时间10点至16点,而欧洲大多发生在伦敦时间8点至13点。

使用OANDA分析外汇数据_第3张图片
使用OANDA分析外汇数据_第4张图片
使用OANDA分析外汇数据_第5张图片
使用OANDA分析外汇数据_第6张图片
使用OANDA分析外汇数据_第7张图片
使用OANDA分析外汇数据_第8张图片
使用OANDA分析外汇数据_第9张图片
使用OANDA分析外汇数据_第10张图片

看出来了吧?


使用OANDA分析外汇数据_第11张图片

理由有些牵强,但感觉还是有些道理的。

ok,我们撇开基本面分析,回到结论来。不管分析如何,规律反正已经反映在了图上。

我们就利用这个规律来分析下交易数据。

数据采集

上篇文章已经简单介绍了下如何采集外汇的数据。不过用的是github上的样本代码,没怎么仔细看。接下来我介绍下如何用v20接口来分析外汇数据。

我采集了在OANDA中所有以EUR为基础货币的货币交易对的交易数据。

在采集交易数据之前,需要件创建一个session

from oandapyV20 import API

def client_session(token):

    return API(access_token=token)

为了以后方便分析,自己定义一个采集货币对的方法

import oandapyV20.endpoints.accounts as accounts

def get_symbol(client, account_id, select):

    r = accounts.AccountInstruments(accountID=account_id)

    ins = client.request(r)

    return [item['name'] for item in ins['instruments'] if item['name'][:3] == select]

这里需要说明一下的是,OANDA里面的数据,返回类型都是json,什么json?

为了便于理解,我把它当做就是一个大dict,dict里面的value是个list,list里面又装了一些dict。你要是说你不懂dict,那我只能说你还是先看看python的基础吧。

获取完货币对之后,可以通过 InstrumentsCandlesFactory 类来获取交易数据,具体使用方法在

http://developer.oanda.com/rest-live-v20/introduction/

文档写得很有趣,感觉像是玩俄罗斯方块,一直处于方块被消除的状态,爽。

from oandapyV20.contrib.factories import InstrumentsCandlesFactory

def frame_factory(client, instr, params):

    ......

    for r in InstrumentsCandlesFactory(instrument=instr, params=params):

        client.request(r)

        rv = r.response.get('candles')

        for candle in rv:

            tra_time = candle.get('time')[0:19]

            try:

                ......

            except Exception as e:

                print(e, r)

                pass

    return pd.DataFrame(structure, columns=['time', 'complete', 'open', 'high', 'low', 'close', 'volume'])

# 将数据存储在hdf文件中

store = pd.HDFStore('./data/history.h5')

params = dict()

params['from'] = '2018-03-15T00:00:00Z'

params['to'] = '2018-03-16T00:00:00Z'

for item in ins:

    params['granularity'] = 'M1'

    instr = item

    store[item] = frame_factory(client, item, params)

store.close()

数据分析

数据已经采集完成,接下来就是分析日内交易数据。

这里倒没有用到什么机器学习的知识,都是一些统计学的内容。我计算了一些指标,还是通过可视化的手段将其展示出来,过滤掉一些小币种:

使用OANDA分析外汇数据_第12张图片
使用OANDA分析外汇数据_第13张图片
使用OANDA分析外汇数据_第14张图片
使用OANDA分析外汇数据_第15张图片
使用OANDA分析外汇数据_第16张图片
使用OANDA分析外汇数据_第17张图片

根据上图,我觉得,起码均值回归策略在外汇市场是行不通的,你根本阻挡不了它一通下跌的趋势。我们不妨做以下策略(假设)

如果在伦敦开盘至纽约开盘这段时间内,价格出现新高,就看多;出现新低,就看空。

在纽约闭市前进行平仓。

为什么这么做?

成交量意味着趋势的确定,如果开盘时欧洲人就不断做空,拉低价格,随着美洲人的苏醒,交易量不断扩大,趋势逐渐明确。

当然,你不能确定当天国际上又会出现什么幺蛾子新闻来影响汇率了。那就不在这篇粗鄙的文章讨论范围之内了,那叫做NLP。

当然,以上都只是假设,具体方案我还不确定,毕竟接触时间不长,还有好多东西要学,日后研究下再继续在文章里讨论。

当然,重要的是,得去实践。真理都是实践出来的。

下回继续研究咯~

你可能感兴趣的:(使用OANDA分析外汇数据)