股票高开是指当日股票的开盘价高于昨日的收盘价,为什么会这样?莫不是机构背着咱们搞交易?
股票开盘价由集合竞价产生,我们知道股市开盘时间为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 datetime date = 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 json def 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 = 0 count = 6 for i in range(len(time_list)): if time_list[i] == time: count = 5 if count <= 5: rises += price_list[i] count -= 1 if count == 0: break if count != 0: return -1 return rises if __name__ == '__main__': dayu5 = 0 dayu0 = 0 xiaoyu0 = 0 xiaoyu5 = 0 # 获取所有时间段的数据 all_data = {} date_list = os.listdir('E:\股票盘口信息') for date in date_list: if date.find('csv') != -1: continue with 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: continue json_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: continue if res > 5: dayu5 += 1 elif res > 0: dayu0 += 1 elif res > -5: xiaoyu0 += 1 else: xiaoyu5 += 1 total = dayu5+dayu0+xiaoyu0+xiaoyu5 if total == 0: continue print('股价涨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获取股票解禁数据并绘制股价曲线》,记得把统计结果留言,爱你哟~