Python金融分析(一):Cufflinks与数据可视化

其实我对经济更来电一些,但是柴米油盐是经济,琴棋书画也是经济,还是专注一点。对金融怎么说呢?感觉很复杂,感情也很复杂。当然了不管怎么说,都还是迈出了第一步。既然如此,就要扎实一些

两本参考书

金融的知识懂一些,Python的也懂一些,两个凑一块的,不太懂了。好在有人懂啊,找了两本书,巧了名字大差不离:

  • 《Python for Finance: Apply powerful finance models and quantitative analysis with Python》
  • 《Python for Finance: Mastering Data-Driven Finance》

就拿这两本书作为参考,用不着全看,也不会局限在里面,总结些自己觉得还有点意思的东西。

bookcover_1

bookcover_2

Cufflinks数据可视化

Cufflinks配合Plotly

如果用过Plotly或者看过我之前的博客,由于自由度比较高。Plotly的命令写起来也是比较繁琐的。而通常多数情况下,我们并不需要太多定制化的东西,只要能够快速方便地绘制出看上去还不错的图就可以了。Cufflinks就是专门用来方便pandas DataFrame对象调用Plotly绘图的工具,我个人感觉它的原理并不复杂,似乎是通过为DataFrame对象增加调用Plotly的方法实现。首先,当然还是安装cufflinks库:

1
pip install cufflinks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import plotly.offline as py_offline
import cufflinks as cf
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import plotly.graph_objs as go

%matplotlib inline

# set figure size
mpl.rcParams['figure.figsize']=[15,12]

# set figure style
plt.style.use('ggplot')

# plotly layout
layout=go.Layout(
autosize=True,
margin=go.layout.Margin(
l=20,
r=20,
t=40,
b=20,
pad=10),
template='ggplot2'
)

py_offline.init_notebook_mode(connected=True)

init_note_mode()的作用是开启notebook绘图模式,之所以如此做,主要是出于速度的考虑。Plotly既可以本地渲染,也可以远程渲染,也就是在plotly server上绘图,通常来讲,本地渲染会快得多,尤其是对于比较大的数据集。但是,有些功能例如plotly的流式绘图服务(streaming plot service),只能通过服务器实现。

1
print(cf.__version__)
0.14.6

示例1:随机数时间序列

我们首先生成一组正态分布随机数,计算其累加和,在累加的这个方向上添加时间索引,就可以得到一组类似指数的时间序列:

1
2
3
4
5
6
7
8
9
10
# generate pseudo-random numbers
numbers = np.random.standard_normal((259,5)).cumsum(axis=0)

# convert to time series data
index = pd.date_range('2019-01-01', freq='B', periods=len(numbers))

df = pd.DataFrame(100+5*numbers, columns=list('abcde'), index=index)

df.plot()
plt.show()

output_9_0

完全采用cufflinks的语法:

1
2
3
4
5
py_offline.iplot(df.iplot(asFigure=True,
title='A Time Series Plot',
xTitle='Date',
yTitle='Value',
theme='ggplot'))

采用cufflinks的iplot与plotly的参数写法:

1
2
3
4
5
6
py_offline.iplot(df.iplot(asFigure=True,
layout=go.Layout(title='A Time Series Plot',
xaxis={'title':'Date'},
yaxis={'title':'Value'},
template='ggplot2')
))

完全采用plotly的原生语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
trace = []
for column in df.columns:
temp = go.Scatter(
x=df.index,
y=df[column],
mode='lines',
name=column
)
trace.append(temp)

layout=go.Layout(title='A Time Series Plot',
xaxis={'title':'Date'},
yaxis={'title':'Value'},
template='ggplot2')
py_offline.iplot(go.Figure(trace, layout))

output_12_0

目前cufflinks已经能提供plotly众多图表中相当多的类型,包括:chart, scatter, bar, box, spread, ratio, heatmap, surface, histogram, bubble, bubble3d, scatter3d, scattergeo, ohlc, candle, pie, choropleth。例如,我们还可以看一下下上面数据的直方图:

1
2
3
4
5
6
py_offline.iplot(
df.iplot(kind='hist', # specifiy the plotting type
subplots=True, # require spereate subplots for every column
bins=15,
asFigure=True),
)

output_18_0

示例2:金融数据可视化

在处理金融时间序列数据时,plotly,cufflink和pandas的组合证明特别强大。 cufflinks提供了专门的功能来创建典型的财务图表,并添加典型的财务图表元素,例如相对强弱指数(Relative Strength Index, RSI)。 为此,cufflinks增加了一个QuantFig对象,可以使用与DataFrame对象相同的方式绘制图表。接下来,我们使用实际的金融数据集——欧元/美元汇率的时间序列数据(来源:FXCM Forex Capital Markets Ltd)作为示例:

1
2
raw = pd.read_csv('./source/fxcm_eur_usd_eod_data.csv', index_col=0, parse_dates=True)
raw.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1547 entries, 2013-01-01 22:00:00 to 2017-12-31 22:00:00
Data columns (total 8 columns):
BidOpen     1547 non-null float64
BidHigh     1547 non-null float64
BidLow      1547 non-null float64
BidClose    1547 non-null float64
AskOpen     1547 non-null float64
AskHigh     1547 non-null float64
AskLow      1547 non-null float64
AskClose    1547 non-null float64
dtypes: float64(8)
memory usage: 108.8 KB
1
2
quotes = raw[['AskOpen', 'AskHigh', 'AskLow', 'AskClose']]
quotes=quotes.iloc[-60:]
1
2
3
4
5
6
7
qf = cf.QuantFig(
quotes,
title='EUR/USD Exchange Rate',
legend='top',
name='EUR/USD'
)
py_offline.iplot(qf.iplot(asFigure=True))

output_23_0

通过使用QuantFig对象的不同方法,可以添加典型的金融图表,例如布林带

布林带,即布林线(BOLL)指标,其英文全称是“Bollinger Bands”,布林线(BOLL)由约翰·布林先生创造,其利用统计原理,求出股价的标准差及其信赖区间,从而确定股价的波动范围及未来走势,利用波带显示股价的安全高低价位,因而也被称为布林带。布林带在应用上结合了移动平均和标准差的概念,其基本的型态是由三条轨道线组成的带状通道(中轨和上、下轨各一条)。中轨为股价的平均成本,上轨和下轨可分别视为股价的压力线和支撑线。

  • 中轨 = N时间段的简单移动平均线
  • 上轨 = 中轨 + K × N时间段的标准差
  • 下轨 = 中轨 − K ×

还可以添加其他的指标,例如相对强弱指数。
相对强弱指数RSI是根据一定时期内上涨点数和涨跌点数之和的比率制作出的一种技术曲线。能够反映出市场在一定时期内的景气程度。

1
2
3
qf.add_bollinger_bands(periods=15, boll_std=2)
qf.add_rsi(periods=14, showbands=False)
py_offline.iplot(qf.iplot(asFigure=True))

output_25_0

小结

cufflinks和Plotly的联合使用,可以提高交互式作图的效率,而且cufflinks还提供了许多金融领域常用的图表,数据的可视化为数据分析提供了更好的保证。