Pandas DataFrame数据图表可视化

图表
highcharts
可视化
pandas
dataframe
标签: #<Tag:0x00007fc071531f68> #<Tag:0x00007fc071531770> #<Tag:0x00007fc0715311a8> #<Tag:0x00007fc071530c30> #<Tag:0x00007fc0715305f0>

(小Q) #1

股票数据分析经常要使用图表可视化。我们可以DataFrame.plot绘制图表,但这个图表是静态图片,不能交互,不方便查看。所以我们提供了交互式图表绘制函数 T.plot,我们可以做出效果更好,并且可交互的图表。使用示例参考如下代码。

克隆策略

Pandas DataFrame数据可视化:基于Highcharts的可交互图表

In [1]:
help(T.plot)
Help on function plot in module biglearning.api.tools:

plot(df, output='display', stock=None, double_precision=4, title=None, chart_type=None, x=None, y=None, candlestick=False, panes=None, options=None)

In [2]:
# 样例数据准备

# 以 平安银行 (000001.SZA) 的股票数据为例
df = D.history_data('000001.SZA', start_date='2015-01-01', end_date='2017-02-01',
                    fields=['open', 'high', 'low', 'close', 'adjust_factor', 'amount'])

# 日收益
df['return_1'] = df['close'] / df['close'].shift(1) - 1
# 5日收益
df['return_5'] = df['close'] / df['close'].shift(5) - 1

# 历史数据默认为后复权价格,除以 adjust_factor 得到实际价格
df['open'] /= df['adjust_factor']
df['high'] /= df['adjust_factor']
df['low'] /= df['adjust_factor']
df['close'] /= df['adjust_factor']

# 设置 date 为index,index将被用作x轴
df.set_index('date', inplace=True)
# 设置index的名字为None,在x轴将不显示x轴数据的名字
df.index.name = None
In [3]:
df.tail()
Out[3]:
instrument open high low close adjust_factor amount return_1 return_5
2017-01-20 000001.SZA 9.17 9.230000 9.170000 9.220000 104.758255 361865152.0 0.004357 0.006550
2017-01-23 000001.SZA 9.22 9.259999 9.200000 9.220000 104.758255 388019072.0 0.000000 0.008753
2017-01-24 000001.SZA 9.23 9.280000 9.200000 9.270000 104.758255 434787744.0 0.005423 0.013115
2017-01-25 000001.SZA 9.27 9.280000 9.250000 9.259999 104.758255 281976288.0 -0.001079 0.009815
2017-01-26 000001.SZA 9.27 9.340000 9.259999 9.330000 104.758255 391844288.0 0.007559 0.016340

基础折线

In [4]:
# 显示股票收盘价
T.plot(df[['close']], title='收盘价', chart_type='line')

面积图

In [5]:
T.plot(df[['low', 'high']], title='最高最低价格', chart_type='area', stock=False)

更多图表类型

支持Highcharts所有的图表类型:

  • area :面积图
  • areaspline
  • areasplinerange
  • bar :条形图
  • boxplot
  • bubble :气泡图
  • column :柱状图
  • columnrange
  • errorbar
  • funnel
  • gauge
  • heatmap
  • line
  • pie :饼图
  • polygon
  • pyramid
  • scatter :散点图
  • solidgauge
  • spline :曲线图
  • treemap
  • waterfall
  • candlestick :蜡烛图
  • ohlc
  • flag

分栏显示

In [6]:
T.plot(df[['open', 'high', 'low', 'close', 'return_1', 'return_5']],
       # high、low显示在第一栏,高度40%,open、close显示在第二栏,其他的在最后一栏
       panes=[['high', 'low', '40%'], ['open', 'close', '40%']],
       # height=500,设置高度为500
       options={'chart':{'height': 500}})

蜡烛图

In [7]:
T.plot(df[['open', 'high', 'low', 'close', 'amount']],
       # 设置图表title和高度;'series': [{},{'type': 'column'}] 设置第二个数据系列(即 amount)显示类型为柱状图(column)
       options={'chart': {'title': '股票数据分析', 'height': 500}, 'series': [{},{'type': 'column'}]},
       stock=True, candlestick=True)

自定义

实现分栏显示

