<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: San Si wu</title>
    <description>The latest articles on DEV Community by San Si wu (@san_siwu_f08e7c406830469).</description>
    <link>https://dev.to/san_siwu_f08e7c406830469</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3665359%2F3f6c9af0-82fd-495d-9021-3b4daf538554.png</url>
      <title>DEV Community: San Si wu</title>
      <link>https://dev.to/san_siwu_f08e7c406830469</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/san_siwu_f08e7c406830469"/>
    <language>en</language>
    <item>
      <title>全球股票行情数据怎么接？我用 iTick API 一周搭好了跨市场量化数据管道</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Sun, 23 Aug 2026 21:42:13 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/quan-qiu-gu-piao-xing-qing-shu-ju-zen-yao-jie-wo-yong-itick-api-zhou-da-hao-liao-kua-shi-chang-liang-hua-shu-ju-guan-dao-2078</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/quan-qiu-gu-piao-xing-qing-shu-ju-zen-yao-jie-wo-yong-itick-api-zhou-da-hao-liao-kua-shi-chang-liang-hua-shu-ju-guan-dao-2078</guid>
      <description>&lt;h1&gt;
  
  
  全球股票行情数据怎么接？我用 iTick API 一周搭好了跨市场量化数据管道
&lt;/h1&gt;

&lt;p&gt;做量化这几年，我踩过最多的坑不是策略，而是数据。&lt;/p&gt;

&lt;p&gt;最早接美股的时候用的某家老牌数据商，文档写得像天书，SDK 只支持 Python 2，光调通一个历史K线接口就花了我三天。后来业务扩展到港股和A股，又分别接了两个不同的数据源，三套接口、三种鉴权方式、两套字段命名，每天光维护数据同步脚本就要占掉半天。&lt;/p&gt;

&lt;p&gt;上个月团队要做一个覆盖全球主要市场的选股策略，我实在不想再维护第四套数据接入了，花了一周时间调研，最后选了 &lt;a href="https://itick.org" rel="noopener noreferrer"&gt;iTick&lt;/a&gt;。这篇文章记录一下整个接入过程，给同样在折腾多市场数据的朋友一个参考。&lt;/p&gt;

&lt;h2&gt;
  
  
  为什么是 iTick
&lt;/h2&gt;

&lt;p&gt;选数据源我主要看三点：覆盖市场够不够广、接口是不是统一、延迟稳不稳定。&lt;/p&gt;

&lt;p&gt;iTick 覆盖的市场确实全，美股、港股、A股、台湾、新加坡、日本、印度、泰国、德国、英国、荷兰这些主流市场都有，外加外汇、指数、期货、基金、加密货币，基本上一个 API 就能搞定大部分场景。详细的支持列表可以看他们的 &lt;a href="https://docs.itick.org" rel="noopener noreferrer"&gt;官方文档&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;接口统一这点对我来说是最大的痛点解决。不管是股票还是外汇，REST API 的调用方式、参数结构、返回字段都是一套规范，不用每个市场都重新学一遍。WebSocket 也是统一的发布订阅模式，连上之后订阅什么品种就收什么数据。&lt;/p&gt;

&lt;p&gt;延迟方面我实测了一周，美股盘口数据推送基本在毫秒级，99.99% 的可用性标称不是吹的，至少我这一周没遇到过断连。&lt;/p&gt;

&lt;h2&gt;
  
  
  第一步：REST API 拉历史K线
&lt;/h2&gt;

&lt;p&gt;先从最简单的开始。iTick 的 REST API 用 header 传 token 鉴权，注册账号后在控制台生成一个 token 就能用。&lt;/p&gt;

&lt;p&gt;拉港股腾讯控股（700）和阿里巴巴（9988）最近5根5分钟K线，直接一个 GET 请求：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.itick.org/stock/klines?region=HK&amp;amp;codes=700,9988&amp;amp;kType=2&amp;amp;limit=5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;你的token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;参数说几个关键点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;region&lt;/code&gt; 是市场代码，HK是港股，US是美股，SH/SZ是沪深，支持的市场列表文档里有&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;codes&lt;/code&gt; 支持批量，逗号分隔，免费版最多同时查10个&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kType&lt;/code&gt; 是K线周期，1=1分钟，2=5分钟，3=15分钟，4=30分钟，5=1小时，8=日线，9=周线，10=月线&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;返回的数据结构是这样的：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"700"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"o"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;535&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"h"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"l"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;534.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;534.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"v"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;104799385&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"tu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;56119888070.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1741239000000&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"9988"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"o"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;139.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"h"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;140.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"l"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;139.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;140.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"v"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;538602171&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"tu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;75404622753.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1741239000000&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;标准的 OHLCV 结构，&lt;code&gt;t&lt;/code&gt; 是毫秒级时间戳，&lt;code&gt;tu&lt;/code&gt; 是成交额。拿到数据后直接丢进 pandas 就能算指标了，不用做任何字段映射。&lt;/p&gt;

&lt;p&gt;我对比了一下，同样的日线数据，iTick 的复权处理是对的，拆股和分红都自动调整过了，不用自己再算复权因子。&lt;/p&gt;

&lt;h2&gt;
  
  
  第二步：WebSocket 订阅实时行情
&lt;/h2&gt;

&lt;p&gt;历史数据搞定了，接下来是实时行情。做策略的都知道，轮询 REST API 既浪费调用次数又有延迟，WebSocket 才是正道。&lt;/p&gt;

&lt;p&gt;iTick 的 WebSocket 是发布订阅模式，连上之后发一条订阅消息就行。我用他们的 Python SDK 来演示，比自己手写 websocket 连接省事很多：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;# 初始化客户端
&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;你的token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 设置消息回调
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;收到行情: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;连接错误: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 连接股票WebSocket
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_stock_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 订阅腾讯控股实时行情
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_websocket_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;codes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: [&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;700&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;]}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 保持连接
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SDK 内置了自动重连和心跳维护，断网后会自动重连并恢复订阅，不用自己写重连逻辑。重连间隔5秒，最多重试10次，心跳30秒一次，这些参数对大多数场景都够用了。&lt;/p&gt;

&lt;p&gt;实时推送的数据包含最新价、买卖盘口、成交量这些，做盘中策略完全够用。我同时订阅了20只股票，推送频率很稳，没有遇到丢数据的情况。&lt;/p&gt;

&lt;h2&gt;
  
  
  第三步：用 SDK 还是直接调 API？
&lt;/h2&gt;

&lt;p&gt;iTick 提供了 &lt;a href="https://docs.itick.org/en/sdk/python-sdk" rel="noopener noreferrer"&gt;Python SDK&lt;/a&gt; 和 Java SDK，我两个都试了一下。&lt;/p&gt;

&lt;p&gt;如果你的项目是 Python，强烈建议直接用 SDK，&lt;code&gt;pip install itick-sdk&lt;/code&gt; 一行装好，封装了所有 REST 接口和 WebSocket 连接：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;你的token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 股票实时报价
&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;苹果最新价: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ld&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 历史K线
&lt;/span&gt;&lt;span class="n"&gt;kline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 外汇实时tick
&lt;/span&gt;&lt;span class="n"&gt;forex_tick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_forex_tick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EURUSD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 加密货币深度
&lt;/span&gt;&lt;span class="n"&gt;crypto_depth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_crypto_depth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BTCUSDT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;方法命名很直观，&lt;code&gt;get_stock_quote&lt;/code&gt;、&lt;code&gt;get_stock_kline&lt;/code&gt;、&lt;code&gt;get_forex_tick&lt;/code&gt;，看名字就知道干嘛的，不用翻文档。&lt;/p&gt;

&lt;p&gt;如果你用的语言没有官方 SDK，直接调 REST API 也很简单，就是标准的 HTTP 请求加 header 鉴权，没有什么花里胡哨的签名算法。&lt;/p&gt;

&lt;h2&gt;
  
  
  数据质量这块多说几句
&lt;/h2&gt;

&lt;p&gt;做量化的对数据质量都很敏感，我重点验证了几个方面：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;复权处理&lt;/strong&gt;：美股拆股、港股供股、A股分红，这些场景下的前复权数据都是对的，我抽了几只历史上有拆股的股票对比过，没有出现价格断层。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;时间戳对齐&lt;/strong&gt;：不同市场的交易时间不一样，iTick 返回的时间戳都是 UTC 毫秒，自己转成本地时间就行，不会出现时区混乱的问题。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;缺失数据&lt;/strong&gt;：停牌期间的K线会跳过，不会用0或者上一个价格填充，这点比有些数据商厚道，不用自己再过滤异常值。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;盘口深度&lt;/strong&gt;：免费版能拿到5档盘口，付费版档位更多，做市商策略可能需要高级版，普通趋势策略5档够用了。&lt;/p&gt;

&lt;h2&gt;
  
  
  成本怎么选
&lt;/h2&gt;

&lt;p&gt;定价这块他们分了四档，我列一下实际使用中的感受：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;免费版&lt;/strong&gt;：5次/分钟 REST 调用，1个WebSocket连接，3个订阅。个人学习、回测够用，实盘肯定不够。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base版 $79/月&lt;/strong&gt;：120次/分钟，3个连接，200个订阅。个人交易者够用了。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional版 $159/月&lt;/strong&gt;：600次/分钟，6个连接，500个订阅。小团队或者多策略适用。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premium版 $319/月&lt;/strong&gt;：1200次/分钟，12个连接，2000个订阅。机构级用量。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我现在用的是 Professional 版，同时跑3个策略，订阅了大概300只股票，调用量和连接数都还有余量。&lt;/p&gt;

&lt;h2&gt;
  
  
  几个踩坑提醒
&lt;/h2&gt;

&lt;p&gt;最后说几个我接入时遇到的小问题，帮大家省点时间：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;region 参数别写错&lt;/strong&gt;：美股是 &lt;code&gt;US&lt;/code&gt; 不是 &lt;code&gt;USA&lt;/code&gt;，港股是 &lt;code&gt;HK&lt;/code&gt; 不是 &lt;code&gt;HKG&lt;/code&gt;，刚开始我写错了返回空数据，查了半天才发现。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket 订阅 codes 是数组&lt;/strong&gt;：别传字符串，要传 &lt;code&gt;["700", "9988"]&lt;/code&gt; 这种数组格式。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;免费版有调用频率限制&lt;/strong&gt;：5次/分钟，写循环的时候记得加 sleep，不然会被限流。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;历史数据深度&lt;/strong&gt;：不同市场的历史数据深度不一样，美股能到十几年，一些小市场可能只有几年，回测前先确认数据量够不够。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;token 别硬编码&lt;/strong&gt;：放环境变量里，代码上传到 Git 之前检查一下，别把 token 提交上去了。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;用了 iTick 一个月，最大的感受就是省时间。以前接三个市场的数据要维护三套代码，现在一个 SDK 全搞定，省下来的时间能多研究几个策略。&lt;/p&gt;

&lt;p&gt;如果你也在做多市场量化，或者正在为数据源的事情头疼，可以去 &lt;a href="https://itick.org" rel="noopener noreferrer"&gt;itick.org&lt;/a&gt; 注册个免费账号试试，免费版够你评估数据质量和接口易用性了。详细的接口文档在 &lt;a href="https://docs.itick.org" rel="noopener noreferrer"&gt;docs.itick.org&lt;/a&gt;，写得还算清楚，照着例子抄基本不会出错。&lt;/p&gt;

&lt;p&gt;有问题也可以在评论区交流，我踩过的坑能帮你少走点弯路。&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>土耳其股市数据踩坑记：itick Turkey Stock API 实际使用分享</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Wed, 19 Aug 2026 19:16:45 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/tu-er-qi-gu-shi-shu-ju-cai-keng-ji-itick-turkey-stock-api-shi-ji-shi-yong-fen-xiang-660</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/tu-er-qi-gu-shi-shu-ju-cai-keng-ji-itick-turkey-stock-api-shi-ji-shi-yong-fen-xiang-660</guid>
      <description>&lt;p&gt;做全球市场配置的朋友最近老问我土耳其股市的数据怎么拿。里拉这几年波动大，BIST（伊斯坦布尔证券交易所）反而成了不少宏观策略和新兴市场基金盯的池子。但说实话，土耳其市场的数据接口不像美股、A股那么好找，免费能用的更少。我自己试了一圈，最后用 itick 跑通了，这里把实际用法和踩过的坑记一下。&lt;/p&gt;

&lt;h2&gt;
  
  
  准备工作
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;itick-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;去 &lt;a href="https://itick.org" rel="noopener noreferrer"&gt;itick.org&lt;/a&gt; 注册个账号，后台拿 token。土耳其市场的 region 代码是 &lt;code&gt;TR&lt;/code&gt;，这个记一下，后面所有接口都要带。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  多周期K线交叉验证
&lt;/h2&gt;

