新闻中心
利用Python可视化股票涨跌数据

时间:2021年5月24日 09时07分


Python语言简洁、易学、具有非常丰富的类库,已经成为一种通用的编程语言,并且在科学计算、图像处理、数据处理、人工智能、机器人等众多领域得到了广泛的应用。在金融领域,Python也拥有大量的金融数据分析相关的类库,并能提供与C++、Java等语言的接口以实现高效的分析,是金融分析、量化交易等领域最多的语言。

金融行业经常用到的图表有曲线图、直方图、条形图、散点图、饼图等,下表列出了常用的金融学图表。

■常用金融学图表

01

曲线图

曲线图是金融领域最常见的图表,下面我们看一个具体实例。

在金融领域有一个著名的模型——资本资产定价模型(Capital Asset Pricing Model,CAPM),作为一个资本市场均衡模型,它是现代金融学的奠基石。该模型对于资产风险及其预期收益率之间的关系给出了精确的预测,提供了一种对潜在投资项目估计其收益率的方法,使人们能对不在市场交易的资产同样做出合理的估价。为了演示绘制曲线图,我们直接给出该模型公式:

β

其中,R i ,是投资资产的预期收益率;

R F (Risk free rate),是无风险回报率,纯粹的货币时间价值;

β是证券的Beta系数,是对系统风险的一种度量;

R M 是市场期望回报率(Expected Market Return),是由所有可投资资产组合产生的收益率,也称“市场收益率”(Return on the Market);

(R M -R F )是股票市场溢价(Equity Market Premium)。

资本资产定价模型的图示形式称为证券市场线(Securities Market Line,SML)。它主要用来说明投资组合报酬率与系统风险程度β系数之间的关系,以及市场上所有风险性资产的均衡期望收益率与风险之间的关系。

例1 假定某一支股票的无风险回报率是3%,市场期望回报率是9%,β值处于[0.5 , 2.0]的区间之中,请绘制该股票的证券市场线。

代码如下:

importmatplotlib.pyplot asplt

beta = np.linspace( 0.5, 2.0, 100) #产生0.5-2.0的100项等差数列

Rf = 0.03

Rm = 0.09

Ri = Rf+beta*(Rm-Rf)

plt.figure(figsize = ( 8, 4))

plt.plot(beta,Ri, 'r-',label = 'SML',lw = 2)

plt.plot( 1.0,Rf+ 1.0*(Rm-Rf), 'o',lw = 2.5)

plt.axis( 'tight')

plt.xticks(fontsize = 14) #设置横坐标字体

plt.xlabel( 'beta',fontsize = 18)

plt.xlim( 0.4, 2.1)

plt.yticks(fontsize = 14) #设置纵坐标字体

plt.ylabel( 'Ri',fontsize = 18,rotation = 0)

plt.title( 'Example 9-7 CAPM',fontsize = 18)

plt.annotate( 'beta = 1',fontsize = 14,\

xy = ( 1.0, 0.09),xytext = ( 0.8, 0.15),\

arrowprops = dict(facecolor = 'b',shrink = 0.05))

#箭头对点(1.0,0.09)创建注释,在(0.8,0.15)位置输出注释文本'beta = 1'

plt.legend(loc = 0,fontsize = 18)

plt.grid

plt.show

程序运行结果如图1所示:

■ 图1 例1运行结果图

例2 我们用表2的数据,绘制四只股票在2020年4月3日的涨跌幅条形图。

■2020年3月30日至4月3日股票的涨跌幅(%)

具体代码如下:

importnumpy asnp

importpandas aspd

importmatplotlib.pyplot asplt

stock_array = np.array([[ 9.96, 4.76, -0.25, 1.61, 9.99],\

[ 10.17, 10, 10.14, 10.16, 10.09],\

[ 10, 3.95, 9.99, 10.02, 10.01],\

[ -0.07, 10.01, 1.13, -2.52, -3.82]])

date = [ '2020-3-30', '2020-3-31', '2020-4-1', '2020-4-2', '2020-4-3']