用options参数来自己实现分栏显示

In [8]:
# 参考 文档 http://api.highcharts.com/highstock/yAxis
y_axis = [
    {
        'labels': {'align': 'right', 'x': -3 },
        'title': {'text': '价格'},
        'height': '50%', 'lineWidth': 2
    },
    {
        'labels': {'align': 'right','x': -3},
        'title': {'text': '日收益'},
        'top': '55%', 'height': '25%', 'offset': 0, 'lineWidth': 2
    },
    {
        'labels': {'align': 'right', 'x': -3},
        'title': {'text': '交易额'},
        'top': '85%', 'height': '25%', 'offset': 0, 'lineWidth': 2,
    }
]
# series:只覆盖我们需要修改的字段,这里是 yAxis
options = {
    'chart': {'type': 'spline', 'height': 500},
    'title': {'text': '股票数据分析'},
    'yAxis': y_axis,
    'series': [{},{'yAxis': 1},{'yAxis': 2, 'type': 'column'}]
}

T.plot(df[['close', 'return_1', 'amount']], options=options, stock=True)

实现蜡烛图

通过options回调函数,构建OHLC数据来实现蜡烛图

In [9]:
def candlestick_processor(df_options):
    # df_options:为df转化后的数据

    # 蜡烛图

    # 生成ohlc:从series中读取OHLC数据(前四列)合并
    ohlc_series = {}
    other_series = []
    series = df_options['series']
    for s in series:
        if s['name'] in {'open', 'high', 'low', 'close'}:
            ohlc_series[s['name']] = s
        else:
            other_series.append(s)
    if len(ohlc_series) != 4:
        print('【错误】蜡烛图,没有找到open, high, low, close数据,请确保输入的数据有这四列')
        return None

    ohlc_data = []
    for i in range(0, len(ohlc_series['open']['data'])):
        row = [ohlc_series['open']['data'][i][0]]
        for j in ['open', 'high', 'low', 'close']:
            row.append(ohlc_series[j]['data'][i][1])
        ohlc_data.append(row)
    df_options['series'] = [{'data': ohlc_data, 'name': 'OHLC', 'yAxis': 0, 'type': 'candlestick',}] + other_series

    if other_series:
        #  设置其他数据使用第二个y轴
        for s in other_series:
            s.update({'yAxis':1, 'type': 'column'})
        y_axis = [
            {
                'labels': {'align': 'right', 'x': -3},
                'title': {'text': 'OHLC'},
                'height': '60%', 'lineWidth': 2
            },
            {
                'labels': {'align': 'right', 'x': -3},
                'top': '65%', 'height': '35%', 'offset': 0, 'lineWidth': 2,
            }
        ]
        df_options = T.deep_update(df_options, {'yAxis': y_axis})

    return df_options

T.plot(df[['open', 'high', 'low', 'close', 'amount']], options=candlestick_processor, title='股票数据分析', stock=True)

查看生成的数据

In [10]:
# output可取值 object / display,默认为display,表示直接显示。object对应highchart/highstock的输入数据,用于高级需求自定义。
T.plot(df[['close']].head(3), title='收盘价', chart_type='line', output='object')
Out[10]:
{'chart': {'type': 'line'},
 'legend': {'enabled': True},
 'series': [{'data': [(Timestamp('2015-01-05 00:00:00'), 16.020000457763672),
    (Timestamp('2015-01-06 00:00:00'), 15.779999732971191),
    (Timestamp('2015-01-07 00:00:00'), 15.480000495910645)],
   'name': 'close',
   'yAxis': 0}],
 'stock': True,
 'title': {'text': '收盘价'},
 'xAxis': {'type': 'datetime'}}

matplotlib绘图中文显示
一文带你快速入门股票量化交易
量化小课堂-Python&Pandas系列第三讲:跌了这么多,创业板可以买买买了吗?
策略研究常用功能
【宽客学院】数据可视化
有 用数据出些历史数据曲线图的例子吗,谢谢
(夹心巧克力^_^) #2

感谢小Q。以前听说R语言画图好看,现在估计也不能和python比了。


(AlphaDigger001) #3

请问为什么点击克隆,却跳转到了lab之后,空白一片, 无法克隆notebook?