&lt;p&gt;土耳其股市波动比A股大，做技术分析的时候我习惯同时看几个周期交叉验证。itick 支持的周期还挺全的，从1分钟到月线都有。拿土耳其航空（THYAO）举个例子，8个周期各取5根对比一下：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# THYAO 土耳其航空，多周期K线
&lt;/span&gt;&lt;span class="n"&gt;periods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1分钟&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5分钟&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15分钟&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30分钟&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1小时&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1天&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1周&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1月&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;periods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;kline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;THYAO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;K线: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kline&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;分钟级的我一般用来做短线择时验证，日线周线看中长期趋势。这个多周期交叉验证的思路其实哪个市场都能用，不只是土耳其。&lt;/p&gt;

&lt;h2&gt;
  
  
  批量拉取权重股K线
&lt;/h2&gt;

&lt;p&gt;如果要同时盯好几只权重股，一只一只请求太浪费调用次数了。itick 有批量接口，KCHOL（Koç Holding）、EREGL（Erdemir钢铁）、THYAO、GARAN（Garanti银行）这几只可以一次拉回来：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 一次性拉取多只土耳其权重股的日K线
&lt;/span&gt;&lt;span class="n"&gt;codes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KCHOL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EREGL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;THYAO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GARAN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;klines_batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_klines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;codes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;批量K线结果:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;klines_batch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;免费套餐每分钟只有5次调用限额，批量接口基本是刚需——不然光拉四只股票的日K就把额度造完了。做板块轮动分析或者多标的对比图表的时候尤其好用。&lt;/p&gt;

&lt;h2&gt;
  
  
  WebSocket实时订阅：quote + depth + tick
&lt;/h2&gt;

&lt;p&gt;做实时行情得用 WebSocket。itick 的 SDK 封装了连接逻辑，quote（报价）、depth（盘口）、tick（逐笔成交）三种类型可以同时订阅：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;推送:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;错误:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_stock_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# 四只权重股，同时订阅报价、盘口、逐笔成交三种类型
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_websocket_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KCHOL$TR,EREGL$TR,THYAO$TR,GARAN$TR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote,depth,tick&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;连接状态:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_websocket_connected&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这里有个坑：三种数据类型同时订阅时，服务端推送的消息结构不一样，得用返回里的 &lt;code&gt;type&lt;/code&gt; 字段区分。我一开始没注意，把所有消息都按报价处理，盘口数据进来直接报错。建议消息处理函数按类型分发：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;
    &lt;span class="n"&gt;msg_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;msg_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;handle_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;msg_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;depth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;handle_depth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;msg_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tick&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;handle_tick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;报价更新:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ld&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_depth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;盘口更新，买一价:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_tick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;成交:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ld&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;方向:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;quote 里的 &lt;code&gt;ld&lt;/code&gt; 是最新价，depth 的 &lt;code&gt;b[0].p&lt;/code&gt; 是买一价，tick 除了价格还有成交方向 &lt;code&gt;d&lt;/code&gt;。字段名记得看清楚，我第一次把买一卖一搞反了，盯了半天才发现。&lt;/p&gt;

&lt;h2&gt;
  
  
  上线前要注意的几件事
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;限流保护&lt;/strong&gt;：免费和基础套餐的 REST 调用频率有限制，客户端最好加一层简单的请求节流，短时间内打爆了会返回限流错误，影响线上服务。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;异常降级&lt;/strong&gt;：WebSocket 即使 SDK 会自动重连，重连的那几秒前端最好用最后一次收到的数据兜底，别让界面直接空白报错。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;时区处理&lt;/strong&gt;：土耳其跟北京有5小时时差（夏令时的时候是4小时），K线数据里的时间戳都是 UTC 毫秒，前端展示的时候记得按当地时区转换，不然会出现"收盘时间对不上"的困惑——我第一次就踩了这个坑。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;多周期缓存&lt;/strong&gt;：日线、周线这种变化频率低的数据，客户端可以做适当缓存，没必要每次都重新请求，减少不必要的调用消耗。&lt;/p&gt;

&lt;h2&gt;
  
  
  写在最后
&lt;/h2&gt;

&lt;p&gt;土耳其市场因为波动性和汇率关联性，在数据消费场景上比其他市场稍微复杂一点，但 itick 的接口逻辑跟它支持的其他30多个市场是完全一致的，就是 &lt;code&gt;region=TR&lt;/code&gt; 加上 BIST 的股票代码就行。免费套餐先跑通流程，需要更高频率和更多标的的时候再考虑升级。&lt;/p&gt;

&lt;p&gt;如果你也在做新兴市场的数据接入，这个方案可以先试试。&lt;/p&gt;




&lt;p&gt;项目地址：&lt;a href="https://github.com/itick-org" rel="noopener noreferrer"&gt;https://github.com/itick-org&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>做A股量化，一套Python SDK搞定A股行情数据沪深实时+历史行情</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Mon, 17 Aug 2026 21:00:47 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/zuo-agu-liang-hua-tao-python-sdkgao-ding-agu-xing-qing-shu-ju-hu-shen-shi-shi-li-shi-xing-qing-5bga</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/zuo-agu-liang-hua-tao-python-sdkgao-ding-agu-xing-qing-shu-ju-hu-shen-shi-shi-li-shi-xing-qing-5bga</guid>
      <description>&lt;p&gt;写量化小工具、个人盯盘脚本的时候，相信很多朋友跟我一样：&lt;strong&gt;最难的往往不是写策略逻辑，而是搞定靠谱的行情数据源&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;之前踩过不少坑：用爬虫抓取网页行情，网站一改接口直接全部失效；高频请求就触发IP限流；不同市场返回字段五花八门，写一堆适配代码；想要实时推送，还要自己折腾WebSocket心跳、断线重连，一堆底层细节耗掉大把时间。&lt;/p&gt;

&lt;p&gt;最近在做个人A股监控小项目，试了 itick 的 Python SDK，体验挺舒服，不需要复杂封装，REST拿历史K线，WebSocket接收实时推送，沪深两市一套代码就能搞定，在这里分享下实战踩坑与完整示例。&lt;/p&gt;

&lt;h2&gt;
  
  
  一个关键认知：A股要区分沪市SH、深市SZ
&lt;/h2&gt;

&lt;p&gt;和美股港股不一样，A股接口里，上海交易所用&lt;code&gt;region=SH&lt;/code&gt;，深圳交易所用&lt;code&gt;region=SZ&lt;/code&gt;，这是最容易踩的第一个坑。&lt;/p&gt;

&lt;p&gt;举两个典型标的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;贵州茅台 600519 → 沪市 SH&lt;/li&gt;
&lt;li&gt;平安银行 000001 → 深市 SZ&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️注意：股票代码直接传纯数字，&lt;strong&gt;不要带 &lt;code&gt;.SH&lt;/code&gt; / &lt;code&gt;.SZ&lt;/code&gt; 后缀&lt;/strong&gt;，region参数负责区分交易所，后缀加上反而查不到数据。如果拿不准某只股票归属哪个市场，可以调用&lt;code&gt;get_symbol_list&lt;/code&gt;标的列表接口确认。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  快速安装初始化
&lt;/h2&gt;

&lt;p&gt;安装SDK，填入自己申请的token即可完成初始化：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;itick-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="c1"&gt;# 替换成你的token
&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  REST接口：获取实时快照 + 历史K线
&lt;/h2&gt;

&lt;p&gt;普通的最新报价、历史K线数据，直接调用REST接口就可以，同步调用简单直接，适合回测、定时拉取数据场景。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 获取沪市贵州茅台实时报价
&lt;/span&gt;&lt;span class="n"&gt;quote_sh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;600519&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;茅台实时报价:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote_sh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取深市平安银行实时报价
&lt;/span&gt;&lt;span class="n"&gt;quote_sz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SZ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;000001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;平安银行实时报价:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote_sz&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取茅台最近60根日线K线
# kType:1=1分钟,2=5分钟,3=15分钟,4=30分钟,5=1小时,8=日线,9=周线,10=月线
&lt;/span&gt;&lt;span class="n"&gt;kline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;600519&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;茅台日K线:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kline&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;返回字段是统一规范：&lt;br&gt;
&lt;code&gt;o&lt;/code&gt;开盘、&lt;code&gt;h&lt;/code&gt;最高、&lt;code&gt;l&lt;/code&gt;最低、&lt;code&gt;c&lt;/code&gt;收盘、&lt;code&gt;v&lt;/code&gt;成交量、&lt;code&gt;tu&lt;/code&gt;成交额。A股、港股、美股字段命名保持一致，做多市场项目的时候，不用反复写不同字段适配代码，这点很省心。&lt;/p&gt;
&lt;h2&gt;
  
  
  WebSocket实时推送：同时订阅沪深多只股票
&lt;/h2&gt;

&lt;p&gt;如果要做盘中盯盘、预警脚本，轮询接口效率太低，优先使用 WebSocket 推送。&lt;/p&gt;

&lt;p&gt;比较友好的一点：&lt;strong&gt;同一个连接可以同时订阅沪市、深市的标的，不用分别新建两条连接&lt;/strong&gt;，监控沪深300一篮子股票的时候会省事很多。SDK内部已经封装好了心跳、断线自动重连，断线后最多重试10次，重连成功自动恢复订阅关系，不用自己手写重连逻辑。&lt;/p&gt;

&lt;p&gt;示例代码：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;# 收到行情消息回调
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;收到行情推送：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 异常回调
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;连接异常：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 注册回调函数
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 建立websocket连接
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_stock_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 订阅标的：格式 代码$交易所，同时订阅quote快照、tick逐笔
&lt;/span&gt;&lt;span class="n"&gt;sub_msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;600519$SH,000001$SZ,300750$SZ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote,tick&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_websocket_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sub_msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 保持连接30秒接收数据
&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;连接状态：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_websocket_connected&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;# 关闭连接
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡小提示：A股不是7×24小时市场，非交易时段不会有tick、quote推送。如果连接成功但是收不到数据，先确认是否开盘；排查连接是否正常，可以尝试订阅kline类型做验证。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  开发A股工具，这几个细节一定要留意
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;交易状态字段 ts&lt;/strong&gt;&lt;br&gt;
quote接口返回&lt;code&gt;ts&lt;/code&gt;字段代表股票状态：0正常交易、1停牌、2退市、3熔断。写监控、预警程序务必判断这个字段，否则停牌、涨跌停股票的数据容易造成逻辑误判。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;T+1 是交易规则，和行情接口无关&lt;/strong&gt;&lt;br&gt;
SDK只返回行情数据，不涉及交易下单。A股T+1属于券商交易层面规则，不会影响行情数据获取。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;常见报错排查&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cannot be resolved action&lt;/code&gt;：大概率订阅消息里股票代码、SH/SZ格式写错，核对&lt;code&gt;代码$region&lt;/code&gt;写法；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;完全收不到推送：优先检查当前是否A股交易时间，其次核对token权限。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  简单总结
&lt;/h2&gt;

&lt;p&gt;个人做量化小项目的时候，优先避开不稳定的网页爬虫，选择成熟SDK可以节省大量底层开发时间。&lt;/p&gt;

&lt;p&gt;这套方案的优势总结：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;统一SDK，A股区分SH/SZ，多市场字段统一；&lt;/li&gt;
&lt;li&gt;历史K线用REST，实时行情用WebSocket，分工清晰；&lt;/li&gt;
&lt;li&gt;WebSocket内置心跳、自动重连，减少造轮子；&lt;/li&gt;
&lt;li&gt;有免费套餐可以用来做原型验证，跑通脚本之后，再按需升级扩大标的数量。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;完整的字段说明、批量接口可以去官方文档中心查阅。&lt;/p&gt;

&lt;p&gt;希望这篇实战可以帮到正在折腾Python量化的小伙伴。如果大家有好用的行情工具，也欢迎评论区一起交流。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;免责声明：本文仅为技术开发实战分享，不构成任何投资建议，行情接口仅供程序学习研究使用。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;参考文档：&lt;a href="https://docs.itick.org/zh-cn/rest-api/stocks/stock-kline" rel="noopener noreferrer"&gt;https://docs.itick.org/rest-api/stocks/stock-kline&lt;/a&gt;&lt;br&gt;
GitHub：&lt;a href="https://github.com/itick-org" rel="noopener noreferrer"&gt;https://github.com/itick-org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>港股数据接口开发教程 Python 实现实时报价、逐笔、盘口深度推送</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Sat, 15 Aug 2026 17:32:54 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/gang-gu-shu-ju-jie-kou-kai-fa-jiao-cheng-python-shi-xian-shi-shi-bao-jie-zhu-bi-pan-kou-shen-du-tui-song-1jnf</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/gang-gu-shu-ju-jie-kou-kai-fa-jiao-cheng-python-shi-xian-shi-shi-bao-jie-zhu-bi-pan-kou-shen-du-tui-song-1jnf</guid>
      <description>&lt;p&gt;做港股量化、写小行情工具也有大半年了，期间换过好几个行情数据源，踩过不少坑：要么实时推送延迟高、要么历史K线残缺、免费额度抠门到没法测试，直到最近上手iTick，才算把港股数据对接流程理顺，分享一套实测能用的实操方案，给同样做港股数据需求的朋友避坑。&lt;/p&gt;

&lt;h2&gt;
  
  
  一、先说下港股数据采集的难点
&lt;/h2&gt;

&lt;p&gt;和A股、美股不一样，港交所原生行情授权门槛很高，个人开发者很难拿到一手直连权限，市面上很多第三方工具存在几个通病：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;实时行情推送卡顿，盘口逐笔数据断断续续，做短线回测完全不准；&lt;/li&gt;
&lt;li&gt;历史分钟线、分时线接口收费贵，免费额度只给少量日线，回测根本不够用；&lt;/li&gt;
&lt;li&gt;SDK封装差，大多只提供原生http请求，WebSocket实时订阅要自己手写心跳、重连，调试成本极高；&lt;/li&gt;
&lt;li&gt;标的代码规则混乱，有的要加0前缀、有的要后缀，多股票批量查询容易报错。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;对比下来iTick对个人开发者友好度会高很多，一套SDK同时覆盖REST静态历史数据+WebSocket实时推送，港股、美股、A股切换只改地区参数，不用重复写多套对接逻辑，小项目、个人量化工具完全够用。&lt;/p&gt;

&lt;h2&gt;
  
  
  二、零门槛上手，新手也能快速搭环境
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 安装依赖
&lt;/h3&gt;

&lt;p&gt;直接pip一键安装官方封装好的SDK，不用自己处理http请求、websocket连接底层逻辑：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;itick-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 获取权限
&lt;/h3&gt;

&lt;p&gt;官网注册账号就能领取免费token，不用企业资质，个人开发者直接可用：&lt;br&gt;
免费套餐权益（日常测试足够）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST历史接口每分钟5次调用&lt;/li&gt;
&lt;li&gt;WebSocket单条连接可订阅3只个股
像腾讯700、阿里9988、美团3690这类热门标的，拿来做短期测试、小策略回测完全没问题，后期多标的批量监控再升级付费套餐就行。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  三、两个高频场景实操代码（直接复制运行）
&lt;/h2&gt;
&lt;h3&gt;
  
  
  场景1：拉取港股历史K线，做策略回测
&lt;/h3&gt;

&lt;p&gt;支持1分钟、5分钟、小时线、日线、周线、月线全周期，返回开高低收、成交量、成交额、时间戳完整字段，不用自己二次清洗时间。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="c1"&gt;# 替换成你自己的token
&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;你的API_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 1. 腾讯控股700，获取最近30根日线
&lt;/span&gt;&lt;span class="n"&gt;stock_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;700&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;腾讯日线数据：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. 阿里巴巴9988，获取20根60分钟K线
&lt;/span&gt;&lt;span class="n"&gt;stock_60m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9988&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;阿里小时线数据：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stock_60m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;周期编码对照表，按需替换第三个参数：&lt;br&gt;
1=1分钟｜2=5分钟｜3=15分钟｜4=30分钟｜5=1小时｜8=日线｜9=周线｜10=月线&lt;br&gt;
返回字段简单说明：o开盘、h最高、l最低、c收盘、v成交量、tu成交额、t毫秒时间戳，标准化格式，pandas直接导入做回测。&lt;/p&gt;
&lt;h3&gt;
  
  
  场景2：WebSocket实时订阅盘口、逐笔、实时报价
&lt;/h3&gt;

&lt;p&gt;做盯盘工具、实时信号预警必备，内置心跳、断线自动重连，不用自己写定时心跳、断线重试逻辑，省心很多。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;你的API_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 接收推送回调
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;实时行情推送：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 异常捕获回调
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;连接异常：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 绑定回调函数
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 建立长连接
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_stock_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# 批量订阅多只港股：实时报价+逐笔成交+五档盘口深度
&lt;/span&gt;&lt;span class="n"&gt;sub_msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;700$HK,9988$HK,3690$HK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote,tick,depth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_websocket_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sub_msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 持续接收20秒数据测试
&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 关闭连接
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;订阅成功会返回提示&lt;code&gt;subscribe Successfully&lt;/code&gt;，如果代码/地区填错会提示解析失败，检查股票代码和HK地区标识即可。&lt;br&gt;
额外实用细节：港股逐笔tick数据自带成交方向d字段（1卖出、2买入），做资金流向、逐笔成交分析非常方便，目前支持A股/港股/美股三个市场。&lt;/p&gt;

&lt;h2&gt;
  
  
  四、内置省心功能，省掉大量开发工作量
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;自动心跳+断线重连&lt;/strong&gt;&lt;br&gt;
官方SDK已经封装30秒自动心跳，断线后5秒间隔重试，最多10次重连，重连后自动恢复订阅，不用自己维护定时任务，跑隔夜策略不用怕断流丢数据。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;批量行情接口，高效多标的监控&lt;br&gt;
自带&lt;code&gt;get_stock_quotes&lt;/code&gt;批量报价接口，一次性查询多只股票实时价格，不用循环单条请求，大幅减少接口调用次数，节省额度。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;多市场统一调用逻辑&lt;br&gt;
港股region填HK，切换A股、美股只修改地区参数，接口名称、传参逻辑完全一致，同时做多市场策略不用维护多套对接代码。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  五、实测踩坑总结，提前避坑
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;港股代码纯数字即可，比如腾讯直接传700，0700也能识别，但官方示例统一不带前导0，建议统一格式避免后期出兼容问题；&lt;/li&gt;
&lt;li&gt;免费套餐WebSocket仅支持3个标的订阅，批量盯盘多只个股建议升级付费版；&lt;/li&gt;
&lt;li&gt;1分钟K线实时推送（WebSocket kline）仅高级套餐开放，普通用户拉分钟历史数据走REST接口更稳定；&lt;/li&gt;
&lt;li&gt;接口调用有频率限制，批量循环拉取数据记得加延时，避免超限被限制访问。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  六、适合哪些人用？
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;个人量化交易者：写策略回测、实时信号提醒工具；&lt;/li&gt;
&lt;li&gt;小型资讯/盯盘小工具开发者：需要稳定港股实时+历史数据；&lt;/li&gt;
&lt;li&gt;多市场交易者：同时覆盖A股、港股、美股，想要统一SDK降低开发成本。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;整体用下来对比之前试的几款数据源，itick最大优势是对个人开发者友好，文档清晰、SDK封装完整，不用耗费大量时间处理底层连接、数据格式化，入门门槛低，免费额度足够前期测试，有港股数据需求的朋友可以自行注册试一下。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;温馨提示：本文仅供代码参考，不构成任何投资建议。市场有风险，投资需谨慎&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;参考文档：&lt;a href="https://docs.itick.org/zh-cn/rest-api/stocks/stock-kline" rel="noopener noreferrer"&gt;https://docs.itick.org/rest-api/stocks/stock-kline&lt;/a&gt;&lt;br&gt;
GitHub：&lt;a href="https://github.com/itick-org" rel="noopener noreferrer"&gt;https://github.com/itick-org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>越南股市数据获取实践：用 Python 轻松接入 HOSE 实时行情</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Sun, 09 Aug 2026 14:06:44 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/yue-nan-gu-shi-shu-ju-huo-qu-shi-jian-yong-python-qing-song-jie-ru-hose-shi-shi-xing-qing-2bbk</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/yue-nan-gu-shi-shu-ju-huo-qu-shi-jian-yong-python-qing-song-jie-ru-hose-shi-shi-xing-qing-2bbk</guid>
      <description>&lt;p&gt;胡志明证券交易所（HOSE）的日均成交额在 2025 年已突破 20 万亿越南盾，外资净买入额连年攀升。Vinamilk（VNM）、Vingroup（VIC）这些标的不仅在本土有影响力，也逐渐进入全球新兴市场投资者的视野。但相比美股、港股，越南市场的行情数据接口在国内讨论得并不多——要么依赖国际券商提供的有限 API，要么自己爬取网页，稳定性堪忧。&lt;/p&gt;

&lt;p&gt;最近我在调研东南亚市场的数据方案时，发现一套比较顺手的工具链，借着这篇文章把实践过程记录下来，希望能给对越南股市感兴趣的朋友节省一些踩坑时间。&lt;/p&gt;




&lt;h2&gt;
  
  
  数据接口的选型思路
&lt;/h2&gt;

&lt;p&gt;最初我考虑过直接用 &lt;code&gt;requests&lt;/code&gt; 爬取 Vietstock 或 CafeF 的页面，但很快就遇到两个问题：一是反爬策略越来越严，二是历史 K 线需要自己拼接计算，分钟级数据几乎拿不到。后来转向专业数据服务，对比了几家国际行情提供商，最终选了 itick，理由很朴素：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;它对越南市场的覆盖以 HOSE 主流标的为主，正好是我需要的范围；&lt;/li&gt;
&lt;li&gt;Python SDK 封装得比较干净，WebSocket 自动重连和心跳保活都内置了，省去自己处理断线重连的麻烦；&lt;/li&gt;
&lt;li&gt;免费套餐足够跑通流程，确认数据字段后再决定是否升级。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;当然，如果你只需要收盘价做回测，用付费的普通 REST 接口也够；但如果要搭建实时看盘或策略监控，WebSocket 推送是更合适的方式。&lt;/p&gt;




&lt;h2&gt;
  
  
  环境准备与初次调用
&lt;/h2&gt;

&lt;p&gt;安装 SDK 只需要一行：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;itick-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;注册账号后在后台拿到 token，就可以开始调用了。越南市场的 &lt;code&gt;region&lt;/code&gt; 参数固定为 &lt;code&gt;"VN"&lt;/code&gt;，股票代码沿用 HOSE 的惯例（如 VNM、VIC、VCB）。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取 VNM 实时报价
&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VNM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;返回的字段结构和其他新兴市场保持一致，核心字段包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ld&lt;/code&gt; —— 最新价&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ch&lt;/code&gt; / &lt;code&gt;chp&lt;/code&gt; —— 涨跌额 / 涨跌幅&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;o&lt;/code&gt; / &lt;code&gt;h&lt;/code&gt; / &lt;code&gt;l&lt;/code&gt; —— 开 / 高 / 低&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ts&lt;/code&gt; —— 交易状态（正常、熔断、停牌等）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这里特别提醒：越南股市有涨跌停板（HOSE 为 ±7%），如果 &lt;code&gt;ts&lt;/code&gt; 字段显示熔断或停牌，一定不能把旧价格当作实时价展示，否则会误导用户。&lt;/p&gt;




&lt;h2&gt;
  
  
  历史 K 线获取与常用周期
&lt;/h2&gt;

&lt;p&gt;对于回测或技术分析，历史 K 线是刚需。itick 的 &lt;code&gt;get_stock_kline&lt;/code&gt; 接口支持从 1 分钟到月线多种周期，kType 参数对应关系如下：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;kType&lt;/th&gt;
&lt;th&gt;周期&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;15分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;30分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1小时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;日线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;周线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;月线&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;以下代码获取 Vingroup（VIC）近 60 个交易日的日线数据：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;kline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VIC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;kline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; O:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;o&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; H:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;h&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; L:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;l&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; C:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;c&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;返回的时间戳是 Unix 毫秒级，转换成北京时间需要注意时差（越南比北京慢 1 小时）。另外，越南盾面值较大，价格字段本身是整数或浮点数，前端渲染时记得做千分位格式化，避免一长串零影响阅读。&lt;/p&gt;




&lt;h2&gt;
  
  
  WebSocket 实时推送与分钟级 K 线
&lt;/h2&gt;

&lt;p&gt;如果你需要做盘中实时监控或动态图表，REST 轮询的效率不够，WebSocket 是更好的选择。itick 的 SDK 已经封装好了连接、心跳和自动重连逻辑（5 秒间隔，最多 10 次重试），我们只需关注消息处理：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;收到推送:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;连接错误:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_stock_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 订阅 VNM 和 VIC 的实时报价 + 1分钟 K 线推送
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_websocket_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VNM$VN,VIC$VN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote,kline@1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这里有个实际成本考量：&lt;code&gt;kline@1&lt;/code&gt;（1 分钟 K 线实时推送）在 itick 的免费和基础套餐里是不可用的，需要 Premium 及以上或者单独购买股票数据包。如果你的产品对分钟级数据实时性要求不高，完全可以退而求其次，用 REST 接口每 60 秒拉取一次最新 K 线，成本会低很多，且逻辑足够简单。&lt;/p&gt;

&lt;p&gt;对于日线级别的展示，REST 拉取已经绰绰有余，WebSocket 主要优势体现在需要捕捉盘中异动的场景。&lt;/p&gt;




&lt;h2&gt;
  
  
  越南市场特有的几个注意事项
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;交易所区分&lt;/strong&gt;：HOSE 是胡志明市主板，HNX 是河内交易所（类似创业板）。itick 目前主要覆盖 HOSE 标的，如果需要查询某只代码是否支持，可以先调用 &lt;code&gt;get_symbol_list("VN")&lt;/code&gt; 遍历确认。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;节假日与交易时段&lt;/strong&gt;：越南股市交易时间为周一至周五的 9:00-11:30 和 13:00-14:45（越南时间），比 A 股早收盘。做定时任务时要注意时区和节假日日历，避免无效请求。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;流动性分层&lt;/strong&gt;：HOSE 上头部股票（VNM、VIC、VCB、HPG）流动性很好，但一些小盘股日内成交稀疏，tick 数据可能跳变较大，回测时需注意处理非活跃时段的数据。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  如果扩展到其他东南亚市场
&lt;/h2&gt;

&lt;p&gt;这套代码的可移植性是我比较满意的地方。itick 对印尼（ID）、菲律宾（PH）、马来西亚（MY）等市场也有支持，后续如果要做跨市场对比，只需要把 &lt;code&gt;region&lt;/code&gt; 参数换成对应的国家代码，其余字段结构基本一致，开发成本非常低。&lt;/p&gt;

&lt;p&gt;当然，前提是先确认目标市场在 itick 的产品目录中是否有 coverage——这一点建议直接查阅官方文档的 symbol 列表，比盲目尝试更高效。&lt;/p&gt;




&lt;h2&gt;
  
  
  结语
&lt;/h2&gt;

&lt;p&gt;从零开始接入越南行情数据，其实没想象中复杂。一套 SDK + 几行代码就能拿到可用的实时报价和历史 K 线，剩下的精力可以放在策略逻辑和前端交互上。至于选哪家数据服务商，我觉得关键看三点：&lt;strong&gt;市场覆盖是否匹配、接口稳定性和维护成本、以及定价与自身需求的契合度&lt;/strong&gt;。itick 在我这次调研中表现合格，特别是免费套餐让前期验证几乎没有门槛，算是比较务实的选择。&lt;/p&gt;

&lt;p&gt;如果你也在研究东南亚市场，欢迎交流。数据是投资的起点，但远不是终点——祝大家都能在胡志明指数的起伏中找到自己的节奏。&lt;/p&gt;

&lt;p&gt;参考文档：&lt;a href="https://docs.itick.org/zh-cn/rest-api/stocks/stock-kline" rel="noopener noreferrer"&gt;https://docs.itick.org/rest-api/stocks/stock-kline&lt;/a&gt;&lt;br&gt;
GitHub：&lt;a href="https://github.com/itick-org" rel="noopener noreferrer"&gt;https://github.com/itick-org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
    </item>
    <item>
      <title>How to Access Swiss Stock Market Data via API – Live Prices &amp; Historical Candlesticks for SMI Top Stocks (NESN, NOVN, ROG)</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Sun, 02 Aug 2026 11:49:37 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/how-to-access-swiss-stock-market-data-via-api-live-prices-historical-candlesticks-for-smi-top-329a</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/how-to-access-swiss-stock-market-data-via-api-live-prices-historical-candlesticks-for-smi-top-329a</guid>
      <description>&lt;p&gt;Recently I have been building a lightweight global asset monitoring dashboard. I quickly solved the data interfaces for US stocks, A-shares, and Hong Kong stocks, but the market data for the Swiss Exchange (SIX) was the one that kept getting stuck.&lt;/p&gt;

&lt;p&gt;Anyone building global asset allocation or personal wealth management tools knows the Swiss market hides many heavyweight blue-chips — Nestlé, Novartis, Roche. These are classic holdings in a global portfolio. Most free data sources do not cover SIX, and paid APIs are too expensive. Before, I had to make do with static data and couldn’t support real-time monitoring or historical trend review.&lt;/p&gt;

&lt;p&gt;After testing multiple financial data APIs, I finally used iTick’s Python SDK to successfully fetch Swiss market real-time quotes, historical K-lines, and WebSocket push data. The integration process is very simple, requires no complex configuration, and the free quota is enough for personal projects. Here I record the full implementation process so others can avoid pitfalls and get up and running quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why You Must Integrate Swiss Market Data
&lt;/h2&gt;

&lt;p&gt;Many personal quant and asset dashboard projects tend to ignore the Swiss market, but SIX’s core names are highly valuable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nestlé (NESN): global consumer food leader, defensive asset benchmark&lt;/li&gt;
&lt;li&gt;Novartis (NOVN), Roche (ROG): global pharma giants, core healthcare allocation&lt;/li&gt;
&lt;li&gt;UBS Group (UBSG): major international financial institution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These low-volatility, high-stability overseas blue chips are essential for diversification. If you build global asset visualization, cross-border backtesting, or personal holdings monitoring, missing Swiss market data leaves the asset allocation picture incomplete.&lt;/p&gt;

&lt;p&gt;I used static end-of-day data for a long time. That prevented me from seeing intraday fluctuations or automatically pulling K-lines for trend analysis. The user experience was terrible. After integrating a real-time API, I finally closed the loop for mainstream global market coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Preparation: Account Registration and SDK Installation
&lt;/h2&gt;

&lt;p&gt;The integration is very lightweight and does not require complicated approvals. Individual developers can get started quickly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the iTick official website (&lt;a href="https://itick.org" rel="noopener noreferrer"&gt;https://itick.org&lt;/a&gt;) to register an account. In the personal console you can get an API Token. One token works for both REST and WebSocket APIs, so no separate application is needed.&lt;/li&gt;
&lt;li&gt;Install the official Python SDK locally in one command, compatible with mainstream Python 3 versions:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;itick-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New users receive free usage quota. That is enough for personal dashboards, small-scale data review, and daily market monitoring without needing to upgrade to paid service.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Example 1: Fetch Nestlé Real-Time Quote in Python
&lt;/h2&gt;

&lt;p&gt;iTick uses a unified region coding scheme across global markets. The Swiss market is identified as &lt;code&gt;CH&lt;/code&gt;, and stock symbols use the official SIX codes directly, so no secondary mapping is needed.&lt;/p&gt;

&lt;p&gt;Just a few lines of code fetch Nestlé real-time market data, including current price, open, high, low, and other core fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="c1"&gt;# Replace with the real token from your personal console
&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Get Nestlé (NESN) real-time quote on the Swiss market
&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NESN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Practical Guide: Accessing US Stock Quant Data — Low-Cost Real-Time Quotes and Historical K-Lines
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Environment Setup and Data Source Selection
&lt;/h2&gt;

&lt;p&gt;First, install the SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;itick-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then register an account at &lt;a href="https://itick.org" rel="noopener noreferrer"&gt;https://itick.org&lt;/a&gt; and obtain an API token from the dashboard. You will need this token for every request.&lt;/p&gt;

&lt;p&gt;Why choose iTick? There are many excellent financial data APIs, but iTick's free tier already covers major markets including US, HK, and A-share real-time quotes and historical K-lines. The REST API allows 5 calls per minute, and WebSocket supports 1 connection with subscriptions for 3 symbols on the free tier. This quota is sufficient for learning and prototype testing, and latency is acceptable in practice. If you need higher frequency, paid plans offer configurations such as 600 calls/minute and multiple connections.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Fetching Real-Time Quotes (REST)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Use "US" for the US market
&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Latest Apple quote:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_tick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TSLA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tesla tick:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set &lt;code&gt;region&lt;/code&gt; to "US"; the SDK will build the full request. Returned fields include &lt;code&gt;ld&lt;/code&gt; (latest price), &lt;code&gt;o/h/l&lt;/code&gt; (open/high/low), &lt;code&gt;ch/chp&lt;/code&gt; (price change and percent change), which match typical broker app fields.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Fetching Historical K-Lines
&lt;/h2&gt;

&lt;p&gt;US stocks support multiple intervals from 1-minute to monthly. The &lt;code&gt;kType&lt;/code&gt; values are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;kType&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 minute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;15 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;1 day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;1 week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1 month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pull the last 10 five-minute K-lines for Apple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;kline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;K-line data:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kline&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each K-line includes &lt;code&gt;t&lt;/code&gt; (timestamp), &lt;code&gt;o/h/l/c&lt;/code&gt; (open/high/low/close), &lt;code&gt;v&lt;/code&gt; (volume), and &lt;code&gt;tu&lt;/code&gt; (turnover). That’s sufficient for basic charting.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. WebSocket Real-Time Push
&lt;/h2&gt;

&lt;p&gt;Polling REST endpoints can hit rate limits and is inefficient for live monitoring. Use WebSocket so the server pushes updates. The iTick SDK wraps connection handling, heartbeat, and auto-reconnect.&lt;/p&gt;

&lt;p&gt;Example subscribing to Apple and Tesla quotes and order book depth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Received push: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WebSocket error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Establish WebSocket connection
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_stock_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Subscribe to AAPL (US) and TSLA (NASDAQ on US market)
&lt;/span&gt;&lt;span class="n"&gt;subscribe_msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL$US,TSLA$NASDAQ$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote,depth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_websocket_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscribe_msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Keep the connection for a while; replace with an event loop in production
&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WebSocket connected:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_websocket_connected&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Subscription parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;params&lt;/code&gt; format: &lt;code&gt;SYMBOL$REGION&lt;/code&gt;. If you need to disambiguate exchanges within a market, use &lt;code&gt;SYMBOL$EXCHANGE$REGION&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;types&lt;/code&gt; can include &lt;code&gt;tick&lt;/code&gt; (trade-by-trade), &lt;code&gt;quote&lt;/code&gt; (real-time quote), &lt;code&gt;depth&lt;/code&gt; (top-10 order book), and &lt;code&gt;kline&lt;/code&gt; (K-line push; note 1-minute kline@1 may be restricted to premium plans).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SDK provides a default heartbeat (ping every 30s) and automatic reconnection on network blips (retry every 5s up to 10 times). Subscriptions are restored after reconnect.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;Q: Is the free tier enough for daily development?&lt;/p&gt;

&lt;p&gt;A: For learning, prototyping, or low-frequency strategies, 5 REST calls/min and 1 WebSocket connection are usually sufficient. Upgrade when you need to monitor more symbols or higher-frequency data.&lt;/p&gt;

&lt;p&gt;Q: How is latency?&lt;/p&gt;

&lt;p&gt;A: iTick reports millisecond-level push latency. In my tests, delay is small and suitable for monitoring and real-time computation; actual latency depends on server location and network.&lt;/p&gt;

&lt;p&gt;Q: How many symbols can one WebSocket connection subscribe to?&lt;/p&gt;

&lt;p&gt;A: A single connection supports up to 500 symbols. For thousands of symbols, split across connections or request higher limits from support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This article demonstrates accessing US real-time quotes and historical K-lines using the iTick Python SDK: use REST for on-demand queries and WebSocket for continuous real-time feeds. Together they support stock selection, monitoring, and backtesting workflows. From registration to receiving the first WebSocket push, you can get up and running in about 30 minutes.&lt;/p&gt;

&lt;p&gt;For more field details, batch endpoints, and SDKs in Java/Go/Node.js, see the iTick docs: &lt;a href="https://docs.itick.org" rel="noopener noreferrer"&gt;https://docs.itick.org&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>美股量化数据接入实战：低成本获取实时行情与历史K线</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Sun, 02 Aug 2026 11:36:06 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/mei-gu-liang-hua-shu-ju-jie-ru-shi-zhan-di-cheng-ben-huo-qu-shi-shi-xing-qing-yu-li-shi-kxian-3k0p</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/mei-gu-liang-hua-shu-ju-jie-ru-shi-zhan-di-cheng-ben-huo-qu-shi-shi-xing-qing-yu-li-shi-kxian-3k0p</guid>
      <description>&lt;h2&gt;
  
  
  环境准备与数据源选择
&lt;/h2&gt;

&lt;p&gt;先装 SDK：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;itick-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;然后去 &lt;a href="https://itick.org" rel="noopener noreferrer"&gt;itick 官网&lt;/a&gt; 注册账号，在后台拿到 API Token。所有请求都会用到它。&lt;/p&gt;

&lt;p&gt;为什么选 itick？其实社区里还有很多优秀的金融数据 API，但 itick 的免费套餐已经覆盖了美股、港股、A股等主流市场的实时数据和历史K线。REST 接口每分钟可以调用 5 次，WebSocket 允许 1 条连接、订阅 3 个标的。这个额度对学习、原型测试基本够用，实测下来延迟也在可接受范围内。如果你需要更高频的查询，官方也提供了 600 次/分钟、6 条连接等更高配置的付费方案，按需升级就好。&lt;/p&gt;




&lt;h2&gt;
  
  
  1. 获取实时报价（REST）
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# region 填 US 代表美股市场
&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;苹果最新报价：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_tick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TSLA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;特斯拉 Tick：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;region&lt;/code&gt; 参数传 &lt;code&gt;"US"&lt;/code&gt; 即可，SDK 底层会自动拼接成完整请求。返回的字段里，&lt;code&gt;ld&lt;/code&gt; 是最新价，&lt;code&gt;o/h/l&lt;/code&gt; 是开、高、低，&lt;code&gt;ch/chp&lt;/code&gt; 是涨跌额和涨跌幅，和券商 App 看盘时的数据基本一致。&lt;/p&gt;




&lt;h2&gt;
  
  
  2. 获取历史 K 线
&lt;/h2&gt;

&lt;p&gt;美股支持从 1 分钟到月线的多种周期，参数 &lt;code&gt;kType&lt;/code&gt; 的取值整理如下：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;kType&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5 分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;15 分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;30 分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1 小时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;1 天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;1 周&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1 月&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;拉取苹果最近 10 根 5 分钟 K 线的代码：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;kline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;K线数据：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kline&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;每条 K 线包含 &lt;code&gt;t&lt;/code&gt;（时间戳）、&lt;code&gt;o/h/l/c&lt;/code&gt;（开高低收）、&lt;code&gt;v&lt;/code&gt;（成交量）和 &lt;code&gt;tu&lt;/code&gt;（成交额），画个简单的走势图完全够用。&lt;/p&gt;




&lt;h2&gt;
  
  
  3. WebSocket 实时推送
&lt;/h2&gt;

&lt;p&gt;盯盘、量化实盘等场景下，反复轮询 REST 接口很容易触碰频率上限，而且效率不高。更好的方式是使用 WebSocket，让服务端主动推送数据。itick 的 SDK 已经封装好了连接、心跳和自动重连。&lt;/p&gt;

&lt;p&gt;下面是一个完整的订阅例子，同时接收苹果和特斯拉的报价与盘口数据：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;收到推送: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WebSocket 出错: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 建立 WebSocket 连接
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_stock_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 订阅 AAPL（US 市场）和 TSLA（NASDAQ 交易所，US 市场）
&lt;/span&gt;&lt;span class="n"&gt;subscribe_msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL$US,TSLA$NASDAQ$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote,depth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_websocket_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscribe_msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 保持连接一段时间，实际项目中可以改成事件循环
&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;当前连接状态：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_websocket_connected&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;关于订阅参数：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;params&lt;/code&gt; 格式为 &lt;code&gt;代码$地区&lt;/code&gt;。如果同一市场内有多个交易所需要区分，可以写成 &lt;code&gt;代码$交易所$地区&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;types&lt;/code&gt; 可选 &lt;code&gt;tick&lt;/code&gt;（逐笔成交）、&lt;code&gt;quote&lt;/code&gt;（实时报价）、&lt;code&gt;depth&lt;/code&gt;（十档盘口）、&lt;code&gt;kline&lt;/code&gt;（K线推送，其中 1 分钟粒度的 kline@1 目前仅对 Premium 及以上套餐开放）。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SDK 还内置了心跳机制（默认每 30 秒 ping 一次），一旦因网络抖动断线，会自动按 5 秒间隔重连，最多尝试 10 次。重连成功后，之前的订阅关系也会自动恢复。这个小设计在搭建实时监控时省了不少事。&lt;/p&gt;




&lt;h2&gt;
  
  
  常见问题
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q：免费套餐能支撑日常开发吗？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
如果只是个人学习、搭建原型或者跑一些低频策略，每分钟 5 次 REST 调用、1 条 WebSocket 连接基本足够。当策略需要监控更多标的或更高频的数据时，再考虑升级到更高级别的套餐。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q：数据延迟表现怎么样？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
itick 官方给出的延迟参考是毫秒级推送。我在本地测试下来，做盯盘工具和实时计算的延迟感知很小，符合一般量化的要求。当然实际体验也和你的服务器位置、网络环境有关。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q：一条 WebSocket 连接可以订阅多少个标的？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
单条连接最多支持 500 个标的。如果你监控上千只美股，可以按逻辑拆分成多条连接，或者联系客服调整连接数上限。&lt;/p&gt;




&lt;h2&gt;
  
  
  结语
&lt;/h2&gt;

&lt;p&gt;本文用 itick 的 Python SDK 演示了美股实时行情和历史 K 线的基本接入流程：REST 负责一次性或低频查询，WebSocket 负责持续的实时推送。两条链路配合使用，基本能覆盖选股、盯盘、策略回测等场景。整个流程从注册、拿到 Token 到跑通第一条 WebSocket 推送，通常半小时内能搞定。&lt;/p&gt;

&lt;p&gt;更详细的字段说明、批量请求接口以及 Java/Go/Node.js 等语言的 SDK，可以查阅 &lt;a href="https://docs.itick.org" rel="noopener noreferrer"&gt;itick 文档中心&lt;/a&gt;。希望这篇文章能帮你少走一点弯路，快速把数据层搭起来。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;免责声明：本文仅用于技术交流与学习，不构成任何投资建议。&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>Swiss Stock Market API Integration Tutorial: Get Real-Time Quotes &amp; Historical K-Line</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Thu, 23 Jul 2026 08:34:41 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/swiss-stock-market-api-integration-tutorial-get-real-time-quotes-historical-k-line-3b1</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/swiss-stock-market-api-integration-tutorial-get-real-time-quotes-historical-k-line-3b1</guid>
      <description>&lt;p&gt;Recently I have been building a lightweight global asset monitoring dashboard. I quickly solved the data interfaces for US stocks, A-shares, and Hong Kong stocks, but the market data for the Swiss Exchange (SIX) was the one that kept getting stuck.&lt;/p&gt;

&lt;p&gt;Anyone building global asset allocation or personal wealth management tools knows the Swiss market hides many heavyweight blue-chips — Nestlé, Novartis, Roche. These are classic holdings in a global portfolio. Most free data sources do not cover SIX, and paid APIs are too expensive. Before, I had to make do with static data and couldn’t support real-time monitoring or historical trend review.&lt;/p&gt;

&lt;p&gt;After testing multiple financial data APIs, I finally used iTick’s Python SDK to successfully fetch Swiss market real-time quotes, historical K-lines, and WebSocket push data. The integration process is very simple, requires no complex configuration, and the free quota is enough for personal projects. Here I record the full implementation process so others can avoid pitfalls and get up and running quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why You Must Integrate Swiss Market Data
&lt;/h2&gt;

&lt;p&gt;Many personal quant and asset dashboard projects tend to ignore the Swiss market, but SIX’s core names are highly valuable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nestlé (NESN): global consumer food leader, defensive asset benchmark&lt;/li&gt;
&lt;li&gt;Novartis (NOVN), Roche (ROG): global pharma giants, core healthcare allocation&lt;/li&gt;
&lt;li&gt;UBS Group (UBSG): major international financial institution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These low-volatility, high-stability overseas blue chips are essential for diversification. If you build global asset visualization, cross-border backtesting, or personal holdings monitoring, missing Swiss market data leaves the asset allocation picture incomplete.&lt;/p&gt;

&lt;p&gt;I used static end-of-day data for a long time. That prevented me from seeing intraday fluctuations or automatically pulling K-lines for trend analysis. The user experience was terrible. After integrating a real-time API, I finally closed the loop for mainstream global market coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Preparation: Account Registration and SDK Installation
&lt;/h2&gt;

&lt;p&gt;The integration is very lightweight and does not require complicated approvals. Individual developers can get started quickly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the iTick official website (&lt;a href="https://itick.org" rel="noopener noreferrer"&gt;https://itick.org&lt;/a&gt;) to register an account. In the personal console you can get an API Token. One token works for both REST and WebSocket APIs, so no separate application is needed.&lt;/li&gt;
&lt;li&gt;Install the official Python SDK locally in one command, compatible with mainstream Python 3 versions:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;itick-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New users receive free usage quota. That is enough for personal dashboards, small-scale data review, and daily market monitoring without needing to upgrade to paid service.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Example 1: Fetch Nestlé Real-Time Quote in Python
&lt;/h2&gt;

&lt;p&gt;iTick uses a unified region coding scheme across global markets. The Swiss market is identified as &lt;code&gt;CH&lt;/code&gt;, and stock symbols use the official SIX codes directly, so no secondary mapping is needed.&lt;/p&gt;

&lt;p&gt;Just a few lines of code fetch Nestlé real-time market data, including current price, open, high, low, and other core fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="c1"&gt;# Replace with the real token from your personal console
&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Get Nestlé (NESN) real-time quote on the Swiss market
&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NESN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Nestlé real-time market data:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The returned data structure is very clean and the field names are intuitive. No extra parsing is required. All core quote fields are output directly, making it ideal for quickly integrating with a front-end dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Example 2: Pull Novartis Historical K-Line for Trend Review
&lt;/h2&gt;

&lt;p&gt;Real-time quotes meet monitoring needs, while historical K-lines are essential for quant review and trend analysis. I often pull the last 90 trading days of daily data for trend judgment.&lt;/p&gt;

&lt;p&gt;The SDK’s K-line interface is very user-friendly. The &lt;code&gt;kType&lt;/code&gt; parameter is unified across all markets and is easy to remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1: 1-minute K-line | 2: 5-minute K-line | 3: 15-minute K-line | 4: 30-minute K-line&lt;/li&gt;
&lt;li&gt;5: hourly | 8: daily | 9: weekly | 10: monthly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, to get the last 90 days of daily K-line data for Novartis (NOVN):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Get the last 90 days of daily K-line data for Novartis
&lt;/span&gt;&lt;span class="n"&gt;kline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NOVN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Novartis historical daily data:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kline&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The returned data includes complete fields: open (&lt;code&gt;o&lt;/code&gt;), high (&lt;code&gt;h&lt;/code&gt;), low (&lt;code&gt;l&lt;/code&gt;), close (&lt;code&gt;c&lt;/code&gt;), volume (&lt;code&gt;v&lt;/code&gt;), turnover (&lt;code&gt;tu&lt;/code&gt;), timestamp (&lt;code&gt;t&lt;/code&gt;). The best part is this field standard works for US stocks, Hong Kong stocks, A-shares, and European markets. I can use the same parsing logic for all global market K-line data, saving a lot of compatibility effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Example 3: WebSocket Long Connection for Real-Time Push Data
&lt;/h2&gt;

&lt;p&gt;REST APIs are good for on-demand polling, but asset dashboards need dynamic real-time updates. Polling wastes quota and is less efficient. For this use case, WebSocket long connections are the best choice.&lt;/p&gt;

&lt;p&gt;iTick SDK includes a mature WebSocket wrapper. You don’t need to write low-level connection logic. Just configure callback functions and you can subscribe to multiple symbols in real time. The example below subscribes to Nestlé, Novartis, and Roche on the Swiss market:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;# Market data push callback
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Real-time market update: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Error callback
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connection error alert: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Bind callback methods
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Open stock WebSocket long connection
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_stock_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Batch subscribe: format is SYMBOL$MARKET, multiple symbols separated by commas
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_websocket_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NESN$CH,NOVN$CH,ROG$CH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Listen continuously for 30 seconds, adjust duration as needed
&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Check connection status
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WebSocket connected:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_websocket_connected&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;# Close connection
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Subscriptions are flexible. The &lt;code&gt;types&lt;/code&gt; parameter can switch between &lt;code&gt;quote&lt;/code&gt; real-time quotes, &lt;code&gt;tick&lt;/code&gt; trade-by-trade data, &lt;code&gt;depth&lt;/code&gt; order book depth, and &lt;code&gt;kline&lt;/code&gt; real-time K-line push. This covers market analysis, intraday monitoring, and real-time K-line update needs. One connection can support up to 500 subscribed symbols, which is enough for personal and small-team use.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Practical Experience: Stability Pitfalls Summary
&lt;/h2&gt;

&lt;p&gt;For market monitoring tools, the biggest concerns are disconnects, data interruptions, and lost subscriptions after reconnect. With some smaller APIs I had to implement heartbeat keepalive, reconnection, and subscription recovery myself. That wasted time and effort.&lt;/p&gt;

&lt;p&gt;In practice, iTick’s SDK includes a full stable mechanism and is very developer-friendly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default 30-second heartbeat keepalive to maintain connections&lt;/li&gt;
&lt;li&gt;Automatic retry after unexpected disconnect, retrying every 5 seconds up to 10 times&lt;/li&gt;
&lt;li&gt;Automatic recovery of subscriptions after reconnect, with no manual resubscription needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tested it overnight, and the connection stayed stable with no disconnects. Push latency was very low and fully met personal dashboard stability needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Key Detail: Handle Swiss Franc Pricing Correctly
&lt;/h2&gt;

&lt;p&gt;This is a common beginner pitfall! All Swiss market symbols are priced in Swiss francs (CHF). If you compare them directly with USD or CNY priced assets in the same dashboard, you will get misleading results.&lt;/p&gt;

&lt;p&gt;My solution is to pair it with an FX API to get real-time CHF/USD and CHF/CNY exchange rates, then do currency conversion at the front-end display layer and label the currency clearly. The FX calls use the same API style as stock quotes, so the learning curve is low and it solves multi-currency display consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Summary
&lt;/h2&gt;

&lt;p&gt;Overall, integrating Swiss market data with iTick offers the biggest advantages of unified standards, low learning cost, and strong stability. You don’t need to adapt to different market API rules; one codebase can cover global equities, FX, and crypto. That greatly reduces duplicated development effort.&lt;/p&gt;

&lt;p&gt;For individual developers building global asset dashboards, small quant review tools, or cross-border asset monitoring, this solution is fully sufficient. The free quota supports normal development and use without needing expensive professional APIs.&lt;/p&gt;

&lt;p&gt;I will continue integrating German and UK market data, and I’ll keep updating these practical notes. If you need it, you can refer to:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/itick-org/python-sdk" rel="noopener noreferrer"&gt;https://github.com/itick-org/python-sdk&lt;/a&gt;&lt;br&gt;
Documentation: &lt;a href="https://docs.itick.org/sdk/python-sdk/" rel="noopener noreferrer"&gt;https://docs.itick.org/sdk/python-sdk/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>瑞士股市 API 接入教程：获取瑞士股市（雀巢/诺华/罗氏）实时行情与历史K线</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Thu, 23 Jul 2026 08:24:21 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/rui-shi-gu-shi-api-jie-ru-jiao-cheng-huo-qu-rui-shi-gu-shi-que-chao-nuo-hua-luo-shi-shi-shi-xing-qing-yu-li-shi-kxian-556k</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/rui-shi-gu-shi-api-jie-ru-jiao-cheng-huo-qu-rui-shi-gu-shi-que-chao-nuo-hua-luo-shi-shi-shi-xing-qing-yu-li-shi-kxian-556k</guid>
      <description>&lt;p&gt;最近在自研轻量化全球资产监控看板，美股、A股、港股的数据接口都很快搞定，唯独&lt;strong&gt;瑞士证券交易所（SIX）&lt;/strong&gt;的行情数据一直卡壳。&lt;/p&gt;

&lt;p&gt;做全球化资产配置、个人财富管理工具的朋友应该都清楚，瑞士股市藏着不少核心权重巨头——食品龙头雀巢、制药双雄诺华、罗氏，都是全球资产组合里的经典配置标的。但市面上免费数据源大多不覆盖SIX交易所，付费接口又性价比太低，之前我只能用静态数据凑合，完全实现不了实时盯盘、历史走势复盘的需求。&lt;/p&gt;

&lt;p&gt;折腾对比了多款金融数据接口后，终于用 iTick 的 Python SDK 顺利跑通了瑞士股市的实时报价、历史K线以及长连接行情推送。整个接入过程极简，没有复杂配置，免费额度也完全够用个人项目。这里把完整实操流程记录下来，帮大家避开踩坑，快速落地需求。&lt;/p&gt;

&lt;h2&gt;
  
  
  一、为什么一定要接入瑞士市场行情数据？
&lt;/h2&gt;

&lt;p&gt;很多个人量化、资产看板项目容易忽略瑞士市场，但SIX交易所的核心标的含金量极高：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;雀巢（NESN）：全球消费食品龙头，防御性资产标杆&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;诺华（NOVN）、罗氏（ROG）：全球制药巨头，医药赛道核心配置&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;瑞银集团（UBSG）：国际头部金融机构标的&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这类低波动、高稳定性的海外蓝筹标的，是分散投资风险的关键。如果做全球资产可视化、跨境回测、个人持仓监控，缺失瑞士市场数据，整个资产配置体系其实是不完整的。&lt;/p&gt;

&lt;p&gt;我之前长期用静态盘后数据，不仅无法查看盘中实时波动，也不能自动拉取K线做趋势分析，体验极差。这次接入实时接口后，终于补齐了全球主流市场的数据闭环。&lt;/p&gt;

&lt;h2&gt;
  
  
  二、前置准备：账号注册与SDK安装
&lt;/h2&gt;

&lt;p&gt;整体接入流程非常轻量化，无需复杂资质审核，个人开发者即可快速上手：&lt;/p&gt;

&lt;p&gt;1、前往 &lt;a href="https://itick.org" rel="noopener noreferrer"&gt;iTick 官网&lt;/a&gt;注册账号，进入个人控制台即可获取&lt;strong&gt;API Token&lt;/strong&gt;，一个Token通用REST、WebSocket双接口，无需多次申请；&lt;/p&gt;

&lt;p&gt;2、本地一键安装官方Python SDK，适配主流Python3版本：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;itick-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;新用户自带免费调用额度，对于个人看板、小规模数据复盘、日常行情监控完全够用，无需付费升级。&lt;/p&gt;

&lt;h2&gt;
  
  
  三、实操1：Python获取雀巢实时行情报价
&lt;/h2&gt;

&lt;p&gt;iTick 对全球市场做了统一的区域编码规范，&lt;strong&gt;瑞士市场固定标识为 CH&lt;/strong&gt;，股票代码直接沿用SIX交易所官方标准代码，无需二次转换，适配性极强。&lt;/p&gt;

&lt;p&gt;几行极简代码即可获取雀巢实时盘口数据，包含现价、开盘价、最高价、最低价等核心字段：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itick.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="c1"&gt;# 替换为个人控制台获取的真实Token
&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;你的_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取雀巢（NESN）瑞士市场实时报价
&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NESN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;雀巢实时行情数据：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;接口返回数据结构非常规整，字段命名直观，无需额外二次解析。所有核心行情参数直接输出，开箱即用，非常适合快速对接前端看板展示。&lt;/p&gt;

&lt;h2&gt;
  
  
  四、实操2：拉取诺华历史K线，用于趋势复盘
&lt;/h2&gt;

&lt;p&gt;实时报价满足实时监控需求，而历史K线是量化复盘、走势分析的核心。我常用的场景是拉取近90个交易日的日线数据，用来做标的趋势研判。&lt;/p&gt;

&lt;p&gt;SDK的K线接口参数设计非常人性化，&lt;strong&gt;kType参数统一适配全市场周期&lt;/strong&gt;，记忆成本极低：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;1：1分钟K线 | 2：5分钟K线 | 3：15分钟K线 | 4：30分钟K线&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5：小时线 | 8：日线 | 9：周线 | 10：月线&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;以诺华（NOVN）近90天日线数据为例，完整调用代码：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 获取诺华近90天日线K线数据
&lt;/span&gt;&lt;span class="n"&gt;kline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_stock_kline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NOVN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;诺华历史日线数据：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kline&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;返回数据包含完整的 &lt;strong&gt;开盘(o)、最高(h)、最低(l)、收盘(c)、成交量(v)、成交额(tu)、时间戳(t)&lt;/strong&gt; 字段。最加分的是，这套字段规范适配美股、港股、A股、欧洲市场等全品类标的，我直接用同一套解析逻辑，就能处理所有全球市场K线数据，省去了大量适配兼容的重复工作。&lt;/p&gt;

&lt;h2&gt;
  
  
  五、实操3：WebSocket长连接，实现实时行情推送
&lt;/h2&gt;

&lt;p&gt;REST接口适合按需主动查询，但资产看板需要动态实时刷新，轮询不仅耗时还浪费调用额度，这种场景下WebSocket长连接是最优解。&lt;/p&gt;

&lt;p&gt;iTick SDK 内置成熟的WebSocket封装，无需手写底层连接逻辑，只需配置回调函数，即可实现多标的实时订阅。下面一次性订阅雀巢、诺华、罗氏三大瑞士权重股实时报价：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;# 行情推送回调函数
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;实时行情更新：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 异常报错回调函数
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;连接异常提醒：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 绑定回调方法
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_message_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_error_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 建立股市WebSocket长连接
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_stock_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 批量订阅：格式 股票代码$市场区域，多标的逗号分隔
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_websocket_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NESN$CH,NOVN$CH,ROG$CH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 持续监听30秒，可根据业务需求调整时长
&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 查看连接状态
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WebSocket连接状态：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_websocket_connected&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;# 关闭连接
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close_websocket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;订阅支持灵活配置，&lt;code&gt;types&lt;/code&gt; 参数可切换多种行情类型：&lt;code&gt;quote&lt;/code&gt;实时报价、&lt;code&gt;tick&lt;/code&gt;逐笔成交、&lt;code&gt;depth&lt;/code&gt;盘口深度、&lt;code&gt;kline&lt;/code&gt;实时K线推送，完全满足盘口分析、日内短线监控、实时K线更新等不同场景。单连接最多支持500个标的订阅，足够个人和小型团队使用。&lt;/p&gt;

&lt;h2&gt;
  
  
  六、实测体验：稳定性踩坑小结
&lt;/h2&gt;

&lt;p&gt;做行情监控工具，最担心的就是断线、数据断流、重连后订阅失效的问题。之前对接部分小众接口，需要自己手写心跳保活、断线重连、订阅恢复逻辑，耗时又费力。&lt;/p&gt;

&lt;p&gt;实测 iTick 的 SDK 自带全套稳定机制，对开发者非常友好：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;默认30秒心跳保活，持续维持连接状态；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;意外断线后自动重试，5秒间隔重试、最多10次，容错性强；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;重连成功后自动恢复历史订阅，全程无感，无需手动重订。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我挂机测试整晚，连接全程稳定无断开，行情推送延迟极低，完全满足个人资产看板的稳定性需求。&lt;/p&gt;

&lt;h2&gt;
  
  
  七、关键细节：务必处理瑞士法郎计价问题
&lt;/h2&gt;

&lt;p&gt;这是很多新手容易踩的坑！瑞士股市所有标的默认以&lt;strong&gt;瑞士法郎（CHF）&lt;/strong&gt;计价，如果直接和美元、人民币计价的资产对比展示，会出现严重的数据偏差。&lt;/p&gt;

&lt;p&gt;我的解决方案：搭配平台外汇接口，获取CHF兑美元、人民币的实时汇率，在前端展示层完成货币换算，同时标注币种。接口调用方式和股票行情接口风格统一，学习和适配成本极低，能完美解决多币种资产展示混乱的问题。&lt;/p&gt;

&lt;h2&gt;
  
  
  八、总结
&lt;/h2&gt;

&lt;p&gt;整体体验下来，用 iTick 接入瑞士股市行情，最大的优势就是&lt;strong&gt;统一规范、低学习成本、稳定性强&lt;/strong&gt;。不用适配不同市场的接口规则，一套代码可以打通全球主流股市、汇市、加密货币数据，极大减少了重复开发工作量。&lt;/p&gt;

&lt;p&gt;对于个人开发者做全球资产看板、小型量化复盘、跨境资产监控，这套方案完全够用，免费额度足以支撑日常开发和使用，不用纠结昂贵的专业付费接口。&lt;/p&gt;

&lt;p&gt;后续我会继续接入德股、英股等欧洲市场数据，后续会持续更新实操踩坑笔记，有需要的朋友可以参考～&lt;/p&gt;

&lt;p&gt;GitHub：&lt;a href="https://github.com/itick-org/python-sdk" rel="noopener noreferrer"&gt;https://github.com/itick-org/python-sdk&lt;/a&gt;\&lt;br&gt;
参考文档：&lt;a href="https://docs.itick.org/sdk/python-sdk/" rel="noopener noreferrer"&gt;https://docs.itick.org/sdk/python-sdk/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>Real-Time Data APIs for AI Trading: A 2026 Developer’s Guide</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Sun, 28 Jun 2026 14:40:57 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/real-time-data-apis-for-ai-trading-a-2026-developers-guide-6m6</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/real-time-data-apis-for-ai-trading-a-2026-developers-guide-6m6</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;What's the biggest difference between doing financial AI development in 2026 compared to three years ago?&lt;/p&gt;

&lt;p&gt;It's not that models got stronger—though LLMs have indeed improved significantly. &lt;strong&gt;The real difference is that data is finally no longer the overlooked bottleneck.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;In the past, when we built quantitative strategies or AI research tools, 80% of our effort went into data cleaning, interface adaptation, and field alignment. Only 20% was left for the strategy itself. Things are changing now, but only if you choose the right data infrastructure.&lt;/p&gt;

&lt;p&gt;No fluff today—I'll walk you through 3 real development scenarios I encountered in 2026, explaining exactly how critical real-time data APIs really are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenario 1: AI Research Assistant – Goodbye to "Hallucinated Stock Prices"
&lt;/h2&gt;

&lt;p&gt;One of the hottest directions this year is integrating financial data into AI assistants. The principle is straightforward: enable LLMs to call real-time market APIs when answering investment questions, instead of relying on "outdated memories" from training data.&lt;/p&gt;

&lt;p&gt;But there's a catch: &lt;strong&gt;The user experience of your AI assistant depends entirely on the response speed of your data API.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine this conversation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;User: "How is Apple's stock performing today?"&lt;/p&gt;

&lt;p&gt;AI: (Calls API → Waits 300ms → Gets data → Generates response) "Apple Inc. closed at $225.21 today..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;300ms doesn't sound like much, right? But in a conversational context, users will noticeably feel the lag. If every question requires waiting, the experience falls apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution: Use WebSocket for data prefetching and cache the latest market data locally.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;iTick's WebSocket interface has latency in the 5-50 millisecond range. Once subscribed, data streams continuously, and the AI assistant reads from the cache when generating answers—nearly instant response.&lt;/p&gt;

&lt;p&gt;Here's what the core code looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;websocket&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;WS_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wss://api.itick.org/stock&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;API_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Local cache
&lt;/span&gt;&lt;span class="n"&gt;latest_quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;market_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;market_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;latest_quotes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;market_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ld&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;market_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;# Cache updates with new data; AI assistant can read anytime
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Subscribe to monitored symbols
&lt;/span&gt;    &lt;span class="n"&gt;subscribe_msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;symbols&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOGL$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TSLA$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscribe_msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;WebSocketApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WS_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                            &lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                            &lt;span class="n"&gt;on_open&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;on_open&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_forever&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the AI assistant retrieves data directly from &lt;code&gt;latest_quotes&lt;/code&gt; when answering—zero latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This scenario taught me: Real-time data API value isn't just about "speed"—it's about transforming user experience from "functional" to "delightful".&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenario 2: Quantitative Strategy Signal Triggering – Miss One Second, Miss 100 Million
&lt;/h2&gt;

&lt;p&gt;Let me share a mistake I made.&lt;/p&gt;

&lt;p&gt;Last year, I built a dual moving average strategy using a free API—HTTP polling every 5 seconds. Backtests looked beautiful: 30%+ annualized returns. Live trading? Average signal delay: 300ms, sometimes exceeding 1 second.&lt;/p&gt;

&lt;p&gt;What happened? When the golden cross signal fired, the price had already moved 0.5%. The strategy went from "30% annualized" to "-5% annualized"—slippage wiped out all profits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson is simple: For strategies relying on real-time signals, data latency directly determines success or failure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Later, I switched to WebSocket with iTick's millisecond-level push. Same dual moving average strategy, but signal timing was completely different.&lt;/p&gt;

&lt;p&gt;REST approach for fetching historical K-lines and calculating indicators:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.itick.org/stock/kline?region=US&amp;amp;code=AAPL&amp;amp;kType=5&amp;amp;limit=100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;klines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="c1"&gt;# Calculate moving averages, detect crosses...
&lt;/span&gt;    &lt;span class="c1"&gt;# But this is "historical data" — by the time you finish calculations, price has already moved
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WebSocket approach for real-time tick subscription with signal judgment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;tick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c1"&gt;# Real-time tick contains latest price (ld), volume (v), timestamp (t)
&lt;/span&gt;        &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ld&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Update moving average calculations in real-time; trigger signal immediately upon cross
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;check_cross_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;execute_trade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Latency dropped from hundreds of milliseconds to tens of milliseconds. The strategy finally performed close to backtest results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson: Not all APIs suit quantitative data sourcing. REST is for historical queries and analysis; WebSocket is the right solution for live trading.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenario 3: Multi-Asset Monitoring Dashboard – Don't Let Data Sources Crush Your System
&lt;/h2&gt;

&lt;p&gt;This year, I got a requirement: Build a real-time monitoring dashboard covering US stocks, Hong Kong stocks, A-shares, and forex, displaying price, daily change %, and volume for 30+ symbols.&lt;/p&gt;

&lt;p&gt;At first, I thought simplistically—one HTTP request per symbol, polling. Easy.&lt;/p&gt;

&lt;p&gt;Result: 30 symbols × 1 request per second = 30 requests/second. The server didn't crash, but I got rate-limited first.&lt;/p&gt;

&lt;p&gt;Then I switched strategies: &lt;strong&gt;Combine batch REST API + WebSocket.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use batch REST for initial snapshot, WebSocket for real-time updates on all symbols.&lt;/p&gt;

&lt;p&gt;iTick's batch API lets you fetch multiple symbols in one request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_batch_quotes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;codes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.itick.org/stock/quotes?region=US&amp;amp;codes=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;codes&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;# Fetch latest quotes for 30 stocks in one call
&lt;/span&gt;&lt;span class="n"&gt;symbols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOGL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TSLA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MSFT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AMZN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]&lt;/span&gt;
&lt;span class="n"&gt;quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_batch_quotes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ld&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The batch API solved the initial loading problem. Subsequent updates come via WebSocket's unified push—one connection handles everything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Subscribe to all monitored symbols in one go
&lt;/span&gt;    &lt;span class="n"&gt;subscribe_msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;symbols&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOGL$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;00700$HK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;600519$SH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c1"&gt;# Cross-market mixed subscription with unified data structure
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscribe_msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Final result: One WebSocket connection + one batch REST request handles 30+ symbols in real-time monitoring. System load went from "could crash anytime" to "rock solid".&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In 2026, real-time data APIs for financial AI development aren't "optional extras"—they're &lt;strong&gt;essential infrastructure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These three scenarios boil down to one principle: &lt;strong&gt;The real-time nature, stability, and consistency of data determine whether your AI application flies or crawls.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;REST APIs are for historical data, analysis, and snapshots. WebSocket is for scenarios needing millisecond-level responsiveness. Both together build a reliable financial AI system.&lt;/p&gt;

&lt;p&gt;If you're working on similar projects, invest time in clarifying your data layer. Once the foundation is solid, you'll know exactly what to build on top.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://itick.org/zh-cn/products/ai-financial-agent" rel="noopener noreferrer"&gt;Experience Demo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/itick-org" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>2026金融AI开发者指南：3个场景告诉你实时数据API有多重要</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Sun, 28 Jun 2026 14:34:41 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/2026jin-rong-aikai-fa-zhe-zhi-nan-3ge-chang-jing-gao-su-ni-shi-shi-shu-ju-apiyou-duo-zhong-yao-111h</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/2026jin-rong-aikai-fa-zhe-zhi-nan-3ge-chang-jing-gao-su-ni-shi-shi-shu-ju-apiyou-duo-zhong-yao-111h</guid>
      <description>&lt;h2&gt;
  
  
  引言
&lt;/h2&gt;

&lt;p&gt;2026年做金融AI开发，跟三年前最大的区别是什么？&lt;/p&gt;

&lt;p&gt;不是模型变强了——虽然LLM确实进步不少。&lt;strong&gt;真正的区别是，数据终于不再是那个被忽略的瓶颈了。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;过去我们做量化策略或AI投研工具，80%的精力花在数据清洗、接口适配、字段对齐上。剩下20%才是策略本身。现在情况在变，但前提是你得选对数据基础设施。&lt;/p&gt;

&lt;p&gt;今天不聊虚的，直接上3个我在2026年真实遇到的开发场景，聊聊实时数据API到底有多重要&lt;/p&gt;

&lt;h2&gt;
  
  
  场景一：AI投研助手，告别“幻觉股价”
&lt;/h2&gt;

&lt;p&gt;今年最火的方向之一，就是给AI助手接入金融数据。原理不复杂：让LLM在回答投资相关问题时，能调用实时行情API获取真实数据，而不是靠训练数据里的“过期记忆”瞎编。&lt;/p&gt;

&lt;p&gt;但这里有个坑：&lt;strong&gt;AI助手的回答体验，完全取决于数据接口的响应速度。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;想象一下这个对话：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;用户：“苹果今天走势怎么样？”&lt;/p&gt;

&lt;p&gt;AI：（调用API→等待300ms→返回数据→生成回答）“Apple Inc.今日收盘$225.21...”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;300ms，听起来不多对吧？但在对话场景里，用户能明显感觉到“卡了一下”。如果每个问题都要等，体验直接崩。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;解决方案：用WebSocket做数据预取，把最新行情缓存在本地。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;iTick的WebSocket接口延迟在5~50毫秒级别，订阅后数据会持续推送过来，AI助手回答时直接读缓存，几乎是瞬时响应。&lt;/p&gt;

&lt;p&gt;核心代码长这样：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;websocket&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;WS_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wss://api.itick.org/stock&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;API_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# 本地缓存
&lt;/span&gt;&lt;span class="n"&gt;latest_quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;market_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;market_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;latest_quotes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;market_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ld&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;market_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;# 有新数据就更新缓存，AI助手随时可读
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 订阅需要监控的标的
&lt;/span&gt;    &lt;span class="n"&gt;subscribe_msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;symbols&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOGL$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TSLA$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscribe_msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;WebSocketApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WS_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                            &lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                            &lt;span class="n"&gt;on_open&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;on_open&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_forever&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这样AI助手每次回答时，直接从&lt;code&gt;latest_quotes&lt;/code&gt;里取数据，零等待。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;这个场景给我的启发是：实时数据API的价值不只是“快”，而是让AI应用的用户体验从“能用”变成“好用”。&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  场景二：量化策略的信号触发，错过一秒就是错过一个亿
&lt;/h2&gt;

&lt;p&gt;说一个我踩过的坑。&lt;/p&gt;

&lt;p&gt;去年写一个双均线策略，用的某免费API做数据源，HTTP轮询，每5秒拉一次。回测漂亮得很，年化30%+。一上实盘，信号延迟平均300ms，极端情况超过1秒。&lt;/p&gt;

&lt;p&gt;结果呢？金叉信号出来的时候，价格已经跑了0.5%。策略从“年化30%”变成了“年化-5%”——滑点吃掉了所有收益。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;教训很简单：依赖实时信号的策略，数据延迟直接决定策略生死。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;后来切到WebSocket方案，用的是iTick的毫秒级推送。同样是双均线，信号触发的及时性完全不一样。&lt;/p&gt;

&lt;p&gt;REST方式拿历史K线做指标计算：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.itick.org/stock/kline?region=US&amp;amp;code=AAPL&amp;amp;kType=5&amp;amp;limit=100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;klines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="c1"&gt;# 计算均线、判断金叉死叉...
&lt;/span&gt;    &lt;span class="c1"&gt;# 但这是"过去的数据"，等你算完，价格可能已经变了
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WebSocket方式实时订阅tick数据，逐笔判断：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;tick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c1"&gt;# 实时tick数据包含最新价ld、成交量v、时间戳t
&lt;/span&gt;        &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ld&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# 实时更新均线计算，一旦金叉立刻触发信号
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;check_cross_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;execute_trade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;延迟从几百毫秒降到几十毫秒。策略终于跑出了和回测接近的结果。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;这个场景的教训：不是所有API都适合作量化数据源。REST适合查历史、做分析，WebSocket才是实盘交易的正解。&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  场景三：多资产监控面板，别让数据源把系统拖垮
&lt;/h2&gt;

&lt;p&gt;今年接了一个需求：做一个覆盖美股、港股、A股、外汇的多资产监控面板，要求实时展示30+标的的价格、涨跌幅、成交量。&lt;/p&gt;

&lt;p&gt;一开始想得简单——每个标的一个HTTP请求，轮询呗。&lt;/p&gt;

&lt;p&gt;结果：30个标的 × 每秒1次 = 每秒30个请求。服务器没崩，我自己先被限流了。&lt;/p&gt;

&lt;p&gt;后来换了个思路：&lt;strong&gt;用批量接口 + WebSocket组合。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;批量REST接口拿初始快照，WebSocket统一推送所有标的的实时更新。&lt;/p&gt;

&lt;p&gt;iTick的批量接口支持一次请求拿多个标的的数据：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_batch_quotes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;codes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.itick.org/stock/quotes?region=US&amp;amp;codes=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;codes&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;# 一次性获取30只股票的最新报价
&lt;/span&gt;&lt;span class="n"&gt;symbols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOGL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TSLA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MSFT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AMZN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]&lt;/span&gt;  &lt;span class="c1"&gt;# 最多支持批量
&lt;/span&gt;&lt;span class="n"&gt;quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_batch_quotes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ld&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;批量接口解决了初始加载的问题。后续更新靠WebSocket统一推送，一个连接搞定所有标的。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 一次性订阅所有需要监控的标的
&lt;/span&gt;    &lt;span class="n"&gt;subscribe_msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subscribe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;symbols&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOGL$US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;00700$HK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;600519$SH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c1"&gt;# 跨市场混合订阅，统一数据结构
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscribe_msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;最终效果：一个WebSocket连接 + 一次批量REST请求，搞定30+标的的实时监控。系统负载从“随时可能崩”变成“稳如老狗”。&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  结结
&lt;/h2&gt;

&lt;p&gt;2026年做金融AI开发，实时数据API已经不是“选配”而是“标配”。&lt;/p&gt;

&lt;p&gt;三个场景说到底就一句话：&lt;strong&gt;数据的实时性、稳定性、统一性，决定了你的AI应用在天上还是在地上。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;REST API适合查历史、做分析、拿快照。WebSocket适合需要毫秒级响应的实时场景。两者搭配，才能构建一个靠谱的金融AI系统。&lt;/p&gt;

&lt;p&gt;如果你也在做类似的事情，不妨先花点时间把数据层理清楚。基础稳了，上面跑什么策略、做什么AI应用，心里都有底。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://itick.org/zh-cn/products/ai-financial-agent" rel="noopener noreferrer"&gt;体验Demo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/itick-org" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
    <item>
      <title>一个AI智能体，把我从量化系统的脏活累活里捞了出来</title>
      <dc:creator>San Si wu</dc:creator>
      <pubDate>Thu, 25 Jun 2026 14:00:56 +0000</pubDate>
      <link>https://dev.to/san_siwu_f08e7c406830469/ge-aizhi-neng-ti-ba-wo-cong-liang-hua-xi-tong-de-zang-huo-lei-huo-li-lao-liao-chu-lai-1nj7</link>
      <guid>https://dev.to/san_siwu_f08e7c406830469/ge-aizhi-neng-ti-ba-wo-cong-liang-hua-xi-tong-de-zang-huo-lei-huo-li-lao-liao-chu-lai-1nj7</guid>
      <description>&lt;p&gt;凌晨两点十七分，策略又一次在实盘里做出了和回测完全相反的操作。我盯着屏幕上的成交记录，脑子里只有一个念头：这破玩意儿到底哪儿出毛病了。&lt;/p&gt;

&lt;p&gt;查了四个小时。最后发现，不是模型的问题。是那家数据商推送的行情里，有一笔时间戳错了——把下午三点的成交标成了凌晨三点。于是我的 K 线图上多了一根诡异的下影线，于是策略判断支撑位破了，于是它替我果断止损在了最低点。&lt;/p&gt;

&lt;p&gt;那一刻我没有愤怒，只有一种深深的疲惫。这种破事儿，过去三年里我已经处理了不下二十次。每次都以为是最后一次，每次下一个坑都在意想不到的地方等着我。&lt;/p&gt;

&lt;h2&gt;
  
  
  延迟不是买台服务器就能解决的
&lt;/h2&gt;

&lt;p&gt;刚入行的时候我天真地以为，只要把服务器放在交易所机房旁边，延迟就不是问题。&lt;/p&gt;

&lt;p&gt;后来我才知道，网线短只是第一步。JSON 解析比 msgpack 慢多少？数据从网卡到你的策略代码里，内存拷了几次？多线程之间的锁竞争吃掉多少微秒？还有那个最隐蔽的问题——你记录的时间戳到底是软件打的还是硬件打的？如果时间标记本身就有几十毫秒的抖动，你复盘的时候连订单的真实顺序都还原不了，还谈什么策略优化。&lt;/p&gt;

