通达信为什么上海股票缺少日线的历史数据?

许多A股交易者为了探究A股及其板块和个股的历史走势形态,都需要可靠的A股历史行情数据,一般都从网上找一些免费数据源下载,但是这类下载数据可能有滞后,甚至有些数据是否真实可靠不得而知......

通达信为什么上海股票缺少日线的历史数据

前复权: 打开通达信,点开任意一只股票,按"F5",调到K线图。按鼠标反键。找到"复权处理",勾点"前复权"。 二、下载盘后数据: 点通达信右上角设置,先勾点“日线自动写盘”,再点......接下来具体说说

C++读取通达信个股历史数据

通达信历史数据存储在安装根目录下的vipdoc文件夹下,如D:\new_tdx\vipdoc\sh\lday,为沪市数据,深市数据为:D:\new_tdx\vipdoc\sz\lday,依各自通达信安装目录不同有差异。文件名为:"sh"或"sz"+代码+.day。数据格式如下结构,占32个字节:

struct stockData

{

unsigned int date;

int open;

int high;

int low;

int close;

float amo;

int vol;

int other;

};

八个数据分别为日期、开盘价、*高价、最低价、收盘价、成交金额、成交量、备用;数据是*100后的整数。为连续数据,

打开VS2019,新建一个 TdxHistoryData 的C++控制台空项目

新建空项目

双击打开 TdxHistoryData.cpp 源文件,添加修改如以下:

// TdxHistoryData.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include <Windows.h>

#include <iostream>

#include <fstream>

#include <string>

#include <vector>

using namespace std;

struct stockData

{

unsigned int date;

int open;

int high;

int low;

int close;

float amo;

int vol;

int other;

};

void getHistoryData(string filePath, vector<stockData>& Data_Vec)

{

Data_Vec.clear();

fstream ifs(filePath, ios::in | ios::binary);

if (!ifs.is_open())

{

MessageBox(NULL, TEXT("无法打开文件!"), NULL, MB_ICONINFORMATION | MB_YESNO);

return;

}

stockData stkData;

while (!ifs.eof())

{

ifs.read((char*)&stkData, sizeof(stockData));

Data_Vec.push_back(stkData);

}

if (Data_Vec[Data_Vec.size() - 1].date == Data_Vec[Data_Vec.size() - 2].date)

Data_Vec.pop_back();

ifs.close();

}

int main()

{

string filePath = "D:\\new_tdx\\vipdoc\\sh\\lday\\sh688981.day";

vector<stockData> vecData;

getHistoryData(filePath, vecData);

cout << "数据路径:" << filePath << endl;

cout << "----------------------------------------------------" << endl;

cout << "日期\t\t开盘价\t收盘价\t*高价\t最低价\t成交量\t金额"<<endl;

for (int i = 0; i < vecData.size(); i++)

{

cout << vecData[i].date << "\t" << (float)vecData[i].open / 100 << "\t" << (float)vecData[i].close / 100 << "\t" << (float)vecData[i].high / 100

<< "\t" << (float)vecData[i].low / 100 << "\t" << vecData[i].vol / 100 << "\t" << vecData[i].amo / 100000000 << "亿" << endl;

}

cout << "共计:" << vecData.size()<<"天数据";

}

整理好以上源文件,菜单调试---开始执行(不调试),直接编译运行,显示结果如下:

读取数据结果

读取数据每次读32字节,连续读完即可。中间有一个疑问,全部读完存入vector后,最后两个数据是重复的,不知什么原因,只好加一个判断,如重复则弹出一个。

注:需要每天下载通达信数据,否则读到数据不完整 或没有。

Python - 快速处理通达信下载的A股历史行情数据(完整代码)

许多A股交易者为了探究A股及其板块和个股的历史走势形态,都需要可靠的A股历史行情数据,一般都从网上找一些免费数据源下载,但是这类下载数据可能有滞后,甚至有些数据是否真实可靠不得而知。

为了克服这些问题,可以使用证券公司提供的客户端程序(有通达信版、同花顺版等)下载历史行情数据,每个交易日收盘15分钟后,即可下载。下载后的数据的格式和长度不一定满足自己的要求,可以用本文提供的python代码,本文也提供了整个操作过程的视频演示。

