http://www.lideedu.com

【Python量化】股票分析入门

目前,获取股票数据的渠道有很多,而且基本上是免费的,比如,行情软件有同花顺、东方财富等,门户网站有新浪财经、腾讯财经、和讯网等。Python也有不少免费的开源api可以获取交易行情数据,如pandas自带的库,tushare和baostock等。由于pandas库不再支持yahoo数据库后变得很不好用,而baostock最早记录的数据是2006年,因此本文主要讲讲如何使用tushare获取股票交易数据和可视化分析,tushare基本上记录了股票自上市之日起所有的日交易数据,是目前分析国内A股(支持其他非股票行情数据,如期货)比较好用的开源接口。

阅读本文之前,建议学习或回顾下【手把手教你】系列文章,熟悉掌握pandas、tushare、numpy和matplotlib等包的使用,不然后面代码阅读起来可能比较吃力。

获取股票数据

01

使用tushare包的get_k_data()函数来获取股票交易数据,具体可以通过命令help(ts.get_k_data)了解函数和参数含义。

#先引入后面可能用到的包(package)

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

#正常显示画图时出现的中文

from pylab import mpl

#这里使用微软雅黑字体

mpl.rcParams['font.sans-serif']=['SimHei']

#画图时显示负号

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

import seaborn as sns #画图用的

import tushare as ts

#Jupyter Notebook特有的magic命令

#直接在行内显示图形

%matplotlib inline

02

小试牛刀:获取上证指数自发布以来的数据

sh=ts.get_k_data(code='sh',ktype='D',

autype='qfq', start='1990-12-20')

#code:股票代码,个股主要使用代码,如‘600000’

#ktype:'D':日数据;‘m’:月数据,‘Y’:年数据

#autype:复权选择,默认‘qfq’前复权

#start:起始时间

#end:默认当前时间

#查看下数据前5行

sh.head(5)

能看到的第一列是索引,对于pandas的数据结构,最后将索引设置为时间序列,在线配资平台,方便后面可视化分析。

#将数据列表中的第0列'date'设置为索引

sh.index=pd.to_datetime(sh.date)

#画出上证指数收盘价的走势

sh['close'].plot(figsize=(12,6))

plt.title('上证指数1990-2018年走势图')

plt.xlabel('日期')

plt.show()

【Python量化】股票分析入门

上面的指数走势图还是可以清晰看出,股指分别在2007年和2015年有两波大牛市,然后又从高峰跌入谷底,目前处于下跌通道。真是辛辛苦苦28年,一夜回到解放前o(╥﹏╥)o

描述性统计

#pandas的describe()函数提供了数据的描述性统计

#count:数据样本,mean:均值,配资网站,std:标准差

sh.describe().round(2)

结果如下表所示:

【Python量化】股票分析入门

从上述结果可以看出,上证指数从1990年12月20日至2018年11月7日(最后交易日是当前运行时间),一共有6645个样本,均值为1937.52点,标准差为1079.51点(波动还是比较大的),最大值是6092.06点。

#再查看下每日成交量

#2006年市场容量小,交易量比较小,我们从2007年开始看

sh.loc["2007-01-01":]["volume"].plot(figsize=(12,6))

plt.title('上证指数2007-2018年日成交量图')

plt.xlabel('日期')

plt.show()

【Python量化】股票分析入门

上图的成交量反映了一个有趣的现象,2014-2015年的大牛市很可能是天量的交易推动起来的,因为这期间实体经济并不景气,央行多次降息降准,货币宽松,资金流入股市,银行理财等影子银行在这期间疯狂扩张,场外加杠杆和配资主导了这一场牛市。感兴趣的朋友可以结合货币供给、实体经济指标、影子银行等数据一起分析,进行交叉验证。

均线分析

#这里的平均线是通过自定义函数,手动设置20,52,252日均线

#移动平均线:

ma_day = [20,52,252]

for ma in ma_day:

column_name = "%s日均线" %(str(ma))

sh[column_name] =sh["close"].rolling(ma).mean()

#sh.tail(3)

#画出2010年以来收盘价和均线图

sh.loc['2010-10-8':][["close",

"20日均线","52日均线","252日均线"]].plot(figsize=(12,6))

plt.title('2010-2018上证指数走势图')

