加密货币Python量化交易-2[绘制比特币k线]

加密货币Python量化交易-2[绘制比特币k线]

前言

虚拟货币相较于传统股市,没有休市,资本永不眠

兔小萌也算是在币圈经历了一轮熊和一轮牛,从短线到长线,从现货到合约,也算是经历了很多,对于币圈的认识也更加客观,总体来说我个人目前转变为一个屯币党,目前最喜欢的指数是ahr-999,但是ahr-999目前只有计算btc或者eth的,对于其他主流币并没有相关的数据

兔小萌的专业和CS相关,所以自己写了代码来计算以ahr-999为代表的指数,但是总觉得这些指数属于整个币圈,因此在此做一个较为长期的系列更新,更新自己从获取虚拟币数据到绘制k线到指数计算到量化交易的代码记录

系列包含

目前打算该系列包含:

获取数据

绘制K线 [√]

指数计算

量化策略

量化回测

量化交易

Python金融库介绍

在上一章节获取了BTC的历史数据,在本章节将针对BTC的历史数据绘制K线和交易量这两张基础的交易分析图,先放出结果图

mplfinance包含一个新的matplotlib 金融API,可以更轻松地创建金融图。它与Pandas DataFrames很好实现对接

在处理完数据后只需要一行命令就可以绘制出好看的k线

# 绘制K线图 mpl_finance.candlestick_ochl( ax=ax1, quotes=df[[dates, Open, Close, High, Low]].values, width=0.7, colorup=r, colordown=g, alpha=0.7) “”” Plot the time, open, close, high, low as a vertical line ranging from low to high. Use a rectangular bar to represent the open-close span. If close >= open, use colorup to color the bar, otherwise use colordown Parameters ———- ax : `Axes` an Axes instance to plot to quotes : sequence of (time, open, close, high, low, …) sequences As long as the first 5 elements are these values, the record can be as long as you want (e.g., it may store volume). time must be in float days format – see date2num width : float fraction of a day for the rectangle width colorup : color the color of the rectangle where close >= open colordown : color the color of the rectangle where close < open alpha : float the rectangle alpha level

后续部分将对数据做分析,并进行进一步的处理

数据介绍

上一章节最终整合完成的数据如下图所示

选择其中四行数据做具体分析

因为只需要绘制基础的k线图,所以更关注以上几个参数,open high low close,四者分别是开盘 最高 最低 收盘,volume是交易量,其中比较奇怪的是opentime,这个是linux时间纪元,Unix认为UTC 1970年1月1日0点是纪元时间,也就是1970年1月2日0点的时间纪元时间为60×60×24=86,400

数据处理

首先引入所需的库

import mpl_finance import pandas as pd import matplotlib.pyplot as plt from matplotlib import ticker, gridspec, dates import numpy as np import matplotlib as mpl import datetime

首先使用pd读取csv,并且根据开盘时间排序,这一点非常重要,在稍后具体介绍candlestick_ochl会说明原因,这里的df[trade_date2] 需要除1000,因为币安的数据都是ms,而candlestick_ochl只能识别Linux时间纪元的s精度,所以需要做更替处理

# 读取数据 df = pd.read_csv(./BTCUSDT/BTCUSDT-1.csv) df = df.sort_values(by=Open time, ascending=True) # 数据排序 df[dates] = np.arange(0, len(df)) df[trade_date2] = [p/1000 for p in df[Open time].copy()]

k线绘制

因为最终效果为上下两个栏,所以需要使用子图定义的方法指定两个图的具体位置,在这里使用gridspec框架定义图表占比

# 控制子图 figure = plt.figure(figsize=(12, 9), facecolor=#ffffff) gs = gridspec.GridSpec(3, 1) ax1 = plt.subplot(gs[:2, :]) ax1.patch.set_facecolor(#ffffff) ax2 = plt.subplot(gs[2, :]) ax2.patch.set_facecolor(#ffffff)

之后就可以绘制k线图

# 绘制K线图 mpl_finance.candlestick_ochl( ax=ax1, quotes=df[[dates, Open, Close, High, Low]].values, width=0.7, colorup=r, colordown=g, alpha=0.7)

这里的df[dates]和df[trade_date2]具体如下

时间轴格式化

因为整体的时间轴比较长,所以在这里对时间轴的横轴重新格式化

date_tickers = [datetime.datetime.fromtimestamp(t).strftime(“%Y-%m”) for t in df[trade_date2].values]

将date_tickers转化为datetime格式

并给予指定格式

def format_date(x, pos): if x < 0 or x > len(date_tickers) 1: return return date_tickers[int(x)] ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))

以下是部分date_tickers,同一月的不同天经过整合合并为同一月

而且还可以增加MA均线做进一步判断

# 计算MA线 df[5] = df.Close.rolling(5).mean() df[20] = df.Close.rolling(20).mean() df[30] = df.Close.rolling(30).mean() df[60] = df.Close.rolling(60).mean() df[120] = df.Close.rolling(120).mean() df[250] = df.Close.rolling(250).mean() # 绘制均线 for ma in [5, 20, 30, 60, 120, 250]: ax1.plot(df[dates], df[ma], label = ma)

绘制完成的图像如下所示

然后构建up参数,判断到底是画红柱还是绿柱,调用df.query()执行筛选,最后完成交易量绘制

# 绘制成交量 ax2.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) df[up] = df.apply(lambda row: 1 if row[Close] >= row[Open] else 0, axis=1) ax2.bar(df.query(up == 1)[dates], df.query( up == 1)[Volume], color=r, alpha=0.7) ax2.bar(df.query(up == 0)[dates], df.query( up == 0)[Volume], color=g, alpha=0.7) ax2.set_ylabel(成交量, color=w) ax2.grid(color=w)

在绘制基本k线后,下一步将继续充实指数,下一章节将实现ahr-999的计算

联系方式见链接

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Proudly powered by WordPress | Theme: HoneyWaves by SpiceThemes