美国三大股指11月10日全线大涨,均创逾两年最大单日涨幅。其中道琼斯工业指数(Dow Jones Industrial Average, DJI)上涨3.70%报33715.37点,纳斯达克(Nasdaq, IXIC)指数上涨7.35%报11114.15点,标普500指数(S&P 500, GSPC)上涨5.54%报3956.37点。国内股票指数11月11日也全部上涨。很多人都会关心,作为全球经济的风向标美股对国内股市影响几何,类似的分析文章很多,本文从另外角度,通过历史数据的统计对比下美国三大股指涨跌与下一日上证和深证股指涨跌的关系(本文为统计上的关联分析,并未做因果关系假定)。
从2001年1月1日到2022年11月11日的5502个交易中,美国三大股指日涨幅全部高于4%的日期共有23天,全部高于3%的共有56天,全部高于2%的共有154天,全部高于1%的共有575天;同时全部低于-1%的共有584天,全部低于-2%的共有178天,全部低于-3%的共有65天,全部低于-4%的共有28天。我们将上述日期全部提取,观察下一个交易日国内股指的开盘和收盘情况,我们发现三大股指的暴涨和暴跌对国内两股指开盘有非常明显的影响,其中三大股指前一日涨幅超过4%的日期中,上证和深证高开的概率均为76%,三大股指全部低于-4%的日期中,上证和深证股指低开的概率均为70%,对应三大股指前一日涨幅超过3%,跌幅超过-3%的日期中,国内两股指高开和低开的概率也均超过60%。美股指数的暴涨会影响国内股指的开盘情况,同时暴涨幅度越大,影响越明显。
但国内股指的收盘情况与开盘情况相反,涨跌情况受此影响很小。特别是深证指数,无论三大股指在前一日是暴涨还是暴跌,深证指数的价格变化率的上升概率均保持在50%左右(可以看出关联不大),上证在美股指全面下跌的情况下有较大概率(78%)下跌,美股全面暴涨日期中,上证股指次日收盘涨跌各半。
总结:国内股指早盘会受美股(暴涨暴跌)情绪影响,但是一般在当日收盘时会价格回归,前一交易日和美股的价格变化率与国内股指的价格变化率相关性很低。
上证深证指数变化率与前一日美国三大股票指数变化率相关系数
上证深证指数变化率与前一日美国三大股票指数变化率散点图
美国三大股指与下一交易日上证深证股指价格变动联动关系
附录:Python代码
导入模块,定义股指名称
import pandas as pdimport numpy as npimport mathimport pandas_datareader as web# ^GSPC, S&P500, As of 09:30PM CST. Market open.# ^IXIC NASDAQ, As of 09:30PM CST. Market open. # ^DJI, DJI, As of 09:30PM CST. Market open.# 000001.SS, SSE Composite Index, As of 11:19AM CST. Market open.# 399001.SZ, Shenzhen Index, As of 11:34AM CST. Market open.stock_list = [‘^GSPC’,’^IXIC’,’^DJI’,’000001.SS’,’399001.SZ’]
下载数据,同时进行整理
dataset = pd.DataFrame()for sp_name in stock_list: try: df =web.DataReader(name=sp_name,data_source=’yahoo’,start=’2001-01-01′,end=’2022-11-11′) df = pd.DataFrame(df) df = df.reset_index() # 把日期从行索引上升为列名称,用于后续计算 df[‘name’] =sp_name # 将股指名称作为列名称 df[‘delay_date’] = df[‘Date’].shift(1) #设置滞后日期,这样可以把美股前一天和A股直接比较 df[‘pre_adj_close’] = df[‘Adj Close’].shift(1) # 把前一天收盘价提取 df[‘return’] = df[‘Adj Close’]/df[‘pre_adj_close’]-1 # 用前一天收盘价和当日收盘价股指变化率 df[‘open_to_pre_close’]=df[‘Open’]>=df[‘Close’] # 如果当天开盘价高于前一天收盘价(高开)定义为“真”,否则“假” print(sp_name) dataset = dataset.append(df) except: pass continue
分别筛选出美股和A股股指
us_data = dataset[(dataset[‘name’]==’^GSPC’) | (dataset[‘name’]== ‘^IXIC’) | (dataset[‘name’]== ‘^DJI’)].reset_index()cn_data = dataset[(dataset[‘name’]==’399001.SZ’) | (dataset[‘name’]== ‘000001.SS’)].reset_index()
把美股指价格变化率提取出来,用于日期筛选,然后计算A股估值收益率
us_data_return = us_data.pivot(index = “Date”,columns =’name’ ,values = ‘return’).reset_index()# 计算A股股指收益率cn_data_return = cn_data.pivot(index = “Date”,columns =’name’ ,values = ‘return’).reset_index()# 这一步是关键,研究的问题是美股对A股的传递影响,所以要设定A股有一天滞后cn_data_return[‘delay_date’] = cn_data_return[‘Date’].shift(1) cn_data_return = cn_data_return.set_index(‘delay_date’)
把前一天的美股股指与当天的A股股指合并,然后绘制散点图
cn_us = pd.merge(cn_data_return,us_data_return.set_index(‘Date’),left_index=True,right_index=True,how=”inner”)import matplotlib.pyplot as pltplt.figure(figsize=(16,10))plt.subplot(231)plt.scatter(cn_us[‘000001.SS’],cn_us[‘^GSPC’],marker= ‘.’) plt.xlabel(‘S&P 500’)plt.ylabel(‘Shanghai Composite’)plt.subplot(232)plt.scatter(cn_us[‘000001.SS’],cn_us[‘^IXIC’],marker= ‘.’) plt.xlabel(‘Nasdaq’)#plt.ylabel(‘Shanghai Composite’)plt.subplot(233)plt.scatter(cn_us[‘000001.SS’],cn_us[‘^DJI’],marker= ‘.’) plt.xlabel(‘Dow Jones’)#plt.ylabel(‘Shanghai Composite’)plt.subplot(234)plt.scatter(cn_us[‘399001.SZ’],cn_us[‘^GSPC’],marker= ‘.’) plt.xlabel(‘S&P 500’)plt.ylabel(‘Shenzhen Composite’)plt.subplot(235)plt.scatter(cn_us[‘399001.SZ’],cn_us[‘^IXIC’],marker= ‘.’) plt.xlabel(‘Nasdaq’)#plt.ylabel(‘Shenzhen Composite’)plt.subplot(236)plt.scatter(cn_us[‘399001.SZ’],cn_us[‘^DJI’],marker= ‘.’) plt.xlabel(‘Dow Jones’)#plt.ylabel(‘Shenzhen Composite’)
计算相关系数
cn_us.corr()
把三个股指同时高于1%,2%,3%,4%的以及同时低于-1%,-2%,-3%,-4%的日期提取出来
date_list = []percent_list = [0.04,0.03,0.02,0.01,-0.01,-0.02,-0.03,-0.04]for percent in percent_list[0:4]: df = us_data_return[(us_data_return[‘^GSPC’]>=percent) & (us_data_return[‘^IXIC’]>=percent) & (us_data_return[‘^DJI’]>=percent)][‘Date’] date_list.append(pd.DataFrame(df).set_index(‘Date’))for percent in percent_list[4:8]: df = us_data_return[(us_data_return[‘^GSPC’]分析国内股市开盘情况
cn_data_open = cn_data.pivot(index = “Date”,columns =’name’ ,values = ‘open_to_pre_close’).reset_index()cn_data_open[‘delay_date’] = cn_data_open[‘Date’].shift(1) cn_data_open = cn_data_open.set_index(‘delay_date’)data_summary = pd.DataFrame()for date in date_list: cn_open = pd.merge(cn_data_open,date,left_index=True,right_index=True,how=”inner”)[[‘000001.SS’,’399001.SZ’]] data_summary = data_summary.append(cn_open.sum(axis=0)/cn_open.count(axis=0),ignore_index = True)data_summary[‘percent’] = percent_listdata_summary = data_summary.set_index(‘percent’)data_summary
分析国内股市收盘情况,计算A股股指收盘价的涨跌
cn_data_return = cn_data.pivot(index = “Date”,columns =’name’ ,values = ‘return’).reset_index()cn_data_return[‘delay_date’] = cn_data_return[‘Date’].shift(1) cn_data_return = cn_data_return.set_index(‘delay_date’)cn_data_return[‘SS_up’] = cn_data_return[‘000001.SS’]>=0cn_data_return[‘SS_1_percent_up’] = cn_data_return[‘000001.SS’]>=0.01cn_data_return[‘SS_2_percent_up’] = cn_data_return[‘000001.SS’]>=0.02cn_data_return[‘SS_1_percent_down’] = cn_data_return[‘000001.SS’]=0.01cn_data_return[‘SZ_2_percent_up’] = cn_data_return[‘399001.SZ’]>=0.02cn_data_return[‘SZ_1_percent_down’] = cn_data_return[‘399001.SZ’]将A股分析指标与美股涨跌日期合并,生成收盘价格变化统计数据
return_summary = pd.DataFrame()for date in date_list: cn_return = pd.merge(cn_data_return,date,left_index=True,right_index=True,how=”inner”) return_summary = return_summary.append(cn_return.sum(axis=0)/cn_return.count(axis=0),ignore_index=True)return_summary[‘percent’] = percent_listreturn_summary = return_summary.set_index(‘percent’)return_summary