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