为尼克斯队游行制作股票行情纸带
摘要
一个个人项目,使用收据打印机和实时股票数据为尼克斯队冠军游行制作真实的股票行情纸带,融合历史与现代DIY技术。
<p><a href="https://lobste.rs/s/wf0kd6/making_ticker_tape_for_knicks_parade">评论</a></p>
查看缓存全文
缓存时间: 2026/06/20 14:34
# 为尼克斯队游行制作股票行情纸带
来源:https://joe.lothan.net/blog/ticker-tape/
上周六晚上,尼克斯队时隔50多年首次赢得NBA总冠军。当晚纽约全城欢腾——至少别人是这么告诉我的,因为我当时在外州的一场婚礼上看比赛(我坚信尼克斯的胜利为婚礼带来了好运,或者反过来)。所以当市长曼达尼周日宣布周四将举行一场**彩纸游行**(https://en.wikipedia.org/wiki/Ticker_tape)时,我很高兴能有机会在城里庆祝。出于好奇,我查阅了游行的构成,特别是彩纸的成分。
爱迪生股票行情自动收录器
爱迪生股票行情自动收录器,来源:https://commons.wikimedia.org/wiki/File:Edison_Stock_Telegraph_Ticker.jpg
**股票行情纸带**(https://en.wikipedia.org/wiki/Ticker_tape)是一项在19世纪末彻底改变金融业的发明。股票行情自动收录器(因其运行时发出的巨大声响而得名)是历史上首次能够实时打印股票价格信息的机器。它们将信息打印在纸条上——这就是股票行情纸带。华尔街交易繁忙的日子会积累大量纸带。因此,当1886年10月28日自由女神像落成游行经过金融区时,交易员们将成堆的纸带扔出窗外作为临时彩带,彩纸游行便由此诞生。
20世纪60年代,计算机化的股票信息取代了纸带,但它的影响至今犹存:LED股票行情滚动条仍在使用(时报广场等地);公司名称的缩写演变为如今无处不在的股票代码(如GOOG代表Google);纽约证券交易所仍将不同的交易数据流称为“纸带”。
阿波罗11号宇航员的彩纸游行
阿波罗11号宇航员的彩纸游行,1969年8月13日,维基共享资源
当然,现在的彩纸游行早已不再使用真正的股票行情纸带,而是用彩带和碎纸代替。因此,当我在周一阅读这段历史并期盼周四早上的游行时,我产生了一个异想天开的念头。
## 计划
制作尽可能逼真的真正股票行情纸带,并在游行时扔出去。我对最终产品有几点粗略要求:
- 外观尽可能接近历史上的股票行情纸带
- 使用纽约证券交易所的真实交易数据
- 尽可能多做
问题是我几乎没时间完成。这个念头在周一下午冒出,但周二到周三傍晚我有一趟24小时的长途驾车。实际上只有周一晚上、周三晚上和游行前的周四早上能用来动手。不过,我确实有打印长纸条的经验。去年在**递归中心**(https://recurse.com/),我的朋友们和同班同学Alex与Julia设置了一台收据打印机供大家使用。他们做了一个很棒的接口,可以轻松打印任意文本、图片或收据打印机(ESC/POS)命令。收据打印机非常适合这个项目——毕竟它本身就是用于在纸条上打印金融信息的机器。而且它打印速度极快,产量巨大。最重要的是,我能用上它。作为递归中心的校友,我可以回到中心立即用Alex和Julia的API进行原型开发。所以周一一下午,我就直奔过去了。
## 股票行情纸带的布局结构
示例,附有说明“来自行情自动收录器的股票纸带”,来源:http://www.foundationsforscientificinvesting.com/ticker-tape-dating.htm
对于交易所执行的交易,股票行情纸带在上方打印股票代码,下方打印价格和交易量信息,每列一个字符。股票传统上以100股为“手”进行交易。如果只交易了一手,则只打印该手交易的价格。因此,上方纸带中,股票BCX交易了一手,价格为26.75美元。如果交易了多手,则会打印`s`。再如,MGM交易了两手(200股),每股28美元。交易按执行时间顺序排列。
目前股票价格四舍五入到美分,但历史上是四舍五入到1/8美分。为了复古美学,我想将价格显示为1/8美分。因此,要复制股票行情纸带,我只需要从NYSE获取真实市场数据,包括交易时间、股票代码、价格和交易量信息。此外,股票行情纸带宽3/4英寸。收据纸宽3 1/8英寸,大约是纸带宽度的四倍。如果我将收据打印机垂直打印四列股票信息,然后纵向裁切成四份,就能做出相当逼真的股票行情纸带。
## 获取NYSE数据
纽约证券交易所以高昂价格出售所有交易数据的访问权限,每月数千美元。我的朋友**Frank**(https://www.frankchiarulli.com/)向我推荐了**Alpaca**(https://alpaca.markets/)及其易于使用的**市场数据API**(https://docs.alpaca.markets/us/docs/about-market-data-api),它转售交易所的数据。免费层每分钟仅允许200次API调用,但我只需要下载一次数据,即使有限制也绰绰有余。我编写了一个自定义交易下载器,并限制了API请求,从而在一小时内免费下载了NYSE一整天的交易数据:
```
$ python ticker_tape.py --all-nyse nyse_symbols.txt --start 2026-06-12 --raw > trades_unsorted.csv
2412 symbols in 5 batches
Batch 1/5... 100 API calls, 286477 trades so far...
200 API calls, 570741 trades so far...
...
4800 API calls, 13285155 trades so far...
4900 API calls, 13535261 trades so far...
Done: 13687764 trades, 4961 API calls.
$ sort -t, -k1 trades_unsorted.csv > trades_sorted.csv
```
6月12日的交易超过1300万笔,我过滤出交易量大于100股(即至少一手)的交易。我还过滤了NYSE的纸带A:在纽约证券交易所上市的股票。纳斯达克上市的股票也可以在NYSE交易,但我没有包含它们(没有恶意,但纳斯达克成立于1971年,那时股票行情纸带已经过时)。我将数据保存为简单的CSV文件,格式为`time,symbol,lots,price`:
```
$ shuf trades_sorted.csv | head
2026-06-12T16:44:23.68829977Z,KIM,1,25.86
2026-06-12T19:29:01.095354246Z,BRO,2,60.01
2026-06-12T18:02:34.131366062Z,NRG,1,127.34
2026-06-12T19:56:53.726546135Z,STM,1,77.49
2026-06-12T15:49:21.093023174Z,SPCE,1,3.94
2026-06-12T18:58:28.337407525Z,UBER,1,68.39
2026-06-12T18:01:04.794321513Z,LOW,1,220.65
2026-06-12T18:40:08.212887027Z,EW,1,84.86
2026-06-12T16:37:59.233470346Z,GOOS,1,10.08
2026-06-12T18:26:15.475788668Z,AMPX,1,16.45
```
## 在收据纸上打印股票行情纸带
现在有了真实的NYSE交易数据,下一步是将数据发送到收据打印机。
早期打印尝试
早期打印尝试
收据打印机理解**ESC/POS命令**(https://escpos.readthedocs.io/en/latest/commands.html),这些命令与电传打字机非常相似(`0x0a`是换行,命令通常以ESC `0x1b`开头等),但增加了收据专用的命令。例如,`0x1b 0x6d`指示机器使用内置切刀横向切纸。递归中心的收据打印机API可以接受原始ESC/POS命令,所以我编写了一个自定义工具,将交易数据输入转换为ESC/POS格式用于打印:
```
$ uv run python print_tape.py -o ticker_tape.escpos trades_sorted.csv
Wrote 405158 bytes to ticker_tape.escpos.1 (10000 trades, 10 cuts, 36982mm / 1456.0in)
Wrote 373732 bytes to ticker_tape.escpos.2 (10000 trades, 10 cuts, 34458mm / 1356.6in)
Wrote 359721 bytes to ticker_tape.escpos.3 (10000 trades, 10 cuts, 33321mm / 1311.9in)
Wrote 350070 bytes to ticker_tape.escpos.4 (10000 trades, 10 cuts, 32549mm / 1281.5in)
Wrote 361663 bytes to ticker_tape.escpos.5 (10000 trades, 10 cuts, 33469mm / 1317.7in)
Wrote 353659 bytes to ticker_tape.escpos.6 (10000 trades, 10 cuts, 32827mm / 1292.4in)
Wrote 351398 bytes to ticker_tape.escpos.7 (10000 trades, 10 cuts, 32664mm / 1286.0in)
Wrote 354727 bytes to ticker_tape.escpos.8 (10000 trades, 10 cuts, 32900mm / 1295.3in)
```
该脚本将输入CSV中的每笔交易分配到四个列之一。然后,在一批交易填满各列后,它以股票行情纸带样式逐行渲染每笔交易,每列打印股票代码、价格或交易量信息。
完成打印布局
最终收据打印布局
我使用的主要ESC/POS命令包括:
- **90°旋转**: ESC V 1 (`0x1b 0x56 0x01`) 这使得沿收据长度方向打印变得容易,而不是横向打印。我不需要使用自定义字体或图像,该命令只是在打印前旋转文本。
- **自定义字形**: ESC & 1 和 ESC % 3 (`0x1b 0x25 0x01`) 和 (`0x1b 0x26 0x03 ...`) 这些命令用于包含自定义分数字形。内置字符有1/2和1/4,但看起来不完全正确。旧纸带上的分数没有分隔线,只是分子直接位于分母之上。此外,我们还需要1/8、3/8、5/8和7/8字形。为了精确模仿这种风格,我必须安装每个自定义字形。
1955年真实纸带照片
具有分数价格的真实股票行情纸带(来源:http://www.foundationsforscientificinvesting.com/ticker-tape-dating.htm)
- **绝对位置**: ESC $ L H (`0x1b 0x24 ...`) 这直接设置打印字符的位置,省去了手动调整间距的麻烦。该命令允许我直接索引每个字符要打印的具体位置。
周一晚完成打印
手工剪裁的完成版股票行情纸带设计
## 裁切
利用Claude Code快速构建原型,我在周一晚上就打印出了上述收据(代码在这里(https://git.lothan.net/joe/ticker-tape),供好奇者参考)。从某种意义上看,进展惊人,但从另一角度看,这只是容易的部分。困难在于裁切。如果想要大量生产股票行情纸带,手工裁切是不可能的,太慢且容易出错。我没有太多机械工程经验,但之前用过3D打印。而且我平时用安全剃须刀刮胡子。所以在周三晚上,刚从租车还车点赶到,距离游行只有大约12小时,我设计并打印了这个引导裁切的小夹具,用于将收据裁成四条。
夹具底座的3D模型
裁切夹具底座
它非常简单:一个底盖,用于固定三片双刃剃须刀片,呈一定角度。第二个部件是顶盖,用于手持时保护手,并确保收据纸被压到刀片上。
夹具顶盖的3D模型
裁切夹具顶盖
这是用**OpenSCAD**(https://openscad.org/)制作的,这是一款出色的软件,可以通过编程方式定义3D形状。可能并不令人惊讶,但LLM在编写简单的OpenSCAD代码制作对象方面也相当不错。让递归中心的3D打印机工作有点费劲,我还得盯着打印(卷轴问题),但底座在凌晨1点完美完成。我设置3D打印机打印顶盖后便回家了,经过一整天旅行后疲惫不堪,不确定第二天能否成功。
## 关键时刻
我醒来后,穿上蓝色T恤,骑车直奔递归中心。顶盖过夜打印完成了,但令我惊恐的是,它无法正确对准刀片。我没有时间责备Claude、3D打印机或自己的自大。我从中心里找来一块纸板,用作临时顶盖。效果不错。
使用临时顶盖的夹具运作中
使用临时纸板顶盖的夹具运作中
距离游行开始不到两小时,我打印了大约三卷收据纸(感谢Frank多买了一些!),并用自制夹具将它们裁成一大堆股票行情纸带。在裁切收据纸时,我更加同情打印机设计师了。纸张是一种非常难处理的材料,即使我努力控制进纸角度、去除纸张卷曲和顶盖压力,拉动收据纸穿过夹具时还是**经常卡住**。
我的全套设备
但它仍然出奇地快,不到一小时我就装了两大袋令人惊讶地历史准确的股票行情纸带。该去游行了。
## 彩纸游行
从递归中心出发,我跳上一辆R线列车前往曼哈顿,与朋友们在市政厅会合。但R线不停市政厅,所以我在科特兰街提前下车,独自带着两袋股票行情纸带跌跌撞撞地走进了一片拥挤的人群。
列车上的股票行情纸带袋
科特兰街地铁站连接着Oculus——世贸中心那个巨大的白色交通枢纽。上午9:30,距离游行开始还有半小时,Oculus东北和东南方向的人群已经庞大到几乎停滞,我起初以为游行会从教堂街过来。等我意识到游行实际上是从百老汇大街(一个街区之外)向北行进时,我才明白自己的错误有多严重。通往百老汇的街道挤满了人,肩并肩试图获得哪怕最小的视野。把纸带扔到游行队伍上的想法很快破灭了。
教堂街望向百老汇的人群
教堂街与自由街交叉口,面朝东,祖科蒂公园旁
我茫然地转了一会儿,不知道接下来该怎么办。然后从人群中听到:“哦,那是股票行情纸带!”“没错!你想要一些吗?”我撕下一把纸带,几乎立刻更多人开始索要。
手持股票行情纸带站在路障上的女士
不久后我意识到不可能把纸带扔到游行队伍上,但我找到了新的存在意义:给那些离得太远看不到游行的人一个可以扔掉的小纪念品。
手持股票行情纸带的一家人
我在Oculus周围的街区游走,尽可能靠近百老汇,当人群太拥挤时就退后。不到一小时,两袋股票行情纸带就送完了,给了那些认出它、主动询问或看到别人拿着纸带的人。
三位手持股票行情纸带的女性
我在Oculus周围遇到了各种人:刚学会说“请”和“谢谢”的尼克斯小球迷、记得1973年尼克斯上一次夺冠的纽约人、卖假T恤的小贩、试图赶去上班的金融男、寻求远离人群喘息机会的人,等等。这个想法从一开始就显得遥不可及,但这样一个短时间内的异想天开的小项目居然实现了,并且让我与纽约同胞们产生了联系,这让我非常开心。爱你们,纽约<3。尼克斯加油!
迎风飘扬的股票行情纸带
相似文章
如何通过纽约市交通监控摄像头观看尼克斯队游行
一位艺术家通过GardenCam项目直播纽约市交通摄像头拍摄的尼克斯队冠军游行,提供远程观看的替代方案,同时探讨监控主题。
打造 Transit Tracker
本文详细介绍了“Transit Tracker”的开发过程及其走红经历。这是一个开源的 DIY 项目,使用 ESPHome 和 LED 矩阵制作自定义公共交通到站信息牌。
@draparente: 今年早些时候,我对Claude生成的图表感到不满,于是将这本书喂给Claude,让它生成一个Tufte技巧。
一位用户为Claude创建了一个自定义的Tufte风格技能,以生成更简洁、更美观的图表,并将实现代码分享为gist。
@pattssun: @nyknicks 的夺冠激励我打造了一个 AI 篮球教练来提升我的 1v1 技术。使用技术:- Robloflow R…
一位开发者利用 Roboflow RF-DETR 进行检测、MediaPipe 捕捉身体角度、OpenCV 进行分析和标注,构建了一个 AI 篮球教练。
Show HN: 一款8位棒球直播赛事转播应用
一个将实时MLB数据转化为近乎实时的8位像素艺术棒球比赛直播的网站,包含球场细节、昼夜模式以及插播画面。