本文提供的历史行情数据处理的python代码文件,其中使用了多进程工具包 multiprocessing,以便充分发挥多核多线程CPU的能力,提高数据处理的速度。沪深两个交易所现在总共有将近5000只股票,把所有的日线、5分钟线和1分钟线数据都处理一遍,如果用双核CPU电脑,可能需要一个小时。处理数据所耗时间和python代码是否采用多进程多线程方法和CPU的核数都有关系。笔者处理数据使用的电脑是两颗 Intel(R) Xeon(R) CPU E5-2660 v2 @ 2.20GHz 2.20 GHz 处理器,共2*20核,全部数据处理一次只需要 124 秒。

本文提供的python程序,包括三个自定义函数:

  • def preprocess_historymd(path_filename_mdrows),先对下载后的历史行情数据进行预处理,删除行情数据文件的表头和末尾行。未做处理前的行情数据为csv格式,如下图:
  • def multiprocess_filteringquotes(quote_watchingsymbol_list),构建多进程池
  • def filtering_quotes(onequote_watchingsymbollist), 处理单个的行情数据文件

完整代码如下:

'''按指定行数截取行情数据''' import os import csv from multiprocessing import Pool from datetime import datetime, timedelta import time def filtering_quotes (onequote_watchingsymbollist) : new_quote_itm = onequote_watchingsymbollist[ 0 ] watching_marketsymbol_lst = onequote_watchingsymbollist[ 1 ] filterquote = '' if new_quote_itm[ 9 : 21 ] in watching_marketsymbol_lst: quote_line = new_quote_itm.split( '-' ) normal_dt = str(datetime.combine(datetime.today(),datetime.strptime(quote_line[ 0 ][ 2 :], '%H%M%S' ).time())) filterquote = [normal_dt,quote_line[ 1 ],quote_line[ 2 ],quote_line[ 3 ],quote_line[ 4 ]] else : filterquote = '' return filterquote def multiprocess_filteringquotes (quote_watchingsymbol_list) : pool = Pool() quote_data = pool.map(filtering_quotes,quote_watchingsymbol_list) pool.close() pool.join() return quote_data def preprocess_historymd (path_filename_mdrows) : path_filename = path_filename_mdrows[ 0 ] total_mdrows = path_filename_mdrows[ 1 ] cut_lastrows = path_filename_mdrows[ 2 ] with open(path_filename, 'r' ) as csv_file: #watched_stocks.csv, watch_list.csv csv_reader = csv.reader(csv_file) csv2list = [itm for itm in csv_reader] csv2list.pop( 0 ) csv2list.pop( 0 ) csv2list.pop( -1 ) if total_mdrows < len(csv2list): csv2list_cut = csv2list[len(csv2list)-(total_mdrows+abs(cut_lastrows)):(len(csv2list)+cut_lastrows)] else : csv2list_cut = csv2list[ 0 :(len(csv2list)+cut_lastrows)] csv2list_new = [] for itm in csv2list_cut: if len(itm) == 7 : csv2list_new.append([path_filename[ -10 : -4 ], itm[ 0 ].replace( '/' , '-' ),itm[ 1 ],itm[ 2 ],itm[ 3 ],itm[ 4 ],itm[ 5 ],itm[ 6 ]]) if len(itm) == 8 : csv2list_new.append([path_filename[ -10 : -4 ], itm[ 0 ].replace( '/' , '-' )+ " " +itm[ 1 ][ 0 : 2 ]+ ":" +itm[ 1 ][ 2 : 4 ], itm[ 2 ],itm[ 3 ],itm[ 4 ],itm[ 5 ],itm[ 6 ],itm[ 7 ]]) # with open(path_filename,'w') as f: #仅用于测试观察数据 # for i in range(0,len(csv2list_new)): # x = str(csv2list_new[i]).replace("'","").replace("[","").replace("]","")+'\n' # # x = csv2list_new[i] # f.write(x) print( f"行情文件 {path_filename} 处理完成, 共 { len(csv2list_new)} 行:" ) def multiprocess_historymd (historymd_filename_list) : pool = Pool() historymd_data = pool.map(preprocess_historymd,historymd_filename_list) pool.close() pool.join() return historymd_data if __name__ == "__main__" : T_start = time.perf_counter() given_dailymd_path = 'D:\\SecurityData\\MD_daily' given_min1md_path = 'D:\\SecurityData\\MD_1min' # given_dailymd_path = 'D:\\SecurityData\\test_dailyMD' # given_min1md_path = 'D:\\SecurityData\\test_min1MD' # 选取指定时间段的历史行情,如倒数3个交易日之前的1000个交易日, # 选取指定时间段的1分钟历史行情,如倒数3个交易日之前的80个交易日,注意倒数几个交易日必须与日线相同 total_days = 1000 #选取 80 个交易日的1分钟数据 total_mindays = 80 #如果截止到当前最后一个交易日,则倒数0个交易日; 如果截止到倒数第3个交易日的数据,downcount_days = -3 downcounter_days = 0 ''' 处理通达信历史行情数据文件 - 日线行情 ''' dailyfilename_list = os.listdir(given_dailymd_path) daily_filename = str(dailyfilename_list) dailyfilename_split = daily_filename.split( ',' ) dailymdfiles_list = [given_dailymd_path + '\\' + itm[ 2 : 15 ] for itm in dailyfilename_split] dailymdrows_total = [total_days]*len(dailymdfiles_list) if downcounter_days < 0 : # 截止到倒数0个交易日的日线 dailymdrows_end = [downcounter_days]*len(dailymdfiles_list) if downcounter_days == 0 : # 截止到最后一个交易日,不用倒数 dailymdrows_end = [ 0 ]*len(dailymdfiles_list) daily_result = multiprocess_historymd(zip(dailymdfiles_list,dailymdrows_total,dailymdrows_end)) ''' 处理通达信历史行情数据文件 - 1分钟行情 ''' min1filename_list = os.listdir(given_min1md_path) min1_filename = str(min1filename_list) min1filename_split = min1_filename.split( ',' ) min1mdfiles_list = [given_min1md_path + '\\' + itm[ 2 : 15 ] for itm in min1filename_split] min1mdrows_total = [ 240 *total_mindays]*len(min1mdfiles_list) if downcounter_days < 0 : # 截止到倒数3个交易日的1分钟线 min1mdrows_end = [downcounter_days* 240 ]*len(min1mdfiles_list) if downcounter_days == 0 : # 截止到最后一个交易日,不用倒数 min1mdrows_end = [ 0 ]*len(min1mdfiles_list) min1_result = multiprocess_historymd(zip(min1mdfiles_list,min1mdrows_total,min1mdrows_end)) T1_end = time.perf_counter() print( f'\n耗时 {round(T1_end-T_start, 2 )} 秒\n' )