plt.xlabel('日期')

plt.show()

【Python量化】股票分析入门

日收益率可视化

#2005年之前的数据噪音太大,主要分析2005年之后的

sh["日收益率"] = sh["close"].pct_change()

sh["日收益率"].loc['2005-01-01':].plot(figsize=(12,4))

plt.xlabel('日期')

plt.ylabel('收益率')

plt.title('2005-2018年上证指数日收益率')

plt.show()

【Python量化】股票分析入门

###这里我们改变一下线条的类型

#(linestyle)以及加一些标记(marker)

sh["日收益率"].loc['2014-01-01':].plot(figsize=

(12,4),linestyle="--",marker="o",color="g")

plt.title('2014-2018年日收益率图')

plt.xlabel('日期')

plt.show()

【Python量化】股票分析入门

分析多只股票(指数)

#分析下常见的几个股票指数

stocks={'上证指数':'sh','深证指数':'sz','沪深300':'hs300',

'上证50':'sz50','中小板指':'zxb','创业板':'cyb'}

stock_index=pd.DataFrame()

for stock in stocks.values():

stock_index[stock]=ts.get_k_data(stock,ktype='D',

autype='qfq', start='2005-01-01')['close']

#stock_index.head()

#计算这些股票指数每日涨跌幅

tech_rets = stock_index.pct_change()[1:]

#tech_rets.head()

#收益率描述性统计

tech_rets.describe()

#结果不在此报告

#均值其实都大于0

tech_rets.mean()*100 #转换为%

对上述股票指数之间的相关性进行可视化分析:

#jointplot这个函数可以画出两个指数的”相关性系数“,或者说皮尔森相关系数

sns.jointplot('sh','sz',data=tech_rets)

【Python量化】股票分析入门

#成对的比较不同数据集之间的相关性,

#而对角线则会显示该数据集的直方图

sns.pairplot(tech_rets.iloc[:,3:].dropna())

【Python量化】股票分析入门

returns_fig = sns.PairGrid(tech_rets.iloc[:,3:].dropna())

###右上角画散点图

returns_fig.map_upper(plt.scatter,color="purple")

###左下角画核密度图

returns_fig.map_lower(sns.kdeplot,cmap="cool_d")

###对角线的直方图

returns_fig.map_diag(plt.hist,bins=30)

【Python量化】股票分析入门

收益率与风险

使用均值和标准分别刻画股票(指数)的收益率和波动率,对比分析不同股票(指数)的收益-风险情况。

#构建一个计算股票收益率和标准差的函数

#默认起始时间为'2005-01-01'

def return_risk(stocks,startdate='2005-01-01'):

close=pd.DataFrame()

for stock in stocks.values():

close[stock]=ts.get_k_data(stock,ktype='D',

autype='qfq', start=startdate)['close']

tech_rets = close.pct_change()[1:]

rets = tech_rets.dropna()

ret_mean=rets.mean()*100

ret_std=rets.std()*100

return ret_mean,ret_std

#画图函数

def plot_return_risk():

ret,vol=return_risk(stocks)

color=np.array([ 0.18, 0.96, 0.75, 0.3, 0.9,0.5])

plt.scatter(ret, vol, marker = 'o',

c=color,s = 500,cmap=plt.get_cmap('Spectral'))

plt.xlabel("日收益率均值%")

plt.ylabel("标准差%")

for label,x,y in zip(stocks.keys(),ret,vol):

plt.annotate(label,xy = (x,y),xytext = (20,20),

textcoords = "offset points",

ha = "right",va = "bottom",

bbox = dict(boxstyle = 'round,pad=0.5',

fc = 'yellow', alpha = 0.5),

arrowprops = dict(arrowstyle = "->",

connectionstyle = "arc3,rad=0"))

stocks={'上证指数':'sh','深证指数':'sz','沪深300':'hs300',

'上证50':'sz50','中小板指数':'zxb','创业板指数':'cyb'}

plot_return_risk()

【Python量化】股票分析入门

stocks={'中国平安':'601318','格力电器':'000651',

'招商银行':'600036','恒生电子':'600570',

'中信证券':'600030','贵州茅台':'600519'}

startdate='2018-01-01'

plot_return_risk()

【Python量化】股票分析入门

蒙特卡洛模拟分析

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。