stock = [ 'SZ000505', 'SZ002770', 'SH600855', 'SH603719']

stock_dataframe = pd.DataFrame(data = stock_array.T, \

index = date,columns = stock)

plt.figure(figsize = ( 8, 4))

plt.bar(x = stock_dataframe.columns,\

height = stock_dataframe.iloc[ 4],\

width = 0.5,label = '2020-4-3')

plt.xticks(fontsize = 14)

plt.yticks(fontsize = 14)

plt.ylim( -4.0, 11.0)

plt.ylabel( 'up or down(%)',fontsize = 14,rotation = 90)

plt.title( 'Example 9-9 Bar Chart',fontsize = 18)

plt.legend(loc = 0,fontsize = 18)

plt.grid

plt.show

程序运行结果如图2所示:

■ 图2 【例2】运行结果图

例3 我们从外部Excel文件中导入沪深300指数在2016年每个交易日的开盘点数、最高点数、最低点数、收盘点数的所有数据,并利用这些数据创建数据框。图3是我们需要导入的Excel文件。

我们将生成的数据框作为数据可视化对象,运用subplot方法绘制相应的4(2×2)个图形,分别展示2016年全部交易日的开盘点位、最高点位、最低点位、收盘点位的走势曲线。具体的代码如下:

importpandas aspd

importmatplotlib.pyplot asplt

frompylab importmpl #为了在可视化的图形中正常显示中文,

#从pylab导入子模块mpl

mpl.rcParams[ 'font.sans-serif'] = [ 'SimHei'] #设置中文字体为黑体

mpl.rcParams[ 'axes.unicode_minus'] = False

HS300 = pd.read_excel( 'c:/example/hs300(2016).xlsx',\

header = 0,\

index_col = 0) #从外部Excel文件导入数据生成数据框

plt.figure(figsize = ( 11, 9))

plt.subplot( 2, 2, 1) #绘制第1行,第1列子图

plt.plot(HS300[ '开盘'], 'b-',label = u'沪深300开盘点位',lw = 2.0)

plt.xticks(fontsize = 13,rotation = 30)

plt.xlabel( u'日期',fontsize = 13)

plt.yticks(fontsize = 13)

plt.ylabel( u'点位',fontsize = 13,rotation = 0)

plt.legend(loc = 0,fontsize = 13)

plt.grid

plt.subplot( 2, 2, 2) #绘制第1行,第2列子图

plt.plot(HS300[ '最高'], 'g-',label = u'沪深300最高点位',lw = 2.0)

plt.xticks(fontsize = 13,rotation = 30)

plt.xlabel( u'日期',fontsize = 13)

plt.yticks(fontsize = 13)

plt.ylabel( u'点位',fontsize = 13,rotation = 0)

plt.legend(loc = 0,fontsize = 13)

plt.grid

plt.subplot( 2, 2, 3) #绘制第2行,第1列子图

plt.plot(HS300[ '最低'], 'r-',label = u'沪深300最低点位',lw = 2.0)

plt.xticks(fontsize = 13,rotation = 30)

plt.xlabel( u'日期',fontsize = 13)

plt.yticks(fontsize = 13)

plt.ylabel( u'点位',fontsize = 13,rotation = 0)

plt.legend(loc = 0,fontsize = 13)

plt.grid

plt.subplot( 2, 2, 4) #绘制第2行,第2列子图

plt.plot(HS300[ '收盘'], 'k-',label = u'沪深300收盘点位',lw = 2.0)

plt.xticks(fontsize = 13,rotation = 30)

plt.xlabel( u'日期',fontsize = 13)

plt.yticks(fontsize = 13)

plt.ylabel( u'点位',fontsize = 13,rotation = 0)

plt.legend(loc = 0,fontsize = 13)

plt.grid

plt.show

■ 图3 沪深300指数2016年历史数据

程序运行结果如图4所示。

■ 图4 2016年沪深300指数走势图