&lt;p&gt;这些问题一个一个改过来，半年就没了。而且改完之后你发现，自己的代码库里有一半模块跟策略逻辑毫无关系——全是数据接入、序列化、内存管理这些“管道活”。我一个做策略研究的朋友有一次跟我说：“我感觉我现在是个水管工，每天修管道，已经三个月没碰过因子了。”&lt;/p&gt;

&lt;p&gt;这话我记了很久。&lt;/p&gt;

&lt;p&gt;后来知道有些团队选择了现成的数据代理服务，把多交易所的实时流预先聚合、清洗、打好硬件时间戳再统一推出来，策略代码直接消费干净的行情。一开始我觉得这不够硬核，后来想明白了——水管工和策略研究员，本来就不是同一个工种。有些活儿确实没必要自己干。&lt;/p&gt;

&lt;h2&gt;
  
  
  清洗数据这事儿，一干就停不下来
&lt;/h2&gt;

&lt;p&gt;接入了一个数据源，怕丢包。接入了三个，以为高枕无忧了，结果发现三个源画出来的同一根 K 线有三种形态。有的复权方式不同，有的把场外交易混进去了，有的时间戳差了半秒导致价格对不齐。&lt;/p&gt;

&lt;p&gt;于是你开始写清洗脚本。先对齐时间戳。再写投票逻辑，三个源对同一个 tick 报价不一致的时候取中位数。然后你发现固定阈值过滤异常值在波动大的时候根本不能用——波动率上来了，正常的行情波动都被当成了“胖手指”给滤掉了。你只好改成自适应阈值，又加上订单簿深度来二次确认。&lt;/p&gt;

&lt;p&gt;等你把这一套弄完，半个月过去了，策略模型一行没改。&lt;/p&gt;

&lt;p&gt;而且最讽刺的是，下次换一个交易所或者加一个数据源，这套清洗脚本又得大改。你就像一个永远在补窟窿的泥瓦匠，墙面一直在渗水，但你永远找不到所有裂缝。&lt;/p&gt;

&lt;p&gt;这也是后来我开始关注那些内置了数据清洗流水线的平台的原因。不是我变懒了，是我终于意识到，一个需要长期维护的生产系统，有些能力应该长在基础设施层，而不是每个团队各写一套脆弱的清洗脚本。&lt;/p&gt;

&lt;h2&gt;
  
  
  假突破比真突破更让人害怕
&lt;/h2&gt;

&lt;p&gt;震荡行情里，均线金叉死叉谁都会写。真正吓人的是那种瞬间拉上去 20% 又迅速砸回来的行情。你的策略追不追？&lt;/p&gt;

&lt;p&gt;追，可能是接盘。不追，可能错过真行情。&lt;/p&gt;

&lt;p&gt;后来我养成了一个习惯：看价格的同时一定看订单簿。挂单厚度在拉升的时候是增加还是减少？主动买入的成交量占比有没有同步放大？大单是在跟风还是在逆向吃单？这些微观结构的信息，往往比价格本身更能告诉你这波行情“有没有诚意”。&lt;/p&gt;

&lt;p&gt;问题是，每次都要手动拉几个 API 然后自己拼图，太慢了。等你分析完，行情早跑完了。&lt;/p&gt;

&lt;p&gt;我见过一些 AI 代理产品现在能做这件事了——你直接问它“这波拉升健康吗”，它能在一两秒内把订单流、成交分布和近期新闻情绪聚合起来，给你一个多因子支撑的判断。这不是什么玄学，就是把原来需要手动做的事情自动化了。我自己试用过类似功能后，最大的感受不是它多聪明，而是省时间。省下来的时间可以去想更重要的东西，比如仓位管理和风险对冲。&lt;/p&gt;

&lt;h2&gt;
  
  
  警报响多了，等于没装警报
&lt;/h2&gt;

&lt;p&gt;我见过一个团队的预警系统，一个上午发了八十七条通知。八十七条。用户早就把推送关了，真正破位的时候，谁也收不到。&lt;/p&gt;

&lt;p&gt;这个问题我反思了很久。我们做预警的时候太怕漏报了，所以把阈值设得很敏感。结果漏报确实少了，误报多到让整个系统变成了噪音发生器。&lt;/p&gt;

&lt;p&gt;后来我调整了逻辑：单一条件触发不报警，必须价格破位 + 成交量异常 + 持续几个时间窗口，三个条件同时满足才推。非交易时段的小波动，攒到早晚报里统一说。同一个标的短时间内反复震荡，折叠成一条摘要，别让通知栏刷屏。&lt;/p&gt;

&lt;p&gt;这个逻辑不复杂，但实施起来挺繁琐的。不同的品种、不同的市场状态，阈值都不一样，需要持续调参。如果有一个自带多维确认和异常检测算法的预警模块，能省掉大量磨参数的功夫。我现在更倾向于用现成的成熟方案，把精力留给策略本身。&lt;/p&gt;

&lt;h2&gt;
  
  
  大模型读财报可以，但别让它瞎编
&lt;/h2&gt;

&lt;p&gt;LLM 出来之后，我们尝试过让它解读财报和新闻。效果确实惊艳，但你永远不知道它什么时候会自信满满地编一个数字。&lt;/p&gt;

&lt;p&gt;有一次它告诉我一家公司上一季度的营收增长率是 12%，我差点就用这个数字做估值模型了。还好留了个心眼去翻了原始财报——实际是 8%。那个 12%，是它“推测”出来的。&lt;/p&gt;

&lt;p&gt;从那以后我给团队定了个铁律：所有关键数字必须能追溯到原文出处。用 RAG 把回答锚定在原报告的具体段落，模型只负责翻译和组织语言，不负责创造。数字提取加一层规则校验，和表格数据对不上的直接打回。&lt;/p&gt;

&lt;p&gt;这个设计思路后来我看到有些金融 AI 产品也采用了，说明业内对这个问题的认知在趋同。毕竟在金融领域，一个被随意生成出来的数字，不是 bug，是事故。&lt;/p&gt;

&lt;h2&gt;
  
  
  策略不解释自己，我就不敢用
&lt;/h2&gt;

&lt;p&gt;我自己也有这个心理障碍：一个黑盒策略赚了钱，我会想这是运气还是真的有 alpha；亏了钱，我连怎么调都不知道。&lt;/p&gt;

&lt;p&gt;所以后来我要求所有策略输出必须附带归因。触发这次操作的核心因子是什么，各自的权重多少。最好还能做反事实分析——“如果这个参数调高一点，历史回撤会怎么变”。这让我觉得自己在跟策略对话，而不是在向一个黑盒子祈祷。&lt;/p&gt;

&lt;p&gt;说到底，投资的最终责任在我自己身上。系统只是辅助，不能替我做决策。把过程白盒化，不是为了好看，是为了让我自己敢用、敢调、敢负责。&lt;/p&gt;

&lt;h2&gt;
  
  
  崩溃总是在你最自信的时候发生
&lt;/h2&gt;

&lt;p&gt;我维护过一套系统，平稳运行了快一年。我一度觉得它坚不可摧。然后某天晚上，市场突然剧烈波动，流量瞬间飙了八倍，数据库连接池被打满，风控线程因为抢不到锁，没有发出止损指令。&lt;/p&gt;

&lt;p&gt;那次之后我学到的教训是：永远假设系统会崩溃，然后提前设计好降级路径。CPU 过 85% 关掉哪些非核心功能，内存扛不住了怎么卸载数据，数据库挂了怎么切本地缓存。然后反复演练，用混沌工程的手段随机注入故障，看系统能不能守住“止损指令必须执行”这条底线。&lt;/p&gt;

&lt;p&gt;这些东西说起来都是血泪换来的。自己从头搭建一套容灾和压测体系代价太大了，现在一些面向交易的基础设施平台已经把熔断和降级机制做到了架构层。但我还是会定期自己做压测，因为你对一个系统越信任，就越应该定期折磨它。&lt;/p&gt;

&lt;h2&gt;
  
  
  最后想说点什么
&lt;/h2&gt;

&lt;p&gt;写到这里回头看，发现上面这些内容几乎没有一条和策略的数学表达有关。全是在和数据、管道、延迟、清洗、预警、容灾这些东西死磕。&lt;/p&gt;

&lt;p&gt;但这可能恰恰是量化交易最真实的一面。那些光鲜的回测曲线背后，是无数个处理边界情况的 if-else，是凌晨两三点的紧急修复，是一遍遍确认“这次的数据到底干不干净”。&lt;/p&gt;

&lt;p&gt;有一段时间我特别执着于什么都要自己写，觉得用别人现成的方案等于不纯粹。现在想法变了。市场在变，策略要迭代，因子要挖掘，这些才是我的核心竞争力。至于数据管道、清洗流水线、预警系统这些基础设施，如果有成熟方案能帮我扛起来，我一定选它。&lt;/p&gt;

&lt;p&gt;最近注意到 iTick 做的 &lt;a href="https://itick.org/products/ai-financial-agent" rel="noopener noreferrer"&gt;AI 金融智能体&lt;/a&gt;，说实话第一眼看到的时候我心里想的是“你们怎么现在才做这个”。它把多交易所实时数据、清洗、自然语言分析、风控和策略辅助整合在一起，定位就是给专业交易员和量化开发者用的基础设施。它不是那种“一键帮你赚大钱”的玩意儿，它就是想把前面我说的那些脏活累活扛下来。&lt;/p&gt;

&lt;p&gt;这个定位我挺认可的。因为我知道，在这个市场里，能让你持续跑下去的系统，才是最好的系统。而让系统持续跑下去的那些东西，往往最不起眼，最没人愿意写，最容易被忽略——直到它在凌晨两点给你致命一击。&lt;/p&gt;

&lt;p&gt;如果你也正在经历我踩过的这些坑，不妨去看看。哪怕最后你还是选择全部自研，看看别人的架构思路也没坏处。至少你知道，在这些问题上，你不是一个人在崩溃。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
