通达信和量化软件都提供了丰富的交叉查询方案,用起来很方便,但很多时候,个人对数据需求其实是有差异的,可以说千人千面,要独立定制数据,就需要对个股数据进行二次加工和清洗。
通常情况下,将个股数据直接导入EXCEL是一种又快又稳的方法,可以通过排序,筛选,分类求和,数据透视及自编公式等方法对数据进行提炼,最后精简成数据分析表或者走势图。但EXCEL有个计算短板,一是通达信不提供全量的Excel个股数据,再且就是用Excel直接处理大数据的话,容易卡。如果想真正对数据进行底层加工,最好准备一个轻量级的数据清洗工具。
这里以通达信+PHP组合为例进行个股的数据清洗,其它如退市股,指数等数据操作起来类似。
首要是获取原始的全量历史日线数据,原始文件一般是.day/.dat 二进制文件和txt文件。
一、盘后工具直接下载数据
Windows电脑上打开通达信客户端(建议使用官方金融终端或券商标准版),软件顶部菜单栏依次点击:工具 -盘后数据下载。
时间范围修改为 19900101(1990年1月1日),结束日期设为今天,数据类型勾选 “日线数据“,然后点击 “开始下载”。
通达信默认只保留近期几年的数据,一般是1200根K线数据。这种方式下载的是全量的.day/.dat 二进制文件,导出是当时H/L/O/C实时价格和成交量。
二、本地一键导出方法工具
通达信还提供了一键导出全量txt方法。在行情观察状态下,选择选项/数据导出就就可以了。
如果想直接导出EXCEL数据,只能所见即所得,导出屏幕中你看得见的数据,股价是实时价格。
如果想导出全量从1990年1月1日到现在所有个股的日线数据,在右上角选择”高级导出"就可以了,例如导出为txt文件。这种方法可以自定义导出日K数据为前复权,后复权或不复权,灵活性很大。
三、数据清洗
1.txt日线数据文件的处理
如果原始日线文件是txt文件,可以将TXT文本复制到EXCEL,利用“打断”工具,通过txt中的逗号或分号为界,分散成H/L/O/C和VOLUME在EXCEL进行有序排列。
如果处理的个股数量少的话,比如自己就关注那几支票,这种方法是最好的,用起来非常方便。不过,有点可恶的是,某些办公软件连这种“打断”工具现在也要付费才能用,想白漂的话,你只用和谐版软件了。
当然,你不嫌麻烦,也可以用PHP工具来处理。
2..day/.dat 二进制日线数据文件的处理
如果处理的个股数量大的话,最好在本地电脑或网络服务器兴建一个专门工具来处理。那速度才叫呼呼呼,而且不用看别人脸色,不需要扫二维码,也不需要付费。
这里示例用PHP+PhpSpreadsheet工具来处理。
PHP本地环境搭建就不说了,象Phpstudy等都提供了一键适配windows方法,仔细读一下官方教程,按提示一步一步地跟着做,基本上都没问题。
PhpSpreadsheet工具的安装和使用
Linux服务器或者宝塔面板环境上安装和运行PhpSpreadsheet,直接键名命令就可以了:
composer require phpoffice/phpspreadsheet
PhpSpreadsheet是官方的php和excel文件转换工具,开源且免费。
这里的Composer方法是服务器后台从GitHub上拉取PhpSpreadsheet源码包。
PHP中安装和应用PhpSpreadsheet工具时需要将fileinfo、zip、putenv、proc_open、proc_get_status,、set_time_limit和 ini_set等扩展在PHP中事先开启,PhpSpreadsheet用于在底层认别解压和输出 .xlsx文件,安装PhpSpreadsheet工具时会有自动提示。
PhpSpreadsheet工具安装好后,基本上就松了一口气,可以喝喝茶打打游戏了,剩下的事就简单多了。这就是痛苦一小时,幸福万万年。
PhpSpreadsheet将txt文本读入并写成excel的写法多种多样,一般都可以满足需要。
例如,创建一个toxls.php文件用来执行文件类型转换。
// 1.引入你刚刚通过 Composer 安装的 PhpSpreadsheet 核心组件require 'vendor/autoload.php';use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;// 2.设置你的通达信二进制文件绝对路径$filePath = __DIR__ . "/sh000001.day"; if(!file_exists($filePath)) { die("错误:在服务器上未找到该文件,请检查路径和大小写!");}$handle = fopen($filePath, "rb");$stockData = [];// 3.循环解析二进制文件while(!feof($handle)) { $block = fread($handle, 32); if(strlen($block) < 32) break; //使用 V 和 f 进行二进制解包 $data = unpack("Vdate/Vopen/Vhigh/Vlow/Vclose/famount/Vvol/Vreserve", $block); //压入总数组 $stockData[] = [ 'date' => $data['date'], 'open' => $data['open'] / 100, // 还原真实价格 'high' => $data['high'] / 100, 'low' => $data['low'] / 100, 'close' => $data['close'] / 100, 'vol' => $data['vol'] ];}fclose($handle);//在这里打印,就能看到整整20年几千行的完整数组了echo "数据解析成功!共读取到 " . count($stockData) . " 个交易日的数据。\n";echo "正在为您生成标准 Excel 电子表格...\n";// 4.开始调用 PhpSpreadsheet写入Excel$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();//设置表头$sheet->setCellValue('A1', '日期');$sheet->setCellValue('B1', '开盘价');$sheet->setCellValue('C1', '最高价');$sheet->setCellValue('D1', '最低价');$sheet->setCellValue('E1', '收盘价');$sheet->setCellValue('F1', '成交量');//循环写入每一行数据$rowNum = 2;foreach($stockData as $data) { $sheet->setCellValue('A' . $rowNum, $data['date']); $sheet->setCellValue('B' . $rowNum, $data['open']); $sheet->setCellValue('C' . $rowNum, $data['high']); $sheet->setCellValue('D' . $rowNum, $data['low']); $sheet->setCellValue('E' . $rowNum, $data['close']); $sheet->setCellValue('F' . $rowNum, $data['vol']); $rowNum++;}//样式微调:让第一行表头文字加粗,显得更专业$sheet->getStyle('A1:F1')->getFont()->setBold(true);//5.保存为标准的 .xlsx 文件$writer = new Xlsx($spreadsheet);$xlsxPath = __DIR__ . '/sh000001_20year_history.xlsx';$writer->save($xlsxPath);echo "✨ 恭喜!标准 Excel 表单已成功在本地生成!\n";echo "文件保存绝对路径为: " . $xlsxPath . "\n";
前面的工具安装好了,PHP环境设置了,剩下的就是运行php文件,直接转换和输出文件了,默认输出的excel文件与源文件同名,输出位置在当前目录。如果系统安装了PHP CLI,通过php命令就可以直接运行文件:在网站上,也可以通过网页访问来运行,在url输入,例如:https://localhost/site/toxls.php
到这里,通达信全日线数据导入EXCEL就顺利顺利跑通了,到了EXCEL表格里,自己可能翻来复去地加工,每支个股数据都分离成了单个文件,整理起来也方便很多。
最后说,别人清洗出来的数据是为了让你看,让你信的,你自己动手清洗出来的数据,才是自己真心想看,真心让自己看的。快快动手,让自己的数据跑起来吧。