还有将来策略平台和研究平台会分离吗?

如何支持自己写的一些helper function库?


(小Q) #4

谢谢反馈。

  1. 第一个问题我们马上处理
  2. 策略平台和研究平台不会分离,但我们接下来会上线一系列的体验改进
  3. 自定义的一些库、私有数据我们已经在开发支持,以后可以上传自己的私有数据、保存自己的自定义库

(小Q) #5

你再试试是否可以克隆策略,我们今天调试时没有问题的。有问题随时交流:slight_smile:


(AlphaDigger001) #6

谢谢这么快速的回复哈

我又试了一下,还是clone失败;
先是转到这个url:
https://i.bigquant.com/user/alphadigger001/lab/share/Pandas DataFrame与Highcharts图表-Clone4.ipynb

然后可能是建立内核失败,跳到了策略的首页:
https://i.bigquant.com/user/alphadigger001/lab

主要就是这个现象,希望这些信息能帮到你们debug


(小Q) #7

谢谢补充信息。

问题已经解决:原来的代码中对用户名大小写处理不一致,导致克隆失败。已经修复如下:

你现在克隆,应该可以了。


(AlphaDigger001) #8

赞哦,成功了:smile:


(小Q) #9

:slight_smile:


(CHAIFUJING) #10

点:克隆策略,结果:Server Error (500)。好几天了:sleepy:


(小Q) #11

你好,为便于及时反馈信息,你可以加入BigQuant官方QQ交流群:625326167
如果点击克隆,出现Sever Error 错误,你可以忽略该错误,直接点击 我的策略 进入,策略研究界面,在自己的策略研究界面,你找找刚刚你克隆的那个策略,应该可以可以找到的。


(aurums) #12

已学习完毕,mark


(micalun) #13

怎么没有import库?这个T.plot是社么鬼?


(小Q) #14

@micalun 系统已经默认 import 了这个库。T.plot 是BigQuant平台的交互式图表绘制函数。


BigQuant上是否有关于MPT投资组合的策略,比如。。。
(micalun) #15

懂了 谢谢


(sweetmoon007) #16

你好,请问如何把蜡烛图和均线画在同一个pane里面呢,现在的效果是两个pane?

col_list=[‘open’,‘high’,‘low’,‘close’,‘ma_5’]
T.plot(plot_data[col_list], output=‘display’, candlestick=True, options={‘chart’:{‘height’: 1000}})


(hugo) #18
import talib
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.finance as mpf


# 获取数据
data = D.history_data(['000001.SHA'], start_date='2017-01-01', end_date='2017-06-30',
                      fields=['close','high','open','high','low','volume'])
data=data.set_index('date')

# 计算 10 日和 30 日均线
#使用talib的时候需要更改数据类型....
sma_10 = talib.SMA(np.array(data['close'].astype('double')), 10)
sma_30 = talib.SMA(np.array(data['close'].astype('double')), 30)

# 创建图像和子图
fig = plt.figure(figsize=(17, 10))
ax = fig.add_axes([0,0.2,1,0.5])
ax2 = fig.add_axes([0,0,1,0.2])

# k 线
mpf.candlestick2_ochl(ax, data['open'], data['close'], data['high'], data['low'], 
                      width=0.5, colorup='r', colordown='g', alpha=0.8)

# 设置横轴坐标
ax.set_xticks(range(0, len(data.index), 10))
ax.plot(sma_10, label='10 日均线')
ax.plot(sma_30, label='30 日均线')

# 创建图例
ax.legend(loc='upper left')

# 网格
ax.grid(True)

# 成交量
mpf.volume_overlay(ax2, data['open'], data['close'], data['volume'], colorup='r', colordown='g', width=0.5, alpha=0.8)
ax2.set_xticks(range(0, len(data.index), 10))
ax2.set_xticklabels(data.index.strftime('%Y-%m-%d')[::10], rotation=30)
ax2.grid(True)

plt.show()

这样可以实现,你按你的需求改一下吧


(sweetmoon007) #19

多谢大神!


(hugo) #20

https://community.bigquant.com/t/简单画出k线及均线/5039
这里有 你可以看看这个


(sweetmoon007) #21

学习了!