『python 金融应用』如何用 seaborn 包来分析股票

2016-12-29 15:54:20 +08:00
 LittleUqeer

今天,我想和大家分享一下一些分析股票的方法。在这里以贴代码为主,大家感兴趣的话直接复制运行就可以生成相应的图表分析了。

一、股票的基本信息

分析股票示例(以 600050.XSHG 中国联通 为例),导入股票各项信息

data = DataAPI.MktEqudGet(secID=u"",ticker=u"600050",beginDate=u"",endDate=u"",isOpen="",field=u"secID,secShortName,tradeDate,openPrice,highestPrice,lowestPrice,closePrice,turnoverVol",pandas="1")
data_hou = DataAPI.MktEqudAdjAfGet(secID=u"",ticker=u"600050",tradeDate=u"",isOpen="",beginDate=u"",endDate=u"",field=u"secID,tradeDate,closePrice",pandas="1")
data_hou = data_hou.rename(columns = {'closePrice':'Adj_closePrice'})
data_new = pd.merge(data,data_hou,on='tradeDate')
data_new = data_new.set_index('tradeDate')
data_new1 = data_new.copy()
data_new1.head().append(data_new1.tail())

简单统计分析,输入下方代码即可显示出股票的开盘价,最高价,最低价,收盘价,成交量,前复权收盘价。

data_new1.describe()

股票收盘价走势

data_new1['Adj_closePrice'].plot(legend=True,figsize=(14,6))

成交量走势

data_new1['turnoverVol'].plot(legend=True,figsize=(14,6))

移动平均线走势图

ma_day = [10,20,50]

for ma in ma_day:
    column_name = "MA for %s days" %(str(ma))
    data_new1[column_name]=pd.rolling_mean(data_new1['Adj_closePrice'],ma)

data_new1[['Adj_closePrice','MA for 10 days','MA for 20 days','MA for 50 days']].plot(subplots=False,figsize=(14,6))

股票每天的百分比变化

data_new1['Daily Return'] = data_new1['Adj_closePrice'].pct_change()
data_new1['Daily Return'].plot(figsize=(14,6),legend=True,linestyle='--',marker='o')

平均收益直方图

data_new1['Daily Return'].hist(color="#4878cf")

每日收益图

sns.distplot(data_new1['Daily Return'].dropna(),bins=100, color="b")

分析多支股票示例(以 600050.XSHG , 000651.XSHG , 600158.XSHG,600115.XSHG 为例)

将每个公司的每日收盘价的百分数变化,及涨幅或者降幅,可以评估其涨幅前景

tech_rets = data_all2.pct_change()
tech_rets.head()

然后看某一支股票自身的线性相关系

sns.jointplot('000930','000930',tech_rets,kind='scatter',color='seagreen')

不同股票的线性相关系

sns.jointplot('000930','600115',tech_rets,kind='scatter')

四个公司一起比较,该函数用于成对的比较不同数据集之间的相关性,而对角线则会显示该数据集的直方图

sns.pairplot(tech_rets.dropna())

对角线直方图

returns_fig = sns.PairGrid(tech_rets.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)

原股票数据的分析

returns_fig = sns.PairGrid(data_all2)
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)

四支股票相关系数

sns.corrplot(tech_rets.dropna(),annot=True)

二、股票的风险信息

推测最多亏多少钱

rets = tech_rets.dropna()
area = np.pi*20
plt.scatter(rets.mean(), rets.std(),alpha = 0.5,s =area)
plt.xlabel('Expected returns')
plt.ylabel('Risk')

#分别以 rets 的平均值,标准差为 xy 轴
for label, x, y in zip(rets.columns, rets.mean(), rets.std()):
    plt.annotate(
        label, 
        xy = (x, y), xytext = (50, 50),
        textcoords = 'offset points', ha = 'right', va = 'bottom',
        arrowprops = dict(arrowstyle = '-', connectionstyle = 'arc3,rad=-0.3'))

运行一下可以看到图表中 600158.中体产业 的预计收益要高于其他三家公司,但是风险值也要高于其他三家公司。

分析之前看一下基本信息,以 600050.XSHG 为例

sns.distplot(data_new1['Daily Return'].dropna(),bins=100, color="b")

百位分数, 95%的置信

rets['600050'].quantile(0.05)

一天的损失不会超过 0.0356, 如果我们有一百万的投资,我们一天 5% VaR 为 0.0356 * 1000000 = 35600 元

三、基于风险价值的蒙特卡洛方法

days = 365
dt = 1./days
mu = rets.mean()['600050']
sigma = rets.std()['600050']

def stock_monte_carlo(start_price,days,mu,sigma):
    price = np.zeros(days)
    price[0] = start_price
    shock = np.zeros(days)
    drift = np.zeros(days)
    
    for x in xrange(1,days):
        shock[x] = np.random.normal(loc=mu * dt, scale=sigma * np.sqrt(dt))
        drift[x] = mu * dt
        price[x] = price[x-1] + (price[x-1] * (drift[x] + shock[x]))
    return price

start_price = 2.924

for run in xrange(100):
    plt.plot(stock_monte_carlo(start_price,days,mu,sigma))
plt.xlabel("Days")
plt.ylabel("Price")

runs = 10000
simulations = np.zeros(runs)
np.set_printoptions(threshold=5)
for run in xrange(runs):    
    simulations[run] = stock_monte_carlo(start_price,days,mu,sigma)[days-1];

q = np.percentile(simulations, 1)
plt.hist(simulations,bins=200)
plt.figtext(0.6, 0.8, s="Start price: %.2f" %start_price)
plt.figtext(0.6, 0.7, "Mean final price: %.2f" % simulations.mean())
plt.figtext(0.6, 0.6, "VaR(0.99): %.2f" % (start_price - q,))
plt.figtext(0.15, 0.6, "q(0.99): %.2f" % q)
plt.axvline(x=q, linewidth=4, color='r')
plt.title(u"Final price distribution for 600050 after %s days" % days, weight='bold')

这种方法基本上是你购买的股票的风险将在 0.16 元 (约 99% 的时间里,蒙特卡洛模拟的结果) 如果想自己画股票的 K 线图,可以参考这篇帖子: https://uqer.io/community/share/57cac259228e5b5b831173c2

2675 次点击
所在节点    Python
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/331028

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX