PHP清洗数据:通达信全市场个股全部历史日线数据导入EXCEL

通达信和量化软件都提供了丰富的交叉查询方案,用起来很方便,但很多时候,个人对数据需求其实是有差异的,可以说千人千面,要独立定制数据,就需要对个股数据进行二次加工和清洗。

通常情况下,将个股数据直接导入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命令就可以直接运行文件:

php toxls.php

在网站上,也可以通过网页访问来运行,在url输入,例如:

https://localhost/site/toxls.php

到这里,通达信全日线数据导入EXCEL就顺利顺利跑通了,到了EXCEL表格里,自己可能翻来复去地加工,每支个股数据都分离成了单个文件,整理起来也方便很多。

最后说,别人清洗出来的数据是为了让你看,让你信的,你自己动手清洗出来的数据,才是自己真心想看,真心让自己看的。快快动手,让自己的数据跑起来吧。


精选留言

sample
2026-08-24
写留言
签到
投稿
QQ咨询
返回顶部