处理后的历史行情数据格式如下图所示:

整个操作过程的视频演示, ,看西瓜视频。

注意:获取几年的日线数据或分钟数据,与所在电脑上安装和使用通达信客户端程序的时间长短有关,初次安装后,默认可下载3年的日线数据,4个月的1分钟数据。数据导出时可选择下载不复权、前复权或后复权数据。

实战选股基本要领(以通达信软件为例)

一、前复权:

打开通达信,点开任意一只股票,按"F5",调到K线图。按鼠标反键。找到"复权处理",勾点"前复权"。

二、下载盘后数据:

点通达信右上角设置,先勾点“日线自动写盘”,再点击“盘后数据下载"。

勾点"日线和实时行情数据",把起始时间调到1990年1月1日,把结束时间调到当日。

点击右边“添加品种”,点击"全部A股",点击"全选",点击"确定",点击“开始下载”。

三、导入选股指标。

点击右边设置左一图标,点“公式管理器”。点“导入公式”。

点“粉丝涨停”指标,点“打开”。

输入密码,点"确定”。

勾选“条件选股公式”和“即时盘中”,点“确定”。

三、即时行情选股:

点击右边设置左一图标,点击“自动选股设置”。点击“添加方案”。

点击“条件选股公式”右边的向下箭头,向下找到“粉丝涨停”。

点击“粉丝涨停”到“条件选股公式”框,选股范围设“全部A股”,选股周期设“日线”,选股入板块,点击“选择板块”。

点“新建板块”,输入“粉丝涨停”,点“确定”。

连续跟进点二次“确定”,让“粉丝涨停”指标进入“自动选股设置”对话框。

点击右边“一键选股”,就"OK”啦。

以上就是通达信为什么上海股票缺少日线的历史数据?的详细内容,希望通过阅读小编的文章之后能够有所收获!

版权:本文由用户自行上传,观点仅代表作者本人,本站仅供存储服务。如有侵权,请联系管理员删除,了解详情>>

发布
问题