在这个教程中,我们将学习如何利用交叉指标预测加密货币市场的买入/卖出信号,并在教程结尾提供了完整的Python代码,在市场历史数据上利用此算法可以实现三倍的比特币收益回报率。
用自己熟悉的语言学习 以太坊DApp开发 : Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart
1、基础知识:黄金交叉 vs. 死亡交叉
如果你有金融背景,就知道黄金交叉(golden Cross)和死亡交叉(Death Cross)这两个指标是衍生自滑动平均算法,也被称为交叉指标(cross indicator)。这两个交叉指标都是使用以下公式对特定时间段内的市场收盘价计算平均值:
该概念组合两个滑动平均值(短期和长期)以获得加密货币趋势。当短期移动均线超过或回顾长期移动均线时,将出现买入或卖出信号。
从数学上讲,如果你选择5个周期的短期移动均线和20个周期的长期移动均线,我们将通过以下条件 获得买入信号:
MA(5)计算如下:
MA(20)计算如下:
CPrice对应于收盘价值。例如,目前比特币的价格为49,670美元,t表示时间段定义(在本文结尾的视频中对此有更多解释)。这些交叉指标是方程的一部分,可帮助检测所研究的加密货币的全球趋势。这些CI(交叉指标)在全球范围内被多个交易者和基金广泛使用,以定义支撑力量、阻力水平、 止损和目标并了解潜在趋势。
现在我们已经涵盖了一些背景知识,让我们开始测试,看看它们如何帮助预测加密货币市场。
2、使用的软件栈
在继续下面的教程之前,请确保你已经安装了Python3以及以下软件包:
- Pandas:
- NumPy:
- Yfinance:
- Plotly:不是必须的,但在绘图时有用
可以使用pip安装上述软件包,例如:
代码语言:javascript复制pip install yfinance
pip install plotly
3、数据管道和建模
现在我们可以定义数据处理流程了,主要包含3个不同的步骤:
- 使用Yahoo Finance API查询实时加密货币的数据
- 定义一个时间段,为我们要计算的数据创建新列,然后每秒更新这些值。
- 实时绘图,并检查我们的信号是否准确。
在本文中,我不会过多地介绍有关代码和API的细节,你可以在下面的文章中 了解 如何用Python获取实时的加密货币市场数据。现在我们可以开始编码了!
4、导入软件包
第一步将包括导入必要的软件包。使用以下代码行导入以前安装的软件包:
代码语言:javascript复制# Raw Package
import numpy as np
import pandas as pd
#Data Source
import yfinance as yf
#Data viz
import plotly.graph_objs as go
现在已经导入了库,接下来可以导入我们的加密货币数据了。
5、获取实时市场数据
现在,所需的不同软件包已上传。我们将以BTC-USD交易对为例,通过Yahoo Finance API设置导入。
可以扩展需要的法币以及加密货币选项。例如,如果你来自印度或加拿大,则可以使用INR或CAD,你也可以设置是否需要Ripple或Ethereum数据。
让我们回到API结构。
调用Yahoo Finance API时需要按顺序传入三个参数:
- 交易对代码(1)
- 开始日期 结束日期或期间(2)
- 间隔(3)
在我们的示例中,交易对代码(参数1)将为BTC-USD对。此外,在此示例中,我们将选择最后7天作为时间段(参数2)。并设置一个间隔(参数3)的90分钟。
要调用数据,必须使用以下结构:
在继续之前,我将介绍有关第三个参数(interval)的一些细节。
6、可用的时间间隔
这里我想快速介绍一下可以使用yahoo finance API设置的不同间隔。
下面详细列出了各种可能的间隔:
现在我们已经定义了三个参数,让我们执行查询并检查输出:
代码语言:javascript复制data = yf.download(tickers='BTC-USD',period = '8d', interval = '90m')
下面是输出结果:
现在,我们已经下载并存储了数据,可以继续并定义华东平均线以及买卖信号。
7、算法实现
现在,我们的实时数据已经下载并存储在名为data
的变量中。下一步包括计算我们的移动平均线
并设置买入和卖出信号。
我们将需要创建以下计算字段:
- MA(5)
- MA(20)
为此,我们将使用Python中包含的滚动函数来获取n个最新周期的平均值。关于MA(5),我们将在最近的5个90分钟周期内应用我们的策略。这意味着我们将计算最近7小时30分钟(5次乘以90分钟)的平均收盘价。
类似的对于MA(20),要计算的是20个而不是5个90分钟周期的平均值。Python代码如下:
代码语言:javascript复制#Moving average using Python Rolling function
data['MA5'] = data['Close'].rolling(5).mean()
data['MA20'] = data['Close'].rolling(20).mean()
上面的代码执行后,将为数据框创建2个新列,如下所示:
好了,下面我们就可以测试策略了。
8、实时绘图
我们计划的最后一步是绘制数据并检查是否可以预测市场走势。在下图中,我将绿色标记为良好的预测,将黑色预测为错误的预测:
9、量化交易Python代码
完整的Python代码如下:
代码语言:javascript复制# Raw Package
import numpy as np
import pandas as pd
#Data Source
import yfinance as yf
#Data viz
import plotly.graph_objs as go
#Importing market data
data = yf.download(tickers='BTC-USD',period = '8d', interval = '90m')
#Adding Moving average calculated field
data['MA5'] = data['Close'].rolling(5).mean()
data['MA20'] = data['Close'].rolling(20).mean()
#declare figure
fig = go.Figure()
#Candlestick
fig.add_trace(go.Candlestick(x=data.index,
open=data['Open'],
high=data['High'],
low=data['Low'],
close=data['Close'], name = 'market data'))
#Add Moving average on the graph
fig.add_trace(go.Scatter(x=data.index, y= data['MA20'],line=dict(color='blue', width=1.5), name = 'Long Term MA'))
fig.add_trace(go.Scatter(x=data.index, y= data['MA5'],line=dict(color='orange', width=1.5), name = 'Short Term MA'))
#Updating X axis and graph
# X-Axes
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=3, label="3d", step="days", stepmode="backward"),
dict(count=5, label="5d", step="days", stepmode="backward"),
dict(count=7, label="WTD", step="days", stepmode="todate"),
dict(step="all")
])
)
)
#Show
fig.show()
10、教程小结
所有交易都不完美,有时我们往往会滞后于进入或离开市场,但在比特币稳定的时期,黄金交叉策略已成为提高我们利润的有用策略。利用已有的历史数据进行简单计算后,我们的算法可以在一周内获得7.1%的回报,而同期的比特币交易回报率则稳定在1.7%左右。
原文链接:基于交叉指标的加密货币量化交易 — 汇智网