许多a股交易者需要可靠的a股历史市场数据,以探索a股、其行业和个股的历史趋势。通常,他们从互联网上找到一些免费的数据源进行下载,但这样下载的数据可能会滞后,甚至不知道某些数据是否真实可靠。
为了克服这些问题,我们可以使用证券公司提供的客户端程序(包括通信版和同花顺版)下载历史市场数据,这些数据可以在每个交易日收盘后15分钟下载。下载数据的格式和长度可能不符合您自己的要求。您可以使用本文提供的python代码,并且本文还提供了整个操作过程的视频演示。
本文提供的用于历史行情数据处理的python代码文件使用了multi-process toolkit多重处理技术,以充分发挥多核多线程CPU的能力,提高数据处理速度。沪深两市共有近5000只股票。如果使用双核CPU计算机,处理所有每日、5分钟和1分钟数据可能需要一个小时。处理数据所花费的时间与python代码是否采用多进程多线程方法以及CPU内核的数量有关。作者用于处理数据的计算机是两颗英特尔至强CPU E5-2660V2 @ 2.20GHz 2.20GHz处理器,共有2*20个内核。一次性处理所有数据只需要124秒。
本文提供的python程序包括三个自定义函数:
def preprocess_historymd(path_filename_mdrows),先对下载后的历史行情数据进行预处理,删除行情数据文件的表头和末尾行。未做处理前的行情数据为csv格式,如下图:
def multiprocess_filteringquotes(quote_watchingsymbol_list),构建多进程池def filtering_quotes(onequote_watchingsymbollist), 处理单个的行情数据文件
完整的代码如下:
'''根据指定的行数截取市场数据& # 39;''import OSI import CSV from multi processing import pool from datetime import datetime,time delta import timedef filtering _ quotes(onequote _ watchingsymbollist):new _ quote _ ITM = onequote _ watchingsymbollist【0】watching _ market symbol _ lst = onequote _ watchingsymbollist【1】filter quote = & # 39;'if new _ quote _ ITM【9:21】in watching _ market symbol _ lst:quote _ line = new _ quote _ ITM . split(& # 39;-')normal _ dt = str(datetime . combine(datetime . today(),datetime . strptime(quote _ line【0】【2:】,& # 39;% H % M % S & # 39).time()))filter quote =【normal _ dt,quote _ line【1】,quote _ line【2】,quote _ line【3】,quote _ line【4】】else:filter quote = & # 39;'return filterquotedef multi process _ filtering quotes(quote _ watching symbol _ list):Pool = Pool()quote _ data = Pool . map(filtering _ quotes,quote _ watching symbol _ list)Pool . close()Pool . join()return quote _ datadef preprocess _ historymd(path _ filename _ mdrows):path _ filename _ MDr & # 39)作为csv_file: #watched_stocks.csv,watch _ list . CSV CSV _ reader = CSV . reader(CSV _ file)CSV 2 list =【ITM for ITM in CSV _ reader】CSV 2 list . pop(0)CSV 2 list . pop(0)CSV 2 list . pop(0)(-1)if total _ mdrows & lt;len(CSV 2 list):CSV 2 list _ cut = CSV 2 list【len(CSV 2 list)-(total _ mdrows+ABS(cut _ lastrows)】:(len(CSV 2 list)+cut _ lastrows)else:CSV 2 list _ cut = CSV 2 list【0:(CSV 2 list)+cut _ lastrows】CSV 2 list _ new =【】for ITM in CSV 2 list _ cut替换(& # 39;/','-'),ITM【1】,ITM【2】,ITM【3】,ITM【4】,ITM【5】,ITM【6】】)if len(ITM)= = 8:CSV 2 list _ new . append(【路径_文件名【-10:-4】,ITM【0】)。替换(& # 39;/','-')+""+ITM【1】【0:2】+& # 34;:"+ITM【1】【2:4】,ITM【2】,ITM【3】,ITM【4】,ITM【5】,ITM【6】,ITM【7】】)# with open(path _ filename,& # 39;w & # 39)as f: #仅用于测试的观察数据# for I in range(0,len(cs v2 list _ new)):# x = str(cs v2 list _ new【I】)。替换(& # 34;'","").替换(& # 34;[","").替换(& # 34;]","")+'\\ n & # 39# # x = cs v2 list _ new【I】# f . write(x)print(f & # 34;报价文件{path_filename}已被处理,共有{ len(cs v2 list _ new)}行:& # 34;)def multi process _ history MD(history MD _ filename _ list):Pool = Pool()history MD _ data = Pool . map(preprocess _ history MD,history MD _ filename _ list)Pool . close()Pool . join()返回history MD _ data if _ _ name _ _ = = = & # 34;_ _ main _ _ & # 34:T _ start = time . perf _ counter()given _ daily MD _ path = & # 39;d:\\ \\ security data \\ \\ MD _ daily & # 39;given _ min1md _ path = & # 39d:\\ \\ security data \\ \\ MD _ 1min & # 39;# given _ dailymd _ path = & # 39d:\\ \\ security data \\ \\ test _ daily MD & # 39;# given _ min1md _ path = & # 39d:\\ \\ security data \\ \\ test _ min1MD & # 39;#选择指定时间段内的历史行情,例如最近三个交易日之前的1000个交易日,#选择指定时间段内的一分钟内的历史行情,例如最近三个交易日之前的80个交易日,注意最后几个交易日必须与日线相同。#选择80个交易日的1分钟数据,如total_mindays = 80 #,如果截至当前最后一个交易日,则倒计时0个交易日;如果数据截至倒数第三个交易日,down count _ days =-3 down counter _ days = 0 & # 39;''处理通达信历史市场数据文件-每日市场& # 39;''daily filename _ list = OS . listdir(given _ daily MD _ path)daily _ filename = str(daily filename _ list)daily filename _ split = daily _ filename . split(& # 39;,')dailymdfiles _ list =【given _ dailymd _ path+& # 39;\\'+ITM【2:15】for ITM in daily filename _ split】daily drows _ total =【total _ days】* len(daily mdfiles _ list)if down counter _ days & lt;0:# Daily dailymdrews _ end =【down counter _ days】* len(dailymdfiles _ list)如果downcounter _ days = = 0: #到最后一个交易日,则无需倒计时dailymdrows _ end =【0】* len(dailymdrfiles _ list)Daily _ result = multi process _ history MD(zip(dailymdrows _ list,dailymdrrows _ total,dailymdrows _ end)& # 39;''处理通达信历史行情数据文件-1分钟行情& # 39;''min 1 filename _ list = OS . listdir(given _ min1md _ path)min 1 _ filename = str(min 1 filename _ list)min 1 filename _ split = min 1 _ filename . split(& # 39;,')min1mdfiles _ list =【given _ min1md _ path+& # 39;\\'+ITM【2:15】for ITM in min 1 filename _ split】min 1 drows _ total =【240 * total _ min days】* len(min 1 mdfiles _ list)if down counter _ days & lt;0: # 1分钟线min 1 MDR rows _ end =【down counter _ days * 240】* len(min 1 mdfiles _ list)if down counter _ days = = 0:#截至最后一个交易日,min 1 MDR rows _ end =【0】* len(min 1 MDR files _ list)min 1 _ result = multi process _ history MD(zip(min 1 MDR rows _ list,min1mdrrows _ total,min 1 MDR rows _ end)65\\n这需要{ round(T1 _ end-T _ start,2)}秒\\ n & # 39)处理后的历史市场数据格式如下图所示:
全程操作过程视频演示,点击这里观看西瓜视频。
注意:获得多少年的每日数据或分钟数据与在计算机上安装和使用通信客户端程序的时间长度有关。初始安装后,您可以默认下载3年的每日数据和4个月的1分钟数据。导出数据时,您可以选择无权限、权限前或权限后下载数据。
(本文结束)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。