股票高开是指当日股票的开盘价高于昨日的收盘价,为什么会这样?莫不是机构背着咱们搞交易?
股票开盘价由集合竞价产生,我们知道股市开盘时间为9:30-11:30~13:00-15:00,但集合竞价时间在9:15-9:30,这意味着有一股神秘力量夜观天象,提前进行交易。
今天,咱们来做个小实验,统计一下,如果股票高开,该股票后市上涨的概率有多少。
1. 我们先下载了2022-2-7至2022-5-16的盘口数据,保存为csv文件,代码和文件如下。
import akshare as ak
import datetimedate = datetime.datetime.now().strftime("%Y%m%d")
stock_zh_a_spot_em_df = ak.stock_zh_a_spot_em()
stock_zh_a_spot_em_df.to_csv('E:\\股票盘口信息\\{}.csv'.format(date), encoding='utf_8_sig')
2. 由于csv文件每次储存的股票是乱序的,为了方便操作,我们需要把csv格式的数据转成json。
import os
import pandas as pd
import jsondef csv2json(csv_path, json_path):json_dict = {}csv_data = pd.read_csv(csv_path, encoding='utf_8_sig')for i in range(0, csv_data.shape[0]-1):json_dict['{:0>6d}'.format(csv_data.loc[i]['代码'])] = {'名称': csv_data.loc[i]['名称'],'最新价': csv_data.loc[i]['最新价'],'涨跌幅': csv_data.loc[i]['涨跌幅'],'涨跌额': csv_data.loc[i]['涨跌额'],'成交量': csv_data.loc[i]['成交量'],'成交额': csv_data.loc[i]['成交额'],'振幅': csv_data.loc[i]['振幅'],'最高': csv_data.loc[i]['最高'],'最低': csv_data.loc[i]['最低'],'今开': csv_data.loc[i]['今开'],'昨收': csv_data.loc[i]['昨收'],'量比': csv_data.loc[i]['量比'],'换手率': csv_data.loc[i]['换手率'],'市盈率-动态': csv_data.loc[i]['市盈率-动态'],'市净率': csv_data.loc[i]['市净率']}json_data = json.dumps(json_dict)f = open(json_path, 'w')f.write(json_data)f.close()file_list = os.listdir('E:\\股票盘口信息')
for file in file_list:code = file.split('.')[0]csv_path = 'E:\\股票盘口信息\\' + code + '.csv'json_path = 'E:\\股票盘口信息\\' + code + '.json'csv2json(csv_path, json_path)print(code)
(数据保存路径格式)
3. 我们加载这三个月的盘口数据,设定阈值为2%,即开盘价比昨日收盘价高2%就算高开。同时,以高开后五天为期限,设定4档概率,上涨5%以上,上涨0-5%,下跌0-5%,下跌5%以下,分别进行统计,代码如下。
import os
import json# bidding_list 所有时间段价格波动
# time_list 所有时间点
# td 阈值
def getTimes(bidding_list, time_list, td):list_len = len(bidding_list)res = []for i in range(list_len):if bidding_list[i] > td:res.append(time_list[i])return res# 根据日期,获取后五天股价涨幅
def after5(time, price_list, time_list):rises = 0count = 6for i in range(len(time_list)):if time_list[i] == time:count = 5if count <= 5:rises += price_list[i]count -= 1if count == 0:breakif count != 0:return -1return risesif __name__ == '__main__':dayu5 = 0dayu0 = 0xiaoyu0 = 0xiaoyu5 = 0# 获取所有时间段的数据all_data = {}date_list = os.listdir('E:\\股票盘口信息')for date in date_list:if date.find('csv') != -1:continuewith open('E:\\股票盘口信息\\' + date) as f:all_data[date] = json.load(f)# 遍历所有股票code_list = os.listdir('E:\\股票数据')for code in code_list:b_list = []t_list = []p_list = []date_list = os.listdir('E:\\股票盘口信息')for date in date_list:if date.find('csv') != -1:continuejson_data = all_data[date]if code in json_data:b_list.append((json_data[code]['今开']-json_data[code]['昨收'])/json_data[code]['昨收']*100)t_list.append(date)p_list.append(json_data[code]['涨跌幅'])times = getTimes(b_list, t_list, 2)for time in times:res = after5(time, p_list, t_list)if res == -1:continueif res > 5:dayu5 += 1elif res > 0:dayu0 += 1elif res > -5:xiaoyu0 += 1else:xiaoyu5 += 1total = dayu5+dayu0+xiaoyu0+xiaoyu5if total == 0:continueprint('股价涨5%:{}%,股价涨0%:{}%,股价跌0%:{}%,股价跌5%:{}%'.format(dayu5 / total * 100,dayu0 / total * 100,xiaoyu0 / total * 100,xiaoyu5 / total * 100))
(代码如有逻辑错误请尽快留言指出)
运行程序,我们得到了神奇的结果:
股价涨5%:38.07015011547344%
股价涨0%:22.10594688221709%
股价跌0%:20.30889145496536%
股价跌5%:19.51501154734411%
结果仿佛是在告诉我们:如果一个股票高开2%以上,咱们去追高,五天内有38%的概率再赚它5%以上,更有60%的概率不下跌。但是这个实验数据量太小,三个月的交易记录还说明不了本质问题。理论上来说,股票高开并不能决定后期走势,还得从其他层面来分析。
有兴趣的朋友可以下载近几年的数据来统计一下,下载历史数据的接口是 stock_zh_a_hist ,前一篇博客有用到《使用Python获取股票解禁数据并绘制股价曲线》,记得把统计结果留言,爱你哟~