新手教程—Seaborn库使用示例

Seaborn是Python常用的统计数据可视化库,以下内容简单介绍Seaborn如何使用。


In [1]:
#导入需要的程序包
import pandas as pd
import seaborn as sns

股票收益曲线示例


In [2]:
# 获取600196.XSHG的2015年01月的日级数据, 只获取open+close字段
df = get_price('600196.XSHG', start_date='2014-01-01', end_date='2015-01-31', frequency='daily', fields=['open','close']) 
returns = df.pct_change().dropna()
sns.distplot(returns.iloc[:,0:1])


Out[2]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f2802524790>

股票相关性分析

两只股票的相关性分析

我们可以比较不同股票的相关性,通过线性回归,画出不同股票的拟合曲线、置信区间(阴影区域)、皮尔森回归系数以及P值。


In [3]:
pingan = get_price('000001.XSHE', start_date='2014-01-01', end_date='2015-02-01', frequency='daily', fields=['open'])
fuxing = get_price('600196.XSHG', start_date='2014-01-01', end_date='2015-02-01', frequency='daily', fields=['open'])

returns_pingan = pingan.pct_change().dropna()
returns_fuxing = fuxing.pct_change().dropna()

sns.jointplot(returns_pingan['open'], returns_fuxing['open'], kind='reg', size=12)


Out[3]:
<seaborn.axisgrid.JointGrid at 0x7f2801cafbd0>

从以上各图,可以分析两只股票之间是否存在一个可能的投资机会,如果散点均匀分布在直线周围,表明两个股票有较强的相关性。

多支股票相关性分析

同一板块的股票相关性较强,我们以农业板块(A01)的股票作为示例分析多支股票的相关性。


In [8]:
df = get_price(get_industry_stocks('A01'), fields=('close',))['close']
df


