前言
虚拟货币相较于传统股市,没有休市,资本永不眠
兔小萌也算是在币圈经历了一轮熊和一轮牛,从短线到长线,从现货到合约,也算是经历了很多,对于币圈的认识也更加客观,总体来说我个人目前转变为一个屯币党,目前最喜欢的指数是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的计算
联系方式见链接
发表回复