4.3 python-highcharts
我们在研究金融数据的时候,最常用的功能就是K线图了。可能有人会问,现在有很多行情软件都提供了K线图,为什么还需要自己绘制呢?
原因很简单,如果你只是使用MACD、MA这种内置的或者简单计算的指标,那么只用第三方平台就可以进行研究了。但是有很多指标,需要非常复杂的计算,计算完之后,还需要将其可视化以便进行观察,对于这种需求,第三方平台就没法做到了,必须要自己绘图。对于十年左右的金融数据,用Excel表格或者其他的静态图完全无法表达,如何才能将十年的数据绘制到一张图上以进行观察呢?这种情况就需要利用动态图了,动态图的意思就是,可以像行情软件那样放大或缩小区间,来回滚动,这样观察长时间的序列就非常容易了。
虽然Python的Matplotlib和seaborn的功能都很强大,但实际上,最好的可视化工具并不在Python社区中,而是在JavaScript社区中。基于网站开发的强烈需求,JavaScript中出现了大量优秀的可视化工具,比如highcharts。highcharts可以绘制很多动态的可视化图形,进行数据可视化研究非常方便。
一个典型的highcharts图链接如下:https://www.highcharts.com/stock/demo/intraday-candlestick。
打开之后,图形大概如图4-9所示。
图 4-9
在图4-9中,我们可以使用右下角的时间窗口控件对时间范围进行调节,既可以缩小或扩大显示的数据量,也可以来回拖动以显示不同的时间周期。这对于样本数量很大的数据可视化来说非常有帮助。
不过,这些可视化工具都需要使用JavaScript语言作为接口进行调用。那么Python应该如何调用呢?这就要再次归功于Python强大的社区,现在已经有一个非常好的开源项目,可以用于调用highcharts。
这个项目的链接地址如下:https://github.com/kyper-data/python-highcharts/blob/master/examples/highstock/candlestick-and-volume.py。
关于如何安装这里不再多说。我们来看几个例子。绘制带成交量的K线图是一个最常见的需求。示例代码如下:
# -*- coding: utf-8 -*- """ Highstock Demos Two panes, candlestick and volume: http://www.highcharts.com/stock/demo/candlestick- and-volume """ from highcharts import Highstock from highcharts.highstock.highstock_helper import jsonp_loader H = Highstock() data_url = 'http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-ohlcv. json&callback=?' data = jsonp_loader(data_url, sub_d = r'(\/\*.*\*\/)') ohlc = [] volume = [] groupingUnits = [ ['week', [1]], ['month', [1, 2, 3, 4, 6]] ] for i in range(len(data)): ohlc.append( [ data[i][0], # the date data[i][1], # open data[i][2], # high data[i][3], # low data[i][4] # close ] ) volume.append( [ data[i][0], # the date data[i][5] # the volume ] ) options = { 'rangeSelector': { 'selected': 1 }, 'title': { 'text': 'AAPL Historical' }, 'yAxis': [{ 'labels': { 'align': 'right', 'x': -3 }, 'title': { 'text': 'OHLC' }, 'height': '60%', 'lineWidth': 2 }, { 'labels': { 'align': 'right', 'x': -3 }, 'title': { 'text': 'Volume' }, 'top': '65%', 'height': '35%', 'offset': 0, 'lineWidth': 2 }], } H.add_data_set(ohlc, 'candlestick', 'AAPL', dataGrouping = { 'units': groupingUnits } ) H.add_data_set(volume, 'column', 'Volume', yAxis = 1, dataGrouping = { 'units': groupingUnits } ) H.set_dict_options(options) H.save_file('highcharts') H
需要注意的是,这个最终显示还是靠JavaScript,所以只能在Jupyter Notebook中显示,在Spyder中是无法显示的。当我们生成好图对象H后,想要将其显示在Notebook中,只需要输入H,运行即可,如图4-10所示。我们也可以使用H.save_file(file_path)将图像保存为html文件。这个文件可以分享给其他人,使用普通浏览器就能打开。
图 4-10
除了K线图,highcharts中的其他图形也非常丰富,比如雷达图,示例代码如下:
# -*- coding: utf-8 -*- """ Highcharts Demos Spiderweb: http://www.highcharts.com/demo/polar-spider """ from highcharts import Highchart H = Highchart(width=550, height=400) options = { 'chart': { 'polar': True, 'type': 'line', 'renderTo': 'test' }, 'title': { 'text': 'Budget vs spending', 'x': -80 }, 'pane': { 'size': '80%' }, 'xAxis': { 'categories': ['Sales', 'Marketing', 'Development', 'Customer Support', 'Information Technology', 'Administration'], 'tickmarkPlacement': 'on', 'lineWidth': 0 }, 'yAxis': { 'gridLineInterpolation': 'polygon', 'lineWidth': 0, 'min': 0 }, 'tooltip': { 'shared': True, 'pointFormat': '<span style="color:{series.color}">{series.name}: <b>${point. y:,.0f}</b><br/>' }, 'legend': { 'align': 'right', 'verticalAlign': 'top', 'y': 70, 'layout': 'vertical' }, } data1 = [43000, 19000, 60000, 35000, 17000, 10000] data2 = [50000, 39000, 42000, 31000, 26000, 14000] H.set_dict_options(options) H.add_data_set(data1, name='Allocated Budget', pointPlacement='on') H.add_data_set(data2, name='Actual Spending', pointPlacement='on') H
运行结果如图4-11所示。
图 4-11
不过需要注意的是,由于这里只封装了JavaScript的接口,所以实际在画图的时候,所有的设置都是按照highcharts自身的语言规范来设计的,因此如果想要自己调整,那么还是需要对highcharts有一定的了解才可以。highcharts的介绍已经超出本书范围了,感兴趣的朋友可以自行去官网查阅。