Out[8]:
000998.XSHE 002041.XSHE 300087.XSHE 300143.XSHE 300189.XSHE 600108.XSHG 600313.XSHG 600354.XSHG 600359.XSHG 600371.XSHG 600506.XSHG 600540.XSHG 600598.XSHG 601118.XSHG
2015-01-05 19.77 12.84 5.21 12.76 6.78 9.53 11.39 8.81 10.92 10.66 11.33 8.16 10.17 8.88
2015-01-06 20.17 13.05 5.38 12.76 6.95 9.77 11.70 8.75 11.08 10.82 11.62 8.30 10.51 9.15
2015-01-07 20.01 12.98 5.32 11.48 6.89 10.00 11.90 8.85 11.07 10.81 11.54 8.28 10.54 9.03
2015-01-08 20.56 13.16 5.44 10.58 6.93 9.79 12.00 8.89 11.12 10.87 11.81 8.30 10.56 8.85
2015-01-09 20.19 13.01 5.30 10.39 6.80 9.43 11.61 8.60 10.80 10.58 11.73 8.19 10.43 8.61
2015-01-12 19.65 13.11 5.14 10.07 6.66 9.47 11.58 8.47 10.73 10.38 11.34 8.09 10.42 8.89
2015-01-13 20.03 13.28 5.32 10.36 6.82 9.52 11.87 8.78 10.90 10.51 11.54 8.12 10.44 8.94
2015-01-14 19.64 13.09 5.24 10.13 6.69 9.47 11.68 8.64 10.88 10.45 11.84 8.17 10.17 8.75
2015-01-15 19.80 13.18 5.33 10.18 6.76 9.58 11.79 8.65 11.11 10.55 11.86 8.28 10.35 8.90
2015-01-16 20.21 13.40 5.50 10.26 6.89 10.02 12.14 8.80 11.25 10.73 11.98 8.34 10.51 9.09
2015-01-19 19.64 13.44 5.43 10.28 6.64 9.68 11.95 8.42 10.79 10.45 11.96 8.14 10.10 8.60
2015-01-20 20.05 13.69 5.61 10.55 6.83 10.04 12.52 8.59 11.10 10.76 12.33 8.31 10.48 8.80
2015-01-21 20.48 13.93 5.76 10.82 7.00 10.25 13.26 8.84 11.29 10.96 12.65 8.49 10.82 8.94
2015-01-22 21.08 14.06 5.81 10.85 7.20 10.43 13.76 9.18 11.58 11.18 12.76 8.64 11.09 9.25
2015-01-23 20.66 13.80 5.70 10.85 7.08 10.11 13.63 8.98 11.36 10.95 12.62 8.57 10.94 9.06
2015-01-26 20.76 13.90 5.73 10.87 7.16 10.15 13.89 9.08 11.49 11.13 12.74 8.83 11.42 9.20
2015-01-27 21.22 14.09 6.07 10.91 7.27 10.46 14.89 9.37 11.73 11.22 12.79 9.02 11.59 9.34
2015-01-28 20.75 13.82 6.31 11.21 7.20 10.19 14.32 9.24 11.54 11.00 12.61 9.00 11.50 9.15
2015-01-29 20.65 13.53 6.20 11.12 7.21 10.08 14.34 9.36 11.24 10.89 12.32 8.95 11.43 9.04
2015-01-30 21.43 13.80 6.29 10.69 7.37 10.27 14.50 9.40 11.34 11.22 12.26 8.89 11.49 9.14
2015-02-02 20.99 13.46 6.24 10.55 7.20 9.66 13.47 8.93 11.31 11.26 12.22 8.93 10.92 8.81
2015-02-03 20.60 13.25 6.34 10.75 7.14 9.46 13.59 8.74 11.13 11.04 12.37 9.23 10.81 8.73
2015-02-04 20.14 13.24 6.27 10.76 7.12 9.24 13.09 8.60 10.87 11.23 12.45 8.88 10.73 8.64
2015-02-05 19.97 13.01 6.09 10.80 7.12 8.98 12.92 8.44 10.70 11.13 12.18 8.70 10.58 8.37
2015-02-06 19.15 12.70 5.86 10.47 6.98 8.58 12.45 8.14 10.35 10.80 11.88 8.50 10.36 7.93
2015-02-09 18.83 12.89 5.90 10.50 6.98 8.64 13.36 8.18 10.33 10.61 11.85 8.40 10.44 8.01
2015-02-10 19.12 12.94 5.88 10.75 7.11 8.71 13.75 8.25 10.27 10.66 11.85 8.44 10.41 8.04
2015-02-11 19.02 13.06 6.03 11.01 7.13 8.82 14.51 8.28 10.61 10.67 11.98 8.66 10.75 8.18
2015-02-12 19.31 12.90 6.21 11.18 7.18 8.77 14.41 8.20 10.57 10.98 12.08 8.71 11.03 8.14
2015-02-13 19.52 13.03 6.28 11.57 7.25 8.90 14.31 8.34 10.71 11.06 12.29 8.91 11.04 8.23
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2015-09-01 19.52 14.99 14.98 12.55 28.37 6.77 11.12 6.85 9.28 11.16 14.11 8.06 12.41 7.15
2015-09-02 18.69 15.60 14.98 11.49 28.37 6.73 10.01 6.29 8.48 10.48 13.19 7.25 11.18 6.45
2015-09-07 19.26 15.75 14.98 12.64 28.37 6.84 10.37 6.45 8.80 11.13 13.66 7.54 11.97 6.57
2015-09-08 20.98 16.07 14.98 13.90 28.37 7.29 11.20 7.02 9.35 12.13 14.53 8.06 12.86 6.93
2015-09-09 21.17 16.33 14.98 14.27 28.37 7.32 11.86 7.30 9.88 12.69 15.04 8.63 13.21 7.22
2015-09-10 19.90 15.85 14.98 15.70 28.37 7.21 11.89 7.21 10.87 12.61 15.45 8.90 13.22 7.04
2015-09-11 19.62 15.65 14.98 16.23 28.37 7.21 12.07 7.33 11.42 12.60 15.99 9.13 13.23 7.20
2015-09-14 18.53 14.11 14.98 14.61 28.37 7.00 10.87 6.60 10.28 11.34 14.39 8.22 13.44 6.84
2015-09-15 17.81 13.68 14.98 13.78 28.37 6.30 10.27 5.98 9.25 10.21 14.06 7.40 12.10 6.16
2015-09-16 19.40 14.86 14.98 15.16 28.37 6.81 11.25 6.58 10.18 11.23 15.46 8.13 13.19 6.74
2015-09-17 18.69 14.45 14.98 14.21 28.37 6.44 10.70 6.38 9.77 11.19 14.84 7.78 12.64 6.47
2015-09-18 19.02 14.53 14.98 14.31 28.37 6.51 10.92 6.62 9.90 12.09 15.33 8.01 12.72 6.55
2015-09-21 19.49 14.83 14.98 15.74 28.37 6.70 11.30 6.89 10.39 12.45 15.77 8.35 13.13 6.73
2015-09-22 19.55 14.88 14.98 16.97 28.37 7.11 11.99 6.91 11.08 12.47 15.89 8.62 13.86 7.08
2015-09-23 19.00 14.51 14.98 17.20 28.37 6.79 11.64 7.00 11.19 12.11 15.52 8.86 13.55 6.72
2015-09-24 19.15 14.60 14.98 17.41 28.37 6.89 11.98 7.03 11.06 12.49 16.85 8.79 13.68 6.82
2015-09-25 18.80 14.22 14.98 16.90 28.37 6.71 11.39 6.68 10.38 11.66 15.40 8.14 13.53 6.59
2015-09-28 18.92 14.35 14.98 18.59 28.37 6.96 11.50 6.87 10.62 12.13 15.28 8.79 13.71 6.82
2015-09-29 18.37 14.23 14.98 18.01 28.37 7.00 11.46 6.96 10.56 12.23 15.28 9.14 13.74 6.99
2015-09-30 18.30 14.27 14.98 16.89 28.37 7.21 11.93 6.80 10.42 12.16 15.04 9.01 14.32 7.39
2015-10-08 19.40 14.82 14.98 18.58 28.37 7.61 13.12 7.14 11.09 12.82 15.64 9.26 15.75 7.70
2015-10-09 20.27 15.50 14.98 18.78 28.37 7.88 14.02 7.31 11.20 13.74 15.63 9.25 16.19 8.09
2015-10-12 20.99 16.17 14.98 18.80 28.37 7.87 14.25 7.62 11.58 14.27 16.50 9.68 16.81 8.08
2015-10-13 20.81 16.06 14.98 20.43 28.37 8.05 14.65 7.80 11.67 14.39 16.74 9.59 17.58 8.30
2015-10-14 20.90 16.24 14.98 20.05 28.37 7.90 14.24 7.65 11.68 14.00 16.76 9.32 16.79 7.98
2015-10-15 21.35 16.49 14.98 22.03 28.37 8.12 14.51 7.83 11.92 14.32 17.29 9.51 16.93 8.11
2015-10-16 21.39 16.46 14.98 21.70 28.37 8.14 14.29 8.08 11.87 14.60 17.98 9.65 16.56 8.06
2015-10-19 20.60 15.83 14.98 21.00 28.37 7.97 14.08 7.87 11.59 16.00 17.94 9.51 16.42 8.15
2015-10-20 21.00 16.20 14.98 20.56 28.37 8.11 14.19 7.99 11.72 15.90 17.88 9.68 16.53 8.17
2015-10-21 19.38 15.03 14.98 18.50 28.37 7.30 12.77 7.20 10.55 14.31 16.52 8.78 14.88 7.35

