今天,我想和大家分享一下一些分析股票的方法。在这里以贴代码为主,大家感兴趣的话直接复制运行就可以生成相应的图表分析了。
分析股票示例(以 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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.