193 rows × 14 columns


In [9]:
df1 = df.iloc[:,0:5]
df1


Out[9]:
000998.XSHE 002041.XSHE 300087.XSHE 300143.XSHE 300189.XSHE
2015-01-05 19.77 12.84 5.21 12.76 6.78
2015-01-06 20.17 13.05 5.38 12.76 6.95
2015-01-07 20.01 12.98 5.32 11.48 6.89
2015-01-08 20.56 13.16 5.44 10.58 6.93
2015-01-09 20.19 13.01 5.30 10.39 6.80
2015-01-12 19.65 13.11 5.14 10.07 6.66
2015-01-13 20.03 13.28 5.32 10.36 6.82
2015-01-14 19.64 13.09 5.24 10.13 6.69
2015-01-15 19.80 13.18 5.33 10.18 6.76
2015-01-16 20.21 13.40 5.50 10.26 6.89
2015-01-19 19.64 13.44 5.43 10.28 6.64
2015-01-20 20.05 13.69 5.61 10.55 6.83
2015-01-21 20.48 13.93 5.76 10.82 7.00
2015-01-22 21.08 14.06 5.81 10.85 7.20
2015-01-23 20.66 13.80 5.70 10.85 7.08
2015-01-26 20.76 13.90 5.73 10.87 7.16
2015-01-27 21.22 14.09 6.07 10.91 7.27
2015-01-28 20.75 13.82 6.31 11.21 7.20
2015-01-29 20.65 13.53 6.20 11.12 7.21
2015-01-30 21.43 13.80 6.29 10.69 7.37
2015-02-02 20.99 13.46 6.24 10.55 7.20
2015-02-03 20.60 13.25 6.34 10.75 7.14
2015-02-04 20.14 13.24 6.27 10.76 7.12
2015-02-05 19.97 13.01 6.09 10.80 7.12
2015-02-06 19.15 12.70 5.86 10.47 6.98
2015-02-09 18.83 12.89 5.90 10.50 6.98
2015-02-10 19.12 12.94 5.88 10.75 7.11
2015-02-11 19.02 13.06 6.03 11.01 7.13
2015-02-12 19.31 12.90 6.21 11.18 7.18
2015-02-13 19.52 13.03 6.28 11.57 7.25
... ... ... ... ... ...
2015-09-01 19.52 14.99 14.98 12.55 28.37
2015-09-02 18.69 15.60 14.98 11.49 28.37
2015-09-07 19.26 15.75 14.98 12.64 28.37
2015-09-08 20.98 16.07 14.98 13.90 28.37
2015-09-09 21.17 16.33 14.98 14.27 28.37
2015-09-10 19.90 15.85 14.98 15.70 28.37
2015-09-11 19.62 15.65 14.98 16.23 28.37
2015-09-14 18.53 14.11 14.98 14.61 28.37
2015-09-15 17.81 13.68 14.98 13.78 28.37
2015-09-16 19.40 14.86 14.98 15.16 28.37
2015-09-17 18.69 14.45 14.98 14.21 28.37
2015-09-18 19.02 14.53 14.98 14.31 28.37
2015-09-21 19.49 14.83 14.98 15.74 28.37
2015-09-22 19.55 14.88 14.98 16.97 28.37
2015-09-23 19.00 14.51 14.98 17.20 28.37
2015-09-24 19.15 14.60 14.98 17.41 28.37
2015-09-25 18.80 14.22 14.98 16.90 28.37
2015-09-28 18.92 14.35 14.98 18.59 28.37
2015-09-29 18.37 14.23 14.98 18.01 28.37
2015-09-30 18.30 14.27 14.98 16.89 28.37
2015-10-08 19.40 14.82 14.98 18.58 28.37
2015-10-09 20.27 15.50 14.98 18.78 28.37
2015-10-12 20.99 16.17 14.98 18.80 28.37
2015-10-13 20.81 16.06 14.98 20.43 28.37
2015-10-14 20.90 16.24 14.98 20.05 28.37
2015-10-15 21.35 16.49 14.98 22.03 28.37
2015-10-16 21.39 16.46 14.98 21.70 28.37
2015-10-19 20.60 15.83 14.98 21.00 28.37
2015-10-20 21.00 16.20 14.98 20.56 28.37
2015-10-21 19.38 15.03 14.98 18.50 28.37

193 rows × 5 columns

使用pct_change()计算收益率,使用dropna去除缺失值,使用distplot画出直方分布图。


In [10]:
returns = df1.pct_change().dropna()
sns.distplot(returns.iloc[:,0:1])


Out[10]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f27feb6e850>

如果有多组数据需要通过统计分布图进行比较,可以使用violinplot得到小提琴图。


In [16]:
sns.violinplot(returns,size=24)


Out[16]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f27f748de50>

使用pairplot画出散点图,通过散点图分析两两之间的关系


In [12]:
sns.pairplot(returns, diag_kind='kde', size=2.4)


Out[12]:
<seaborn.axisgrid.PairGrid at 0x7f27ff264990>

更多相关性分析方法

我们可以通过使用heatmap更系统地探索相关性


In [13]:
sns.heatmap(returns.corr())


Out[13]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f27fd465210>

还可以通过clustermap画出聚类图,将相近的聚成一类;您可以通过查阅机器学习相关书籍了解更多过关于聚类的信息。


In [30]:
sns.clustermap(returns.corr())


Out[30]:
<seaborn.matrix.ClusterGrid at 0x7ff867c44550>

In [4]:
sns.clustermap?