<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>我的小米粥分你一半</title>
  
  
  <link href="https://corvo.myseu.cn/atom.xml" rel="self"/>
  
  <link href="https://corvo.myseu.cn/"/>
  <updated>2026-05-06T13:29:31.723Z</updated>
  <id>https://corvo.myseu.cn/</id>
  
  <author>
    <name>corvofeng</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>记一次诡异的 K3s DNS 报错排查：当 K3s 遇上飞牛 NAS</title>
    <link href="https://corvo.myseu.cn/2026/03/31/2026-03-31-%E4%B8%80%E6%AC%A1%E8%AF%A1%E5%BC%82%E7%9A%84K3s%E4%B8%ADDNS%E6%8A%A5%E9%94%99%E6%8E%92%E6%9F%A5/"/>
    <id>https://corvo.myseu.cn/2026/03/31/2026-03-31-%E4%B8%80%E6%AC%A1%E8%AF%A1%E5%BC%82%E7%9A%84K3s%E4%B8%ADDNS%E6%8A%A5%E9%94%99%E6%8E%92%E6%9F%A5/</id>
    <published>2026-03-31T23:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>在 Kubernetes 的日常排障中，网络问题往往最耗时间。这次我在飞牛 NAS 上用 Docker 跑了一个 K3s（单节点 master），准备给 CI 跑 <a href="https://github.com/dag-andersen/argocd-diff-preview">argocd-diff-preview</a>。结果 Argo CD 部署完成后一直报 DNS 解析失败，日志里看起来像“在 Pod 里用 localhost 查 DNS”，非常反直觉。</p><p>最后定位到的根因也很“隐形”：宿主机目录的 Default ACL 影响了 containerd 为 Pod 生成并挂载的 resolv.conf，导致非 root 容器无法读取 <code>/etc/resolv.conf</code>，从而触发了 libc resolver 的兜底逻辑，盲目向 <code>127.0.0.1/[::1]:53</code> 发起查询。</p><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>我本地用 Argo CD 管理和发布应用。这次想引入 <a href="https://github.com/dag-andersen/argocd-diff-preview">argocd-diff-preview</a> 做 CI 检查，把 diff 结果作为 GitHub 评论回写到 PR。</p><p>效果大概是这样：</p><p><img src="https://rawforcorvofeng.cn/blog/2026/03/31/1774962665949.png" alt="1774962665949.png"></p><p>为了跑这类任务，我需要一个轻量的 Kubernetes 集群。正好手头有飞牛 NAS，就在上面用 Docker 起了一个 K3s server（禁用 <code>servicelb</code>），docker-compose 如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">&quot;3.8&quot;</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">argocd-k3s:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">k3s:v1.35.1-k3s1</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">argocd-k3s</span></span><br><span class="line">    <span class="attr">privileged:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">network_mode:</span> <span class="string">bridge</span>  <span class="comment"># 防止本机的 Docker 网络的 DNS 干扰</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;9444:6443&quot;</span></span><br><span class="line">    <span class="attr">command:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;server&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--prefer-bundled-bin&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--disable=servicelb&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--node-name=argocd-k3s&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--kube-apiserver-arg=event-ttl=10m&quot;</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">/vol1/1000/K3sData/argocd-k3s/data:/var/lib/rancher/k3s</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">/dev:/dev:ro</span></span><br></pre></td></tr></table></figure><p>然后在 CI 里执行 <code>argocd-diff-preview</code> 时就开始报错：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">argocd-diff-preview  \</span><br><span class="line">    --create-cluster=False --keep-cluster-alive  \</span><br><span class="line">    -d  \</span><br><span class="line">    --argocd-chart-url <span class="variable">$&#123;chart_url&#125;</span> \</span><br><span class="line">    --repo <span class="variable">$&#123;repo&#125;</span> \</span><br><span class="line">    --target-branch <span class="variable">$&#123;env.CHANGE_BRANCH&#125;</span> \</span><br><span class="line">    --argocd-chart-name argocd-apps</span><br><span class="line"></span><br><span class="line">Tue, 31 Mar 2026 12:42:20 UTC DBG AppsetGenerateWithRetry attempt 1/5 to Argo CD...</span><br><span class="line">Tue, 31 Mar 2026 12:42:21 UTC DBG Waiting 1s before next appset generate attempt (2/5)...</span><br><span class="line">Tue, 31 Mar 2026 12:42:21 UTC WRN Appset generate attempt 1/5 failed. error=<span class="string">&quot;failed to run argocd appset generate: argocd command failed: &#123;\&quot;level\&quot;:\&quot;fatal\&quot;,\&quot;msg\&quot;:\&quot;rpc error: code = Internal desc = unable to resolve git revision : failed to list refs: dial tcp: lookup argocd-redis on [::1]:53: read udp [::1]:59984-\\u003e[::1]:53: read: connection refused\&quot;,\&quot;time\&quot;:\&quot;2026-03-31T12:42:21Z\&quot;&#125;\n: exit status 20&quot;</span></span><br></pre></td></tr></table></figure><h2 id="现象：Pod-里用-1-53-查-DNS"><a href="#现象：Pod-里用-1-53-查-DNS" class="headerlink" title="现象：Pod 里用 [::1]:53 查 DNS"></a>现象：Pod 里用 [::1]:53 查 DNS</h2><p>Argo CD 无法正常同步应用。查看 <code>argocd-server</code> 日志，发现大量类似报错：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Failed to resync revoked tokens... dial tcp: lookup argocd-redis on [::1]:53: read udp [::1]:34952-&gt;[::1]:53: read: connection refused</span><br></pre></td></tr></table></figure><p>第一眼看到这个日志，我的反应是：为什么 Pod 内部会用 IPv6 的本地环回地址（<code>[::1]</code>）去查 DNS？</p><p>按常规思路我先检查 CoreDNS，但 CoreDNS 运行完全正常。这就更怪了：<code>dnsPolicy: ClusterFirst</code> 的 Pod，理论上应该把查询发给 CoreDNS（例如 <code>10.43.0.10</code>），而不是对着本地 <code>53</code> 端口重试。</p><h2 id="排查：从-etc-resolv-conf-入手"><a href="#排查：从-etc-resolv-conf-入手" class="headerlink" title="排查：从 /etc/resolv.conf 入手"></a>排查：从 <code>/etc/resolv.conf</code> 入手</h2><p>既然外部看不出问题，就直接进入容器确认 DNS 配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubectl -n argocd <span class="built_in">exec</span> -ti argocd-server-fbbdf5d4d-c8z5q -- /bin/bash</span><br></pre></td></tr></table></figure><p>然后查看 <code>/etc/resolv.conf</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">argocd@argocd-server:~$ <span class="built_in">cat</span> /etc/resolv.conf</span><br><span class="line"><span class="built_in">cat</span>: /etc/resolv.conf: Permission denied (os error 13)</span><br></pre></td></tr></table></figure><p>到这里基本就能解释日志了：应用进程读不到 <code>/etc/resolv.conf</code>，就拿不到 nameserver 配置。</p><p>在这种情况下，libc resolver 会走兜底逻辑，直接尝试向本地 <code>localhost</code>（<code>127.0.0.1</code> 和 <code>[::1]</code>）发 DNS 查询；如果本地没有 DNS 服务监听 <code>53</code> 端口，就会出现 <code>connection refused</code>。</p><p>所以这并不是 IPv6 本身的问题，而是容器“看不见”正确的 nameserver。</p><h2 id="根因：文件权限末尾的-“-”（ACL）"><a href="#根因：文件权限末尾的-“-”（ACL）" class="headerlink" title="根因：文件权限末尾的 “+”（ACL）"></a>根因：文件权限末尾的 “+”（ACL）</h2><p>继续用 <code>ls -l</code> 看权限：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">argocd@argocd-server:~$ <span class="built_in">ls</span> -alh /etc/resolv.conf </span><br><span class="line">-rw-r-----+ 1 root root 102 Mar 31 11:56 /etc/resolv.conf</span><br></pre></td></tr></table></figure><p>我把这里的内容帖给 AI 之后, 它就提到了 ACL 问题：</p><p>注意权限末尾的 <code>+</code>：这表示该文件启用了 ACL（Access Control List）。即使基础权限看起来没问题，ACL 也可能额外收紧“其他用户（other）”的权限。由于 Argo CD 默认以非 root 用户（例如 UID 999）运行，它就会被挡在门外。</p><p><code>/etc/resolv.conf</code> 不是镜像里的文件，而是运行时挂载进来的。为了确认它在宿主机上对应哪个文件，我回到宿主机用 <code>crictl inspect</code> 查了容器挂载信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">~ <span class="comment"># crictl ps  # 找到 argocd-server 容器的 ID</span></span><br><span class="line">CONTAINER           IMAGE               CREATED             STATE               NAME                     ATTEMPT             POD ID              POD                                       NAMESPACE</span><br><span class="line">c2722b3817277       86219ff1fefea       2 seconds ago       Running             argocd-server                      3                   d32169958ed68       argocd-server-fbbdf5d4d-tjsnf                       argocd</span><br><span class="line"></span><br><span class="line">~ <span class="comment"># crictl inspect &lt;container_id&gt;  # 查看 /etc/resolv.conf 的真实 source</span></span><br><span class="line"><span class="comment"># &#123;</span></span><br><span class="line"><span class="comment">#   &quot;destination&quot;: &quot;/etc/resolv.conf&quot;,</span></span><br><span class="line"><span class="comment">#   &quot;options&quot;: [</span></span><br><span class="line"><span class="comment">#     &quot;rbind&quot;,</span></span><br><span class="line"><span class="comment">#     &quot;rprivate&quot;,</span></span><br><span class="line"><span class="comment">#     &quot;ro&quot;</span></span><br><span class="line"><span class="comment">#   ],</span></span><br><span class="line"><span class="comment">#   &quot;source&quot;: &quot;/var/lib/rancher/k3s/agent/containerd/io.containerd.grpc.v1.cri/sandboxes/fd2373cfd801e2f95267286af155df3ca0cd912563bc9a668cc5e1b3a4956d3e/resolv.conf&quot;,</span></span><br><span class="line"><span class="comment">#   &quot;type&quot;: &quot;bind&quot;</span></span><br><span class="line"><span class="comment"># &#125;</span></span><br><span class="line"></span><br><span class="line">~ <span class="comment"># cat /var/lib/rancher/k3s/agent/containerd/io.containerd.grpc.v1.cri/sandboxes/fd2373cfd801e2f95267286af155df3ca0cd912563bc9a668cc5e1b3a4956d3e/resolv.conf</span></span><br><span class="line">search argocd.svc.cluster.local svc.cluster.local cluster.local</span><br><span class="line">nameserver 10.43.0.10</span><br><span class="line">options ndots:5</span><br></pre></td></tr></table></figure><p>由于我的 K3s 数据目录在 <code>/vol1/1000/K3sData</code>（NAS 挂载盘）上，顺着这个路径找过去，再用 <code>getfacl</code> 查看 ACL：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">root@Host:~# getfacl /vol1/.../sandboxes/.../resolv.conf</span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rw-</span><br><span class="line">group::--x</span><br><span class="line">other::---  &lt;--- 真凶在这里！</span><br></pre></td></tr></table></figure><p>真相大白：<code>/vol1</code> 这类 NAS 挂载盘默认可能带有严格的 Default ACL。当 containerd 在这个目录下为 Pod 动态生成 <code>resolv.conf</code> 时，会继承父目录的 Default ACL，把 <code>other</code> 权限收紧为 <code>---</code>。Pod 里的非 root 进程就无法读取 <code>/etc/resolv.conf</code>，从而触发“查 localhost DNS”的兜底行为。</p><h2 id="解决方案：清理-Default-ACL-继承规则"><a href="#解决方案：清理-Default-ACL-继承规则" class="headerlink" title="解决方案：清理 Default ACL 继承规则"></a>解决方案：清理 Default ACL 继承规则</h2><p>我最终没有改 K3s 配置，也没有去关闭整块盘的 ACL（这通常会影响 Samba 等服务）。更稳妥的做法是：只清理 K3s&#x2F;containerd 工作目录上导致继承的 Default ACL 规则。</p><p>在宿主机执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 清除沙盒目录上导致问题的 Default ACL 遗传规则</span></span><br><span class="line"><span class="built_in">sudo</span> setfacl -k /vol1/1000/K3sData/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. (可选) 给当前存在的目录批量重置基础权限</span></span><br><span class="line"><span class="built_in">sudo</span> setfacl -R -b /vol1/1000/K3sData/</span><br></pre></td></tr></table></figure><p>做完后把 Argo CD 的 Pod 删掉让它重建。新的 Pod 启动后，containerd 生成的 <code>resolv.conf</code> 恢复为正常的可读权限；再进入容器执行 <code>cat /etc/resolv.conf</code> 也不再报 <code>Permission denied</code>。至此，Argo CD 立刻恢复正常，应用也能正常 Sync。</p><h3 id="自动持久化：使用-tmpfiles-d-进阶方案"><a href="#自动持久化：使用-tmpfiles-d-进阶方案" class="headerlink" title="自动持久化：使用 tmpfiles.d (进阶方案)"></a>自动持久化：使用 tmpfiles.d (进阶方案)</h3><p>如果你担心 NAS 系统在重启或通过 Web UI 操作后会重新“遗传”错误的 ACL 规则，可以使用 systemd 的 <code>tmpfiles.d</code> 机制。这是一种比 Crontab 脚本更优雅的“声明式”配置。</p><p>在宿主机创建配置文件 <code>/etc/tmpfiles.d/k3s-nas-acl.conf</code>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"># 确保目录及其子目录基础权限为 0755</span><br><span class="line"># 类型  路径                   模式  用户  组    时间  参数</span><br><span class="line">z     /vol1/1000/K3sData/     0755  root  root  -     -</span><br><span class="line"></span><br><span class="line"># 递归强制应用规则：确保 others 可读，且新生成的子项也继承该权限</span><br><span class="line">A+    /vol1/1000/K3sData/     -     -     -     -     other::r-x,default:other::r-x</span><br></pre></td></tr></table></figure><p>配置完成后，可以执行以下命令立即生效（无需重启）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemd-tmpfiles --create /etc/tmpfiles.d/k3s-nas-acl.conf</span><br></pre></td></tr></table></figure><p>系统会扫描该路径，并按照配置自动纠正所有不符合要求的 ACL 项。</p><h2 id="总结与避坑指南"><a href="#总结与避坑指南" class="headerlink" title="总结与避坑指南"></a>总结与避坑指南</h2><ul><li>别被 <code>[::1]:53</code> 误导：Pod 内查 localhost DNS，优先检查是否能读取 <code>/etc/resolv.conf</code>。</li><li>留意非 root 容器：越来越多组件默认非 root 运行，宿主机生成&#x2F;挂载的文件必须保证“other 可读”或至少对应用用户可读。</li><li>小心 NAS 默认 ACL：在 NAS 挂载盘上跑 K3s&#x2F;Docker 时，<code>ls -l</code> 权限末尾的 <code>+</code> 往往是权限问题的信号；遇到诡异现象优先用 <code>getfacl</code> 定位。</li><li>AI 真的太强大了, 问对合适的问题, 能让调试更高效。</li></ul><p>希望这次记录能给你一个更快的排查切入点。</p>]]></content>
    
    
    <summary type="html">在飞牛 NAS 上用 Docker 跑 K3s，部署 Argo CD 后 Pod 解析服务名却去查 [::1]:53。根因是宿主机目录的 Default ACL 影响了 containerd 生成的 resolv.conf，导致非 root 容器读不到 /etc/resolv.conf。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Docker" scheme="https://corvo.myseu.cn/tags/Docker/"/>
    
    <category term="Kubernetes" scheme="https://corvo.myseu.cn/tags/Kubernetes/"/>
    
    <category term="K3s" scheme="https://corvo.myseu.cn/tags/K3s/"/>
    
    <category term="DNS" scheme="https://corvo.myseu.cn/tags/DNS/"/>
    
    <category term="飞牛" scheme="https://corvo.myseu.cn/tags/%E9%A3%9E%E7%89%9B/"/>
    
    <category term="NAS" scheme="https://corvo.myseu.cn/tags/NAS/"/>
    
    <category term="containerd" scheme="https://corvo.myseu.cn/tags/containerd/"/>
    
  </entry>
  
  <entry>
    <title>半自动化交易系统（六）</title>
    <link href="https://corvo.myseu.cn/2026/03/26/2026-03-26-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E5%85%AD)/"/>
    <id>https://corvo.myseu.cn/2026/03/26/2026-03-26-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E5%85%AD)/</id>
    <published>2026-03-26T20:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<hr><p>本文是交易系统系列的第六篇，主要记录近期在期权策略和系统功能上的优化。我把一部分组合功能做了整合，重点是我常用的牛市价差；另外，也把出错订单单独记录下来，方便后续复盘和优化。</p><h2 id="组合订单的实现"><a href="#组合订单的实现" class="headerlink" title="组合订单的实现"></a>组合订单的实现</h2><p>如前文《<a href="https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/">期权策略-变种比例价差</a>》所述，我目前主要做科创50ETF期权的价差策略。单一标的的好处是，页面和流程都能做得更聚焦、更高效。在上一篇《<a href="https://corvo.myseu.cn/2025/12/31/2025-12-31-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%94)/">半自动化交易系统(五)</a>》里，我提到过按月份做持仓管理。每个月的仓位，基本都由单腿期权和比例价差这类组合构成。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767180027632.png" alt="1767180027632.png"></p><p>我发现自己高频会用到价差组合的构建和释放。比如创建一个价差时，每次都要做这三步：</p><ol><li>买入低行权价看涨期权</li><li>卖出高行权价看涨期权</li><li>构建价差组合</li></ol><h3 id="实现细节"><a href="#实现细节" class="headerlink" title="实现细节"></a>实现细节</h3><p>这个过程完全可以自动化，而且能尽量规避短时价格波动。流动性足够好的时候，滑点也能控制在可接受范围内。所以我把这三个步骤整合成了一个独立服务，做成了一个非常简单的组合订单，结构大概如下：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">[</span></span><br><span class="line">  <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;method_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;buy_open_with_executor&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;params&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;code&quot;</span><span class="punctuation">:</span> <span class="string">&quot;10011349.SHO&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;count&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;price&quot;</span><span class="punctuation">:</span> <span class="number">0.0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;wait&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span><span class="punctuation">:</span> <span class="number">30.0</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;status&quot;</span><span class="punctuation">:</span> <span class="string">&quot;completed&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;买入权利仓: 10011349.SHO x 6&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;method_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sell_open_with_executor&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;params&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;code&quot;</span><span class="punctuation">:</span> <span class="string">&quot;10011350.SHO&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;count&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;price&quot;</span><span class="punctuation">:</span> <span class="number">0.0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;wait&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span><span class="punctuation">:</span> <span class="number">30.0</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;status&quot;</span><span class="punctuation">:</span> <span class="string">&quot;completed&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;卖出义务仓: 10011350.SHO x 6&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;method_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;make_option_combination&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;params&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;combination_type&quot;</span><span class="punctuation">:</span> <span class="number">50</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;contracts&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;10011349.SHO&quot;</span><span class="punctuation">:</span> <span class="number">48</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;10011350.SHO&quot;</span><span class="punctuation">:</span> <span class="number">49</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;quantity&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;strategy_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;认购牛市价差 1.4-1.45&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;status&quot;</span><span class="punctuation">:</span> <span class="string">&quot;completed&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;创建组合: 认购牛市价差 1.4-1.45&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure><p>这类指令会被放进消息队列，由单独服务消费，再直接和交易系统交互。我这里为了尽快成交，直接挂对手方一档。科创50ETF期权流动性本身也不错，通常几秒内就能完成交易，实际滑点非常小，执行效率和质量都比较高。</p><p>注意：这里用的是对手方一档，也就是优先保证立刻成交的价格。如果合约流动性不好，这样做风险会很高，利润空间也会被明显压缩。</p><h3 id="组合订单的管理"><a href="#组合订单的管理" class="headerlink" title="组合订单的管理"></a>组合订单的管理</h3><p>现在 AI 写代码确实很好用。需求说清楚后，页面雏形很快就能出来；我自己再把前后端对接和细节收一收，基本就可以快速上线。下面是组合订单管理页面的截图：</p><p><img src="https://rawforcorvofeng.cn/blog/2026/03/26/1774533798939.png" alt="1774533798939.png"></p><p>我还加了出错订单的“分步骤重试”能力。卡在哪一步都没关系，人肉检查一下，确认没问题就从下一步继续执行。后面如果再接 AI 做检查，会更省事。甚至当开仓单子很多时，也能靠这种组合订单形式批量处理，operator 在开平仓上的手工工作量会小很多。</p><h3 id="价差移仓"><a href="#价差移仓" class="headerlink" title="价差移仓"></a>价差移仓</h3><p>做完这套组合订单后，我开始更系统地思考一个问题：不同月份之间平移牛市价差，成本到底有多高，以及是否值得移仓。比如我持有的是由虚值看涨构成的牛市价差，如果当月机会已经不大，那把整个组合顺延一个月，盈利概率会不会更好？</p><p>因此我也做了一个图表，持续记录我关注的价差在不同月份的价格，用来评估“为了维持盈利机会，我需要支付多少移仓成本”。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/03/26/1774534300695.png" alt="1774534300695.png"></p><p>只要合约时间价值没有被完全吃掉，移仓成本通常都比较低，大多数情况下在 100 元以内。也就是说，花不超过 100 元，通常就能把一个临近到期的价差组合平移到后一个月，或者换到更低行权价，从而明显提升盈利概率。如果再叠加后续可卖出的单腿期权，这项成本并不高，但对胜率和收益改善很明显。</p><h2 id="订单记录"><a href="#订单记录" class="headerlink" title="订单记录"></a>订单记录</h2><p>股票交易的订单记录相对简单，因为频率低。但期权不一样，一天几十单并不夸张。所以我想把订单“日历化”，方便后续分析交易习惯和月度盈亏。于是我也做了一个订单记录页面，直接落每一笔订单的细节。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/03/26/1774534653930.png" alt="1774534653930.png"></p><p>其中绿色块表示交易日。点进某一天，就能看到当天全部订单及状态，这样交易习惯会非常直观。</p><h2 id="总结与展望"><a href="#总结与展望" class="headerlink" title="总结与展望"></a>总结与展望</h2><p>我一直把期权看成一种“给市场打工”的工具。只要愿意做风险可控的套利，就有机会在这个市场里持续、稳定地赚钱。这和股票不太一样，股票很多时候要同时承受系统性风险和个股风险。</p><p>这篇文章里介绍的组合订单功能，本质上就是为了更高效地执行价差策略和移仓操作，让我能更稳定地“在市场里打工赚钱”。你也能看到，我的大多数期权操作并不依赖方向预测。市场按预期走会赚得更多；不按预期走，也不至于失控，我依然保留下一月份继续操作的权利。</p><p>另外，我做这些事情的目标也很明确：把操作流程标准化，最后交给其他人或 AI 去执行。</p>]]></content>
    
    
    <summary type="html">本文作为交易系统系列的第六篇，主要介绍近期在期权策略和系统功能上的优化和改进。我将部分组合功能进行了整合, 尤其是针对我常用的牛市价差。另外，我还把出错订单单独记录了下来，便于后续分析和优化。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="股指期权" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E6%8C%87%E6%9C%9F%E6%9D%83/"/>
    
  </entry>
  
  <entry>
    <title>假期前的对冲保险：我为什么选ETF期权</title>
    <link href="https://corvo.myseu.cn/2026/02/12/2026-02-12-%E5%81%87%E6%9C%9F%E5%89%8D%E7%9A%84%E5%AF%B9%E5%86%B2%E4%BF%9D%E9%99%A9/"/>
    <id>https://corvo.myseu.cn/2026/02/12/2026-02-12-%E5%81%87%E6%9C%9F%E5%89%8D%E7%9A%84%E5%AF%B9%E5%86%B2%E4%BF%9D%E9%99%A9/</id>
    <published>2026-02-12T15:32:41.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>最近半年我一直在研究期权，特别是从卖方的角度来理解期权生意。久而久之，我发现了一个本质的认识：**期权交易的本质是一种”保险业务”**。卖方通过承担波动风险来获取权利金，本质和经营保险没有区别。既然是生意，就需要根据市场环境不断调整策略。</p><p>说起市场环境，春节和国庆这样的长假期间确实特殊。市场在假期前后往往会经历较大波动——一方面投资者在假期前主动调整仓位；另一方面，假期期间可能发生的突发事件会直接冲击开市后的行情。我看到很多人的策略是”持币过节”，用现金来规避不确定性。但这对我来说不太适合，因为我的持仓是一套非常长期构建的资产配置，不想简单地为了过个假期就破坏这个结构。于是我开始思考：有没有更精致的方式，在不破坏持仓的前提下，来对冲假期的风险？</p><p>我的投资组合核心是高分红的大市值股票，辅以一些成长股和小盘股。这个组合的风格与上证50相当接近，所以在本次分析中，我用上证50作为模型。这样做也是为了简化问题——我对冲的是整体市场风险（用指数来代表），而不是逐只考虑每只股票的波动。</p><h1 id="问题定义"><a href="#问题定义" class="headerlink" title="问题定义"></a>问题定义</h1><p>我想要在假期前构建一个”保险机制”：既能保护投资组合免受假期市场冲击（主要是下跌预期），又不用破坏现有的持仓结构。</p><p>我的股票持仓规模约60万元。虽然不是大资金，但这正好是一个很有代表性的规模——足够大到需要认真对待风险，又小到需要精打细算成本。</p><p>接下来，我会从<strong>期货</strong> 和 <strong>期权</strong>两个维度分别分析，看看哪种工具最适合这个特定的问题。</p><h1 id="对冲选择"><a href="#对冲选择" class="headerlink" title="对冲选择"></a>对冲选择</h1><h2 id="股指期货"><a href="#股指期货" class="headerlink" title="股指期货"></a>股指期货</h2><h3 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h3><p>期货是一种标准化合约：规定在未来某个时间以约定的价格交割某资产。它本身是中立的工具——既可以对冲风险，也可以用来投机。</p><p>具体到对冲：如果我担心假期后市场下跌，我可以<strong>卖出</strong>期货合约来”锁定”当前价格。这样一来，即使股票跌了，期货的盈利就会抵消股票的亏损。听起来很完美，但问题在于——期货需要保证金，而且一旦市场大幅波动，会面临”追加保证金”的风险。</p><h3 id="对我的现实约束"><a href="#对我的现实约束" class="headerlink" title="对我的现实约束"></a>对我的现实约束</h3><p>上证50期货合约的规格：</p><ul><li>每点300元的乘数</li><li>最近的合约价格约3100点</li><li><strong>一手能对冲约90万市值</strong></li><li><strong>需要约15万的保证金</strong></li></ul><p>这就立刻产生了一个现实问题：我有60万持仓，但账户里不可能闲置15万来”冻结”在保证金上（这15万相当于25%的账户被”冰冻”）。对于我这个量级的资金，期货的保证金成本太高了。</p><p>这个工具对于<strong>资产量在几千万以上</strong>的投资者是合适的，但对我目前的情况来说，不划算。</p><p>参考：<a href="http://www.cffex.com.cn/sz50/">CFFEX 上证50期货</a></p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771145393046.png" alt="1771145393046.png"></p><h2 id="股指期货期权"><a href="#股指期货期权" class="headerlink" title="股指期货期权"></a>股指期货期权</h2><h3 id="原理-1"><a href="#原理-1" class="headerlink" title="原理"></a>原理</h3><p>期权是建立在期货基础之上的。如果说期货是”必须交割”的合约，那么期权就是”可以选择交割”的权利。期权赋予持有者在未来某个时间以约定价格买入（Call）或卖出（Put）某资产的<strong>权利</strong>，但没有义务。</p><p>这一点很关键：期权的非线性特征意味着它天然适合做对冲。我只需要为这份”权利”付出权利金，而不需要准备大额的保证金。</p><p>具体到上证50期货期权：</p><ul><li>每点100元的乘数（比期货少）</li><li>最近价格约3100点</li><li><strong>一张能对冲约30万市值</strong></li><li><strong>权利金成本约4000~6000元</strong></li><li><strong>买方不需要保证金</strong></li></ul><p>看起来理想多了，但我咨询了券商的客户经理后，遇到了一个隐藏的门槛：<strong>账户需要至少50万的闲置资金才能开通</strong>。而我的60万基本都在另一个期权账户持仓里，根本没有这笔”闲置资金”来满足开户要求。</p><p>这个方案对于<strong>资产在几百万级别</strong>的投资者很适合，但对我的现状来说，又卡在了准入条件上。</p><p>参考：<a href="http://www.cffex.com.cn/sz50gzqq/">CFFEX 上证50股指期货期权</a></p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771145732477.png" alt="1771145732477.png"></p><h2 id="ETF期权（最终方案）"><a href="#ETF期权（最终方案）" class="headerlink" title="ETF期权（最终方案）"></a>ETF期权（最终方案）</h2><h3 id="原理-2"><a href="#原理-2" class="headerlink" title="原理"></a>原理</h3><p>上证50ETF是一只标准化的ETF基金，它跟踪上证50指数。与期货期权的区别在于——它不是虚拟的指数合约，而是真实存在的<strong>可交易股票</strong>。</p><p>正因为这个特性，上证50ETF期权的准入门槛低得多。</p><h3 id="规格对比"><a href="#规格对比" class="headerlink" title="规格对比"></a>规格对比</h3><table><thead><tr><th></th><th>单位市值</th><th>权利金成本</th><th>准入门槛</th></tr></thead><tbody><tr><td><strong>ETF期权</strong></td><td>约3万</td><td>400~600元</td><td>低（适合我）</td></tr></tbody></table><p>每个合约对应100手ETF（即1万股），权利金成本相对较低。重要的是——券商对这个品种没有设置额外的”闲置资金”要求，我可以直接用交易账户操作。</p><p>这意味着我可以<strong>灵活调整对冲力度</strong>。比如，我可以买10~20张看跌期权，既能覆盖大部分的对冲需求（10张 × 3万 &#x3D; 30万；我只需要覆盖60万），又不用过度对冲浪费成本。</p><p>权利金成本估算：假设每张500元，对冲10张所需成本仅为5000元，相当于我总持仓的0.8%。这个成本对于对冲假期风险来说，是可以接受的。</p><p>参考：<a href="https://www.sse.com.cn/assortment/options/contract/c/c_20230303_5717359.shtml">SSE 上证50ETF期权合约</a></p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771147574405.png" alt="1771147574405.png"></p><p><strong>结论：这是我最终的选择</strong>。它很好地平衡了对冲效果和成本效率，而且准入条件完全符合我的现状。</p><h1 id="期权合约具体选择"><a href="#期权合约具体选择" class="headerlink" title="期权合约具体选择"></a>期权合约具体选择</h1><p>既然选定了ETF期权作为对冲工具，接下来就是<strong>如何选择合约</strong>。主要需要决策的细节有三个：</p><h2 id="合约到期日的选择"><a href="#合约到期日的选择" class="headerlink" title="合约到期日的选择"></a>合约到期日的选择</h2><p>以2026年春节为例：</p><ul><li>2月13日是假期前最后一个交易日</li><li>2月24日（假期后）才开市</li><li>2月份期权合约会在2月25日到期</li></ul><p>这里有个陷阱：如果选2月到期的合约，它会在假期<strong>结束后</strong>马上到期。这样一来，你从假期风险中”活下来”，但合约却立刻清算了，可能面临比较大的价差问题（bid-ask spread）。</p><p>更好的选择是<strong>3月到期的合约</strong>。它能覆盖真正的风险窗口（2月13日到2月24日），而且离到期日还有足够的时间，不用担心流动性变差的问题。</p><h2 id="买哪个行权价？"><a href="#买哪个行权价？" class="headerlink" title="买哪个行权价？"></a>买哪个行权价？</h2><p>有三种极端选择：</p><ol><li><strong>平值（ATM）</strong>：贴近当前股价的行权价，保险最充分，但保费最贵</li><li><strong>深度虚值</strong>：远离当前股价很远，保费很便宜，但保险效果形同虚设  </li><li><strong>虚值一档</strong>（理想中点）：成本和效果的平衡点</li></ol><p>我倾向于选<strong>虚值一档</strong>。这样既不会因为追求”完美对冲”而过度投入，也不会因为贪便宜而买不到真正的保障。再次提醒，这不是赌方向的投机——这里的目的就是”花合理的钱，买充分的保险”。</p><h2 id="为什么不通过卖Call来对冲？"><a href="#为什么不通过卖Call来对冲？" class="headerlink" title="为什么不通过卖Call来对冲？"></a>为什么不通过卖Call来对冲？</h2><p>有小伙伴也问过我：与其买Put，不如卖Call（看涨期权）来赚权利金，用这笔钱来”自我保险”？</p><p>这在数学上省钱，但<strong>引入了额外的风险</strong>：如果行情大涨，我的股票虽然赚钱了，但被套的Call会限制我的上涨空间。对冲的核心目的是<strong>风险中立</strong>，而不是用一个风险来抵消另一个风险。所以卖Call不是我的主要策略。</p><h2 id="执行记录"><a href="#执行记录" class="headerlink" title="执行记录"></a>执行记录</h2><p>回到2026年春节的实际操作。从2月9日（周一）开始，我开始用限价单逐日建仓。最终的持仓是：</p><ul><li><strong>卖出2张看涨期权（Call）</strong>：小额的反向操作，用来微调</li><li><strong>买入6张看跌期权（Put）</strong>：核心对冲头寸</li></ul><p>这个配置覆盖了18万左右的名义市值（6 × 3万），相当于对我18万持仓做了保险覆盖。我其实想买10张Put，但是最后两天的合约太贵了，限价单没有成交。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771148565646.png" alt="1771148565646.png"></p><p>结果怎样呢？好消息是期权对冲本身已经赚钱了。坏消息是最后两个交易日大盘下跌明显，虽然对冲帮我减少了损失，但账户总体仍然缩水了。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771148884945.png" alt="1771148884945.png"></p><p>这就是现实：对冲的意义不在于”消除亏损”，而在于**”可控损失的规模”**。另外, 因为我的对冲只是针对长期不开盘的假期风险，所以对冲的效果也只能覆盖这个特定的风险窗口。假期结束后，我就会给期权平仓，这样一来一回的成本非常的低。</p><h1 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h1><p>这个案例实际上反映了一个很务实的问题：<strong>如何在有限的资本和约束条件下，做出最优的风险管理决策</strong>。</p><p>回顾整个推理过程：</p><ol><li><strong>定义问题</strong>：不是”如何完全消除风险”（不现实），而是”如何成本有效地对冲假期风险”</li><li><strong>评估工具</strong>：期货和两种期权都各有优势，但都有现实约束</li><li><strong>匹配方案</strong>：根据我的资金规模和账户条件，ETF期权是最合适的选择</li><li><strong>精细化执行</strong>：选择合理的合约规格、到期日和行权价</li></ol><p>对于不同量级的投资者，最优选择是不同的：</p><table><thead><tr><th>资产规模</th><th>推荐工具</th><th>关键约束</th></tr></thead><tbody><tr><td>&lt;10万</td><td>期权太贵</td><td>需考虑减仓或资产配置调整</td></tr><tr><td>60~300万</td><td>ETF期权（我的方案）</td><td>灵活高效，成本可控</td></tr><tr><td>300~几千万</td><td>期货期权或股指期货</td><td>准入门槛和保证金充足</td></tr><tr><td>几千万+</td><td>期货+更复杂组合</td><td>可做多腿对冲策略</td></tr></tbody></table><p>没有”完美”的对冲，都是权衡。核心是理解每个工具的<strong>本质、约束和成本</strong>，然后做出符合自己现状的选择。如这篇文章开头所说，这不仅涉及期权知识，更涉及如何在约束条件下做决策——这是做投资或经营生意的永恒主题。</p>]]></content>
    
    
    <summary type="html">春节长假期间，市场风险被放大。本文分享了我如何通过期货和期权两个工具的对比，在现实约束条件下，选择最适合自己的对冲方案。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="保险" scheme="https://corvo.myseu.cn/tags/%E4%BF%9D%E9%99%A9/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="投资" scheme="https://corvo.myseu.cn/tags/%E6%8A%95%E8%B5%84/"/>
    
    <category term="期货" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E8%B4%A7/"/>
    
    <category term="ETF" scheme="https://corvo.myseu.cn/tags/ETF/"/>
    
    <category term="风险管理" scheme="https://corvo.myseu.cn/tags/%E9%A3%8E%E9%99%A9%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>个人财务模型与非对称机会</title>
    <link href="https://corvo.myseu.cn/2026/01/05/2026-01-05-%E9%9D%9E%E5%AF%B9%E7%A7%B0%E6%9C%BA%E4%BC%9A%E4%B8%8E%E4%B8%AA%E4%BA%BA%E8%B4%A2%E5%8A%A1%E6%A8%A1%E5%9E%8B/"/>
    <id>https://corvo.myseu.cn/2026/01/05/2026-01-05-%E9%9D%9E%E5%AF%B9%E7%A7%B0%E6%9C%BA%E4%BC%9A%E4%B8%8E%E4%B8%AA%E4%BA%BA%E8%B4%A2%E5%8A%A1%E6%A8%A1%E5%9E%8B/</id>
    <published>2026-01-05T20:32:41.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>最近在整理自己的财务笔记时，我发现这套体系已经形成了一个相对完整的框架。这篇文章不会讲那些让人肾上腺素飙升的暴富故事，而是想冷静地拆解一个问题：一个普通人如何从”出卖劳动力”一步步过渡到”依靠资产收租”。</p><p>这套体系的核心不在于追求市场的暴利，而在于承认一个朴素的事实：**财富积累往往伴随着枯燥的重复劳动。** 我试图理清从“出卖劳动力”到“拥有资产”之间，究竟存在怎样的转化机制。当然整篇文章的观点也仅仅是我个人的理解和实践经验，不构成任何投资建议。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/Xnip2026-01-08_22-48-39.jpg" alt="Xnip2026-01-08_22-48-39.jpg"></p><hr><h2 id="对现金流的抽象定义"><a href="#对现金流的抽象定义" class="headerlink" title="对现金流的抽象定义"></a>对现金流的抽象定义</h2><p>在构建这个模型的时候，我发现单纯盯着”收益率”这个数字其实意义不大。更重要的是先搞清楚”钱从哪里来”。我把现金流大致分为四类：</p><ol><li><strong>劳动（工资）</strong>：本质是出卖时间或技能。</li><li><strong>借贷（利息）</strong>：让渡资金的使用权。</li><li><strong>权益（分红）</strong>：作为资产所有者分享收益。</li><li><strong>保险（补偿）</strong>：这是模型中比较特殊的一环。</li></ol><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767886199100.png" alt="1767886199100.png"></p><h3 id="把自己当成”保险公司”"><a href="#把自己当成”保险公司”" class="headerlink" title="把自己当成”保险公司”"></a>把自己当成”保险公司”</h3><p>我把<strong>期权卖方（Selling Options）</strong>理解成一种”保险生意” 。当我卖出期权的时候，本质上是在承担市场波动的风险（让买方能睡个好觉），然后收取”权利金”作为保费 。</p><p>既然是生意，那就意味着它是一种<strong>劳动</strong> ，而不是躺着就能赚钱的被动收入。我需要持续投入时间和精力来维护这门生意 。目标也很明确：不去赌方向，而是像经营保险公司那样，通过提供流动性或对冲服务，稳健地赚取 <strong>10%-15%</strong> 的年化权利金 。</p><h3 id="关于“保险机制”的理解"><a href="#关于“保险机制”的理解" class="headerlink" title="关于“保险机制”的理解"></a>关于“保险机制”的理解</h3><p>保险的本质是用小保费对冲小概率大损失, 关键在于资本充足以承受极端赔付.在金融市场中, 我把卖期权视为一套<strong>“保险机制”</strong>: 作为卖方承担波动风险, 用权利金作为对价.前提是保证金&#x2F;底仓能够覆盖最坏情况, 否则就是用未来透支现在.它不是被动投资, 而是一门需要持续维护的生意; 目标是获取相对稳健的现金流, 而非追求暴利.对多数人而言, 与重资产创业相比, 这门“小保险业务”更轻、更可执行.</p><hr><h2 id="核心比喻：大楼与脚手架"><a href="#核心比喻：大楼与脚手架" class="headerlink" title="核心比喻：大楼与脚手架"></a>核心比喻：大楼与脚手架</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884662449.png" alt="1767884662449.png"></p><p>如果把财务自由比作盖一座大楼，这个模型的逻辑是这样的 ：</p><ul><li><strong>高分红股票（大楼本体）</strong>：这是最终目标。能提供真正的被动分红现金流，是将来可以”住”的地方。</li><li><strong>期权交易（脚手架）</strong>：这是加速工具。做卖方生意赚取额外现金流，用这些钱买更多股票（砖头），从而更快地把楼盖起来。</li><li><strong>打工收入（地基）</strong>：在楼盖起来之前，打工收入提供最基础的生存保障。</li></ul><p>这个顺序很重要：如果没有资产积累（没打地基）就直接去卖期权（搭架子），或者只搭架子不盖楼（纯投机），那就不是在做生意，而是在赌博 。</p><hr><h2 id="一条可执行的路线图"><a href="#一条可执行的路线图" class="headerlink" title="一条可执行的路线图"></a>一条可执行的路线图</h2><p>根据资金规模，我给自己规划了一条相对清晰的路径 [2]：</p><h3 id="第一阶段：生存期（10万以内）"><a href="#第一阶段：生存期（10万以内）" class="headerlink" title="第一阶段：生存期（10万以内）"></a>第一阶段：生存期（10万以内）</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884691728.png" alt="1767884691728.png"></p><ul><li><strong>核心任务</strong>：保住饭碗，稳定工作收入。</li><li><strong>阶段特点</strong>：这是最基础的原始积累阶段。在还没有资产护城河的时候，<strong>工资是唯一靠得住的正向现金流</strong>。</li></ul><h3 id="第二阶段：建仓期（10万-50万）"><a href="#第二阶段：建仓期（10万-50万）" class="headerlink" title="第二阶段：建仓期（10万 - 50万）"></a>第二阶段：建仓期（10万 - 50万）</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884707519.png" alt="1767884707519.png"></p><ul><li><strong>核心任务</strong>：建立根据地，积累底仓。</li><li><strong>具体操作</strong>：**”不管股价涨跌，持续买入积累股份”** 。</li><li><strong>底层逻辑</strong>：这个阶段是为了让你整体有个初步的框架, 也是为了验证你的水平.</li></ul><p>我们经常听说某个老板炒股亏了就是这种现象, 如果没法在股市里保住本金, 那么无论你在其他地方赚多少钱, 最终都会被市场收割掉.我建议一开始就要去尝试, 看看这条路是不是能走的下去. 通过长期的判断认清自己的水平, 以及对市场的理解.</p><h3 id="第三阶段：期权业务期（50万-500万）"><a href="#第三阶段：期权业务期（50万-500万）" class="headerlink" title="第三阶段：期权业务期（50万 - 500万）"></a>第三阶段：期权业务期（50万 - 500万）</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884730399.png" alt="1767884730399.png"></p><ul><li><strong>核心任务</strong>：搭建脚手架，加速复利。</li><li><strong>具体操作</strong>：开始做期权卖方（Selling Options）。从市场这个”盆”里收权利金，然后把所有权利金再投入买股票。</li><li><strong>心理预期</strong>：即使只有 6% 的额外收益也算是加速。这会是一个漫长的过程，可能需要持续很多年。</li></ul><p>这个业务会让你在承担部分风险的情况下, 赚取相对稳健的现金流. 注意, 这里的核心是”稳健”, 而不是”暴利”.你需要接受这种”有限收益, 有限风险”的特性 。如果这个时候疯狂加杠杆, 可能爆一次仓就会导致自己亏损几个月积蓄。这里一定要清楚一件事, 你没有在躺赚, 你是在做生意, 你需要付出时间和精力去维护这个业务.</p><h3 id="第四阶段：拆除脚手架（500万-）"><a href="#第四阶段：拆除脚手架（500万-）" class="headerlink" title="第四阶段：拆除脚手架（500万+）"></a>第四阶段：拆除脚手架（500万+）</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884751769.png" alt="1767884751769.png"></p><ul><li><strong>核心任务</strong>：**”不想一直卖保险了”**。</li><li><strong>终局状态</strong>：当资产规模达到一定程度，分红已经能覆盖日常开销的时候，就可以停止那些消耗精力的期权操作，拆掉脚手架，回归单纯的资产持有状态 。这才是真正的自由——从”必须操作”中解放出来 。</li></ul><p>到这里后, 最好将这项业务关闭或是外包出去, 可以尽量自动化, 或者雇人进行期权操作, 不要再去自己做这个重复的过程了.这个时候你可以有选择去做你想做的事, 甚至有一些现金流可以开始赌一下某个项目了, 因为你已经有足够的资产保护你不会归零了.</p><p>重点: 这里的第二阶段和第三阶段是不可以颠倒的, 你必须先有足够的市场认知, 稳定的盈利手段, 才能去承担期权卖方的风险.</p><hr><h2 id="隐藏的门槛：其实是一本”修心手册”"><a href="#隐藏的门槛：其实是一本”修心手册”" class="headerlink" title="隐藏的门槛：其实是一本”修心手册”"></a>隐藏的门槛：其实是一本”修心手册”</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884822853.png" alt="1767884822853.png"></p><p>这套策略看起来挺简单的，但真要执行起来很难，因为它会不断挑战人性中的贪婪和恐惧。</p><h3 id="期权投资是一项保险生意"><a href="#期权投资是一项保险生意" class="headerlink" title="期权投资是一项保险生意"></a>期权投资是一项保险生意</h3><p>是生意就会有赚有赔, 请一定记住这一点. 就算你算的胜率是99%, 也不能保证你每次都能赚到钱.</p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767885083036.png" alt="1767885083036.png"></p><h3 id="接受”慢”的节奏"><a href="#接受”慢”的节奏" class="headerlink" title="接受”慢”的节奏"></a>接受”慢”的节奏</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884842082.png" alt="1767884842082.png"></p><p>经常会有这样的疑问：”单纯囤股加卖期权是不是太慢了？”</p><p>我的想法是：<strong>与其追求暴利搞得寝食难安，不如用稳健的方式安心睡觉，把精力留给生活中更重要的事情</strong> 。</p><p>试图绕过积累阶段直接追求”快”，通常意味着要牺牲心态的平稳。如果为了多赚点权利金就把风险拉得很高，那这些工具反而会变成绞肉机 。</p><h3 id="接受平庸与机械重复"><a href="#接受平庸与机械重复" class="headerlink" title="接受平庸与机械重复"></a>接受平庸与机械重复</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884860814.png" alt="1767884860814.png"></p><p>这个模型本身就锁死了收益上限（期权卖方的封顶收益特性）。在牛市疯狂的时候，大概率会踏空，收益跑输那些赌单边的人。需要提前做好这种”相对剥夺感”的心理准备 。</p><p>另外，作为”保险业务员”，需要忍受长期的机械重复操作。<strong>能不能控制住自己，其实比懂不懂技术更关键</strong> 。</p><hr><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>这套”期权脚手架”模型，本质上是一套<strong>防御性的财务体系</strong> 。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884884831.png" alt="1767884884831.png"></p><p>如果控制不住恐惧和贪婪，比如喜欢追涨杀跌、盲目满仓，或者为了多赚权利金就不顾风险，那这些工具其实帮不了什么忙。这种情况下，<strong>老老实实打工攒钱</strong>反而是最明智的选择，至少工资这个正向现金流不会让人亏到归零 。</p><p>但对于那些能够控制住自己心性的人来说，这确实是一条通往”睡后收入”的相对稳健的路径。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884904421.png" alt="1767884904421.png"></p><p><strong>脚手架终将拆除，唯有大楼屹立不倒。</strong></p>]]></content>
    
    
    <summary type="html">分享一套我正在执行的财务模型。它不追求暴富，而是通过承认“卖期权是做生意”这一本质，建立一套从出卖劳动力过渡到依靠资产收租的稳健路径。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="数学" scheme="https://corvo.myseu.cn/tags/%E6%95%B0%E5%AD%A6/"/>
    
    <category term="保险" scheme="https://corvo.myseu.cn/tags/%E4%BF%9D%E9%99%A9/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="投资" scheme="https://corvo.myseu.cn/tags/%E6%8A%95%E8%B5%84/"/>
    
    <category term="经济" scheme="https://corvo.myseu.cn/tags/%E7%BB%8F%E6%B5%8E/"/>
    
    <category term="财务自由" scheme="https://corvo.myseu.cn/tags/%E8%B4%A2%E5%8A%A1%E8%87%AA%E7%94%B1/"/>
    
    <category term="现金流" scheme="https://corvo.myseu.cn/tags/%E7%8E%B0%E9%87%91%E6%B5%81/"/>
    
  </entry>
  
  <entry>
    <title>投资最重要的是别亏钱</title>
    <link href="https://corvo.myseu.cn/2026/01/01/2026-01-01-%E6%8A%95%E8%B5%84%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%84%E6%98%AF%E5%88%AB%E4%BA%8F%E9%92%B1/"/>
    <id>https://corvo.myseu.cn/2026/01/01/2026-01-01-%E6%8A%95%E8%B5%84%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%84%E6%98%AF%E5%88%AB%E4%BA%8F%E9%92%B1/</id>
    <published>2026-01-01T15:32:41.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>巴菲特曾说过投资有两条铁律：第一条是永远不要亏钱；第二条是永远不要忘记第一条。</p><p>以前我只是把这句话当成一种“心态建设”，认为这只是在强调风险控制。但在深入研究了<strong>对数正态分布（Log-normal Distribution）</strong>模型后，我发现这句话其实有着极其冷酷且严密的数学底色。</p><p>为了方便直观理解，我编写了一个交互式的可视化工具，建议配合本文阅读：👉 <a href="https://compound-truth.corvofeng.workers.dev/">复利真相：对数正态分布实验室</a></p><hr><h2 id="1-从正态分布说起"><a href="#1-从正态分布说起" class="headerlink" title="1. 从正态分布说起"></a>1. 从正态分布说起</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259774945.png" alt="1767259774945.png"></p><p>在进入复杂的金融模型前，我们需要先理解自然界的基石——<strong>正态分布</strong>。</p><h3 id="高尔顿板：加法的视觉化"><a href="#高尔顿板：加法的视觉化" class="headerlink" title="高尔顿板：加法的视觉化"></a>高尔顿板：加法的视觉化</h3><p>想象一块布满交错钉子的板子，小球从顶端落下，每次碰到钉子都会随机向左或向右弹跳。这个物理过程本质上是<strong>随机步骤的累加</strong>。当小球足够多时，底部的堆积形状必然会呈现出完美的“钟形曲线”。</p><h3 id="中心极限定理-CLT"><a href="#中心极限定理-CLT" class="headerlink" title="中心极限定理 (CLT)"></a>中心极限定理 (CLT)</h3><p>这就是数学上的<strong>中心极限定理</strong>：大量相互独立、分布随机的变量，只要它们是<strong>相加（Summation）</strong>的关系，最终的加和一定会趋向于正态分布。</p><p>在加法的世界里，涨跌是对称的。如果你有 100 元，今天加 10 元，明天减 10 元，你还是 100 元。</p><hr><h2 id="2-投资收益的模型：乘法的陷阱"><a href="#2-投资收益的模型：乘法的陷阱" class="headerlink" title="2. 投资收益的模型：乘法的陷阱"></a>2. 投资收益的模型：乘法的陷阱</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259811434.png" alt="1767259811434.png"></p><p>然而，投资世界遵循的不是加法，而是<strong>乘法</strong>。</p><h3 id="累加-vs-累乘"><a href="#累加-vs-累乘" class="headerlink" title="累加 vs 累乘"></a>累加 vs 累乘</h3><p>你的财富增长不是 $P_0 + r_1 + r_2$，而是：$$P_t &#x3D; P_0 \times (1 + r_1) \times (1 + r_2) \times \dots \times (1 + r_t)$$</p><p>这种<strong>累乘随机过程</strong>导致了一个致命的不对称性：如果你亏损了 50%，你需要盈利 100% 才能回到原点。</p><h3 id="对数变换：桥接两个世界"><a href="#对数变换：桥接两个世界" class="headerlink" title="对数变换：桥接两个世界"></a>对数变换：桥接两个世界</h3><p>为了使用强大的中心极限定理，数学家对价格取了对数（$\ln$）：$$\ln(P_t) &#x3D; \ln(P_0) + \ln(1+r_1) + \ln(1+r_2) + \dots$$</p><p>现在，等式右边变成了<strong>对数收益率的累加</strong>。根据中心极限定理，$\ln(P_t)$ 服从正态分布。<strong>推导结论：如果资产价格的对数是正态分布，那么资产价格本身就服从“对数正态分布”。</strong></p><hr><h2 id="3-对数正态分布的图像特质"><a href="#3-对数正态分布的图像特质" class="headerlink" title="3. 对数正态分布的图像特质"></a>3. 对数正态分布的图像特质</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259907293.png" alt="1767259907293.png"></p><p>当我们观察对数正态分布的概率密度曲线时，会发现它与正态分布完全不同：</p><ol><li><strong>不对称性（右偏）</strong>：它有一条向右延伸的长尾巴（理论上无限的上涨空间），但左侧死死地卡在 0（你最多亏光）。</li><li><strong>重心左移</strong>：这是本文最核心的观察点。</li></ol><p>在对数正态分布中，有三个“中心”：</p><ul><li>**期望值 (Mean)**：数学上的平均收益。</li><li>**中位数 (Median)**：50% 的人能达到的结局。</li><li>**众数 (Mode)**：概率最高、最可能发生的结局。</li></ul><hr><h2 id="4-深度性质：为什么“别亏钱”是第一法则"><a href="#4-深度性质：为什么“别亏钱”是第一法则" class="headerlink" title="4. 深度性质：为什么“别亏钱”是第一法则"></a>4. 深度性质：为什么“别亏钱”是第一法则</h2><p>通过观察模型参数 $\mu$（预期收益）和 $\sigma$（波动率）的互动，我们可以得出以下实战启示：</p><h3 id="4-1-波动率陷阱：亏损是复利的杀手"><a href="#4-1-波动率陷阱：亏损是复利的杀手" class="headerlink" title="4.1 波动率陷阱：亏损是复利的杀手"></a>4.1 波动率陷阱：亏损是复利的杀手</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259951578.png" alt="1767259951578.png"></p><p>对数正态分布下，复合年化收益率 $g$ 的近似公式为：$$g \approx \mu - \frac{\sigma^2}{2}$$</p><p>看到那个 $\frac{\sigma^2}{2}$ 了吗？<strong>波动率会直接从你的收益中“扣钱”。</strong>即使平均收益 $\mu$ 很高，只要波动率 $\sigma$ 足够大，你的真实增长 $g$ 可能是负数。这就是为什么“稳健”比“爆发”更重要的数学原因。</p><h3 id="4-2-不要加杠杆：中位数的坍缩"><a href="#4-2-不要加杠杆：中位数的坍缩" class="headerlink" title="4.2 不要加杠杆：中位数的坍缩"></a>4.2 不要加杠杆：中位数的坍缩</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259989096.png" alt="1767259989096.png"></p><p>加杠杆会线性增加 $\mu$，但会以<strong>平方速度</strong>增加 $\sigma^2$。反映在图像上，虽然平均值（Mean）被极少数暴富的幸存者拉向了右侧，但曲线的峰值（Mode）和中点（Median）会迅速向左侧（亏损区）坍缩。<strong>结论：杠杆越高，你变成那个“被平均”的炮灰概率就越大。</strong></p><h3 id="4-3-追高的幻觉：高波动的代价"><a href="#4-3-追高的幻觉：高波动的代价" class="headerlink" title="4.3 追高的幻觉：高波动的代价"></a>4.3 追高的幻觉：高波动的代价</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767260059169.png" alt="1767260059169.png"></p><p>热门股（高 $\mu$, 极高 $\sigma$）往往呈现出极度的左偏。虽然它“看起来”涨得快，但其<strong>众数（最可能发生的结局）往往远低于 1.0</strong>。你追逐的是那条稀疏的、极难捕捉的“长右尾”，而你面对的却是大概率的亏损峰值。</p><h3 id="4-4-本金要足够"><a href="#4-4-本金要足够" class="headerlink" title="4.4 本金要足够"></a>4.4 本金要足够</h3><p>在乘法模型中，所有的收益都基于 $P_0$。由于波动拖累的存在，小额本金通过高风险波动翻倍的概率，远低于大额本金通过低波动增长的确定性。<strong>本金不仅是资本，更是抗风险的“冗余度”。</strong></p><h3 id="4-5-永远有概率赢：时间的解药"><a href="#4-5-永远有概率赢：时间的解药" class="headerlink" title="4.5 永远有概率赢：时间的解药"></a>4.5 永远有概率赢：时间的解药</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767260089028.png" alt="1767260089028.png"></p><p>只要你的复合收益率 $g &gt; 0$，随着时间 $t$ 的增加：</p><ul><li>增长项按 $t$ 线性增长。</li><li>随机波动项按 $\sqrt{t}$ 缓慢增长。<strong>只要你不因大亏或杠杆被清出场，时间最终会稀释掉短期的随机性，让财富分布的山峰缓慢爬过“盈亏平衡点”。</strong></li></ul><hr><h2 id="5-总结"><a href="#5-总结" class="headerlink" title="5. 总结"></a>5. 总结</h2><p>我可能做了一些不严谨的假设才构建了这个模型，但它揭示了一个深刻的真相：<strong>投资不是一个比谁跑得快的游戏，而是一个比谁活得久的游戏。</strong></p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767260115783.png" alt="1767260115783.png"></p><p>“别亏钱”不是为了追求保守，而是为了保护那个脆弱的复利引擎不被 $\sigma^2$ 这个恶魔强行熄火。在这个不对称的概率世界里，<strong>平庸的赢 + 极少的输 &#x3D; 伟大的复利。</strong></p><p>如果你对这些参数如何影响分布感兴趣，欢迎去我的<a href="https://compound-truth.corvofeng.workers.dev/">可视化工具</a>亲手调一调参数，你会对“风险”产生全新的敬畏。</p>]]></content>
    
    
    <summary type="html">我们经常听到“投资最重要的是别亏钱”，我之前只是牢记这一点，但是近期查资料查到了有关对数正态分布相关的知识。顺着它的思路，我自己也从模型角度对这句话进行了一些理解。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="数学" scheme="https://corvo.myseu.cn/tags/%E6%95%B0%E5%AD%A6/"/>
    
    <category term="投资" scheme="https://corvo.myseu.cn/tags/%E6%8A%95%E8%B5%84/"/>
    
    <category term="经济" scheme="https://corvo.myseu.cn/tags/%E7%BB%8F%E6%B5%8E/"/>
    
  </entry>
  
  <entry>
    <title>半自动化交易系统（五）</title>
    <link href="https://corvo.myseu.cn/2025/12/31/2025-12-31-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%94)/"/>
    <id>https://corvo.myseu.cn/2025/12/31/2025-12-31-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%94)/</id>
    <published>2025-12-31T10:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<hr><p>本文作为交易系统系列的第五篇，主要介绍近期在期权策略和系统功能上的优化和改进。在券商平台开通QMT权限后，我实现了使用Python进行期权交易的自动化操作。本文将详细介绍系统架构、功能实现以及策略改进的相关内容。</p><h2 id="券商集成"><a href="#券商集成" class="headerlink" title="券商集成"></a>券商集成</h2><p>在期权自动化交易方面，我的主要账户在国金, 正好满足了要求, 所以就用国金的QMT接口作为底层交易通道。之前使用MiniQMT进行股票交易，但期权交易需要完整版QMT权限。</p><p>集成过程中使用的核心函数包括：</p><ol><li><a href="https://dict.thinktrader.net/innerApi/trading_function.html?id=I3DJ97#get-trade-detail-data-%E6%9F%A5%E8%AF%A2%E8%B4%A6%E5%8F%B7%E8%B5%84%E9%87%91%E4%BF%A1%E6%81%AF%E3%80%81%E5%A7%94%E6%89%98%E8%AE%B0%E5%BD%95%E7%AD%89">get_trade_detail_data</a> 用于获取账户资金信息、委托记录等：</li><li><a href="https://zilchyao.github.io/xuntou_yao/#_4-34-%E5%8F%96%E6%9C%9F%E6%9D%83%E7%BB%84%E5%90%88%E6%8C%81%E4%BB%93get-comb-option">get_comb_option</a> 取期权组合持仓</li><li><a href="https://dict.thinktrader.net/innerApi/trading_function.html?id=I3DJ97#make-option-combination">make_option_combination</a> 用于创建期权组合, 我主要用来做价差</li><li><a href="http://docs.thinktrader.net/pages/d0dd26/#_39-%E8%A7%A3%E9%99%A4%E6%9C%9F%E6%9D%83%E7%BB%84%E5%90%88%E6%8C%81%E4%BB%93-release-option-combination">release_option_combination</a> 用于释放期权组合</li><li><a href="https://dict.thinktrader.net/innerApi/trading_function.html?id=I3DJ97#%E4%BA%A4%E6%98%93%E4%B8%8B%E5%8D%95%E5%87%BD%E6%95%B0">passorder</a> 所有的下单操作, 包括开仓, 平仓</li><li><a href="https://dict.thinktrader.net/dictionary/option.html?id=I3DJ97#%E8%8E%B7%E5%8F%96%E6%9C%9F%E6%9D%83%E5%85%A8%E6%8E%A8%E6%95%B0%E6%8D%AE">get_full_tick</a> 获取期权逐笔数据</li></ol><p>关于API的详细使用方法，券商提供的技术文档已经有较为完整的说明，这里不再赘述。如需要技术咨询服务，可通过私信联系讨论具体需求和费用。</p><p>需要注意的是，QMT启动后会独占交易通道，佣金宝和国金的其他客户端无法同时进行交易。如需在移动端进行操作，可以使用国金提供的汇点期权App作为替代方案。</p><h2 id="页面功能设计"><a href="#页面功能设计" class="headerlink" title="页面功能设计"></a>页面功能设计</h2><p>为了更有效地管理期权持仓，我开发了一个专门的持仓管理页面。该页面不仅展示持仓信息，还集成了调仓功能，可以便捷地进行期权组合的构建和调整。</p><p>如前文《<a href="https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/">期权策略-变种比例价差</a>》所述，我目前专注于科创50ETF期权的价差策略。单一标的的策略使得页面设计可以更加专注和高效。</p><h3 id="持仓概览"><a href="#持仓概览" class="headerlink" title="持仓概览"></a>持仓概览</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767179952954.png" alt="1767179952954.png"></p><p>上图展示了持仓页面的整体布局。图中标注部分显示了当前标的物及其实时价格，这是监控持仓状态的核心指标。</p><h3 id="分月持仓管理"><a href="#分月持仓管理" class="headerlink" title="分月持仓管理"></a>分月持仓管理</h3><p>考虑到不同到期月份的期权合约具有不同的时间价值特性，系统按照到期日对持仓进行分类展示，便于分析和管理。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767180027632.png" alt="1767180027632.png"></p><p>页面从左到右依次显示：牛市价差组合数量、备兑组合数量、义务仓数量以及权利仓数量。这种布局方式能够快速呈现整体仓位结构。</p><p>此外，系统对不同行权价的时间价值进行了颜色编码，通过视觉化的方式突出显示各合约的时间价值水平，提高了信息的可读性。</p><h3 id="调仓操作界面"><a href="#调仓操作界面" class="headerlink" title="调仓操作界面"></a>调仓操作界面</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767180121324.png" alt="1767180121324.png"></p><p>调仓页面提供了简洁的操作界面。用户可以直接修改目标持仓数量，系统会自动计算需要执行的交易操作。</p><p>页面集成了实时行情数据，能够实时显示当前的买卖报价。科创50ETF期权具有较好的流动性，买卖价差相对较小。当前版本实现了对手价下单功能，限价单功能计划在后续版本中添加。</p><p>页面底部以JSON格式展示完整的持仓信息，包括各合约的数量和价格，便于在下单前进行最终确认。</p><h3 id="组合策略管理"><a href="#组合策略管理" class="headerlink" title="组合策略管理"></a>组合策略管理</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767180206595.png" alt="1767180206595.png"></p><p>期权组合是策略实施的核心部分。页面提供了组合调整界面，支持便捷地构建和修改各类价差组合。</p><h2 id="策略优化与实现"><a href="#策略优化与实现" class="headerlink" title="策略优化与实现"></a>策略优化与实现</h2><p>《<a href="https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/">期权策略-变种比例价差</a>》一文中详细阐述了策略的理论框架。在实际落地过程中，为了更好地实现程序化交易，对策略进行了一些适配性调整和优化。</p><h3 id="策略参数优化"><a href="#策略参数优化" class="headerlink" title="策略参数优化"></a>策略参数优化</h3><p>在仓位管理方面，将之前的零散操作调整为标准化配置：在每个价位段，统一采用<strong>10张权利仓+12-15张义务仓</strong>的标准比例来构建组合，同时配合少量平值期权义务仓的裸卖操作。</p><p>这种标准化配置的优势在于：仓位控制更加精确，避免了为凑整数而产生的困扰，使得整体仓位管理更加规范和可控。</p><h3 id="风控机制设计"><a href="#风控机制设计" class="headerlink" title="风控机制设计"></a>风控机制设计</h3><p>衍生品交易中，风险控制是系统稳定运行的基础。系统实现了完整的风控和调仓逻辑。从我的角度来看, 风控长什么样不重要, 重要的是一定要有一个.它能够提醒你当前的风险暴露情况, 并且在必要时刻给出调仓建议. 我就想了一套最简单的让AI来生成.</p><p>围绕获取时间价值这一核心目标，针对义务仓设计了三层风控机制：</p><ol><li><strong>高风险调仓机制</strong>：当持仓的风险评分超过预设阈值时，系统会自动识别并建议更保守的调仓方案，降低持仓风险暴露</li><li><strong>虚值平行移仓机制</strong>：当虚值合约时间价值快速衰减，且下月合约的时间价值达到当月的2倍以上时，系统会建议平行移仓，在获取更高时间价值的同时，可以适当降低持仓数量</li><li><strong>低价值清仓机制</strong>：对于时间价值低于50元的期权合约，系统会建议平仓，以提高保证金使用效率</li></ol><p>系统还实现了风险评分机制记录，根据持仓情况和标的价格实时计算风险分数，并以图表形式记录风险变化趋势。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767184797272.png" alt="1767184797272.png"></p><p>通过这套风控体系，能够及时识别和控制潜在风险。</p><h2 id="总结与展望"><a href="#总结与展望" class="headerlink" title="总结与展望"></a>总结与展望</h2><p>本文介绍了期权自动化交易系统的主要功能模块和策略实现。从券商接口集成、页面功能设计，到策略优化和风控机制，系统已经具备了基本的自动化交易能力。</p><p>当前系统仍有较大的改进空间。限价单功能、更多样化的策略组合、更精细的风控算法等功能都在规划之中。系统的持续优化和完善将是后续工作的重点。</p><p>欢迎对期权交易自动化感兴趣的读者交流讨论。</p>]]></content>
    
    
    <summary type="html">本文作为交易系统系列的第五篇，主要介绍近期在期权策略和系统功能上的优化和改进。在券商平台开通QMT权限后，我实现了使用Python进行期权交易的自动化操作。本文将详细介绍系统架构、功能实现以及策略改进的相关内容。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="股指期权" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E6%8C%87%E6%9C%9F%E6%9D%83/"/>
    
  </entry>
  
  <entry>
    <title>期权策略-变种比例价差</title>
    <link href="https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/"/>
    <id>https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/</id>
    <published>2025-10-18T10:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>💡 <strong>前言</strong></p><p>这篇文章想和大家分享我一直在使用的期权策略，以及我对风险控制的一些体会。<br>这套策略是我在开始期权交易后不久就建立的，至今仍在使用。期间经过多次调整与优化，但核心逻辑始终未变。</p><p>👉 本文面向已经具备一定期权基础的投资者。<br>如果你刚入门，建议先了解期权的基本概念和原理。本文不会涉及复杂的希腊字母计算，也不探讨定价模型，更多是关于策略思路与风险控制的实践。（我自己也不太会算那些 😂）</p><blockquote><p>⚠️ <strong>风险提示：</strong>没有任何策略是永远有效的。市场在变，波动在变，人也会变。<br>以下内容仅为个人经验分享，不构成任何投资建议。</p></blockquote><hr><h2 id="🧩-普通比例价差（Ratio-Spread）"><a href="#🧩-普通比例价差（Ratio-Spread）" class="headerlink" title="🧩 普通比例价差（Ratio Spread）"></a>🧩 普通比例价差（Ratio Spread）</h2><p><strong>Ratio Spread（比率价差）</strong> 是一种常见的期权组合策略。<br>它的核心思想是通过 <strong>买入与卖出不同比例的期权</strong>，利用波动性与时间价值的差异，在风险可控的情况下获取收益。</p><p>以看涨期权为例 👇</p><ol><li><strong>买入</strong> 较低执行价的看涨期权（Long Call）——获得上涨收益机会；  </li><li><strong>卖出</strong> 较高执行价的看涨期权（Short Call）——收取权利金抵消部分成本。</li></ol><p>举个最简单的例子：<br>买入 1 张执行价为 10 元的 Call，同时卖出 2 张执行价为 12 元的 Call。<br>你支付买入的权利金，同时获得卖出的权利金，形成一个「比例结构」。</p><p>🔗 延伸阅读  </p><ul><li><a href="https://www.moomoo.com/us/hans/learn/detail-ratio-spread-117038-240298018">moomoo 教程</a>  </li><li><a href="https://xueqiu.com/8188497048/137926836">雪球讨论</a></li></ul><p>策略的到期盈亏图如下：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760626207592.png" alt="1760626207592.png"></p><p>我个人并不太喜欢这种「山峰型」的损益曲线。<br>它虽然直观，却让人感到不够平衡与优雅。于是，我尝试使用下面我更偏好的变种。</p><hr><h2 id="🚀-我的变种策略"><a href="#🚀-我的变种策略" class="headerlink" title="🚀 我的变种策略"></a>🚀 我的变种策略</h2><h3 id="🎬-策略灵感"><a href="#🎬-策略灵感" class="headerlink" title="🎬 策略灵感"></a>🎬 策略灵感</h3><p>我最早在 <a href="https://www.youtube.com/watch?v=0UrpGD_79FQ">PowerUpGammas 的视频</a> 中看到这种思路。<br>视频讨论的是「如何用期权修复股票浮亏」，但我认为它不仅适用于亏损修复，也可在 <strong>趋势行情中放大收益</strong>。</p><iframe width="560" height="315" src="https://www.youtube.com/embed/0UrpGD_79FQ?si=gaz_euaqdREDjhBy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe><p>后来, 他讲了另一篇 <a href="https://www.youtube.com/watch?v=fxXqDGuveQ4">超级备兑期权</a>, 就是本篇文章所讲的内容.</p><iframe width="560" height="315" src="https://www.youtube.com/embed/fxXqDGuveQ4?si=dyUAFo3mutw9kvrq" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe><hr><h3 id="🧱-策略结构"><a href="#🧱-策略结构" class="headerlink" title="🧱 策略结构"></a>🧱 策略结构</h3><ol><li>持有一份标的资产（用于备兑）；  </li><li>买入 1 张较低执行价的看涨期权；  </li><li>卖出 2 张较高执行价的看涨期权。</li></ol><p>与普通比率价差相比，这里额外加入了标的资产本身，起到了<strong>风险缓冲</strong>的作用。</p><p>换个角度理解：</p><ul><li>「买低 + 卖高」 &#x3D; 牛市价差（Bull Call Spread）  </li><li>「持股 + 卖高」 &#x3D; 备兑看涨（Covered Call）</li></ul><p>两者结合，就构成了这种混合型结构。</p><hr><h3 id="📈-到期盈亏图与分析"><a href="#📈-到期盈亏图与分析" class="headerlink" title="📈 到期盈亏图与分析"></a>📈 到期盈亏图与分析</h3><p>我用 OptionStrat 画了一张 SPY 的示意图：<br>👉 <a href="https://optionstrat.com/5SNKWQgvyWql">策略图链接</a></p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760627211016.png" alt="1760627211016.png"></p><p>图中可以分为三个区间：</p><ol><li><strong>左侧红区</strong>：股价低于 680，全体期权作废，盈亏与正股一致。  </li><li><strong>中间绿区（680–700）</strong>：收益由股票上涨 + 看涨期权增值组成。  </li><li><strong>右侧平顶区（&gt;700）</strong>：卖出两张 Call 的收益抵消上涨空间，收益封顶。</li></ol><blockquote><p>💬 关键：<br>两张高行权价的 Call 收入必须能覆盖低行权价 Call 的成本，否则策略将需要额外资金投入（风险上升）。</p></blockquote><p>我很喜欢这条盈亏曲线，它平滑、线性、干净。<br>数学上，它是一个<strong>分段线性函数</strong>；逻辑上，它在中段实现了无成本的杠杆提升。</p><p>✨ 优点总结：</p><ul><li>风险可控，结构清晰  </li><li>在<strong>区间内</strong>实现 2 倍收益  </li><li>无额外资金占用</li></ul><hr><h2 id="🧭-策略的进一步变种"><a href="#🧭-策略的进一步变种" class="headerlink" title="🧭 策略的进一步变种"></a>🧭 策略的进一步变种</h2><p>既然原理是「用比率调整收益区间」，那我们就可以玩出更多组合。</p><h3 id="🎯-变种-1：调整区间宽度"><a href="#🎯-变种-1：调整区间宽度" class="headerlink" title="🎯 变种 1：调整区间宽度"></a>🎯 变种 1：调整区间宽度</h3><p>调整买卖期权的执行价，可改变收益区间。<br>例如：</p><ul><li>买入 1 张 680 Call  </li><li>卖出 2 张 710 Call</li></ul><p>区间拉宽 → 收益范围更大，但权利金差距也变大，需要重新平衡成本。</p><hr><h3 id="⚙️-变种-2：调整比例"><a href="#⚙️-变种-2：调整比例" class="headerlink" title="⚙️ 变种 2：调整比例"></a>⚙️ 变种 2：调整比例</h3><p>可以买入 2 张、卖出 3 张，从而实现更高杠杆（例如 3 倍收益）。<br>只要卖出的权利金能覆盖买入成本，该结构依然成立。</p><hr><h3 id="🔄-变种-3：反向思维（看跌版）"><a href="#🔄-变种-3：反向思维（看跌版）" class="headerlink" title="🔄 变种 3：反向思维（看跌版）"></a>🔄 变种 3：反向思维（看跌版）</h3><p>同理，也可构建看跌版策略：<br>买入 1 张高行权价 Put，卖出 2 张低行权价 Put，同时准备现金用于”备兑”。</p><h3 id="🔄-变种整合"><a href="#🔄-变种整合" class="headerlink" title="🔄 变种整合"></a>🔄 变种整合</h3><p>如果我们将这几个变种策略结合起来, 那么最后的盈亏图可能长成这样, 在不同的区间内, 我们可以获得不同倍数的收益. 也可以理解为加了不同倍数的杠杆. </p><p><a href="https://optionstrat.com/NpbByzGw1vll">https://optionstrat.com/NpbByzGw1vll</a> </p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760628194047.png" alt="1760628194047.png"></p><p>我没有画看跌的比率价差, 因为这个工具并没有给我用现金做备兑的选项, 但其实它和看涨的比率价差类似, 只是方向相反.</p><hr><h2 id="⚖️-风险与取舍"><a href="#⚖️-风险与取舍" class="headerlink" title="⚖️ 风险与取舍"></a>⚖️ 风险与取舍</h2><p>这种结构的优点在于：<strong>看错不亏，看对大赚</strong>。<br>但仍需注意以下风险 👇</p><ol><li><strong>标的下跌风险</strong>：若价格跌破低行权价，亏损与持股一致。  </li><li><strong>机会成本</strong>：资金被标的锁定，横盘时收益有限。  </li><li><strong>踏空风险</strong>：若标的暴涨，收益被封顶，需提前规划。</li></ol><hr><h2 id="🧮-市场分析与量化探索"><a href="#🧮-市场分析与量化探索" class="headerlink" title="🧮 市场分析与量化探索"></a>🧮 市场分析与量化探索</h2><p>既然结构清晰，我自然想看看，我平时交易的科创50ETF期权，能实现多大杠杆。</p><p>我写了一个小程序，基于科创50ETF期权数据，计算每个合约能实现的<strong>最大杠杆倍数（无额外投入）</strong>。</p><p>例如：</p><ul><li>26年3月的科创50ETF期权合约中：<blockquote><p>  1.55 Call 价格为 1213</p><p>  1.6  Call 价格为 1063</p></blockquote></li></ul><p>→ 理论上可开到 8 倍杠杆（卖8张，买7张）  </p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">8</span> * <span class="number">1063</span> - <span class="number">7</span> * <span class="number">1213</span> = +<span class="number">13</span>  <span class="comment"># （未计手续费）</span></span><br></pre></td></tr></table></figure><p>我自己编写了一个定时任务自动计算每个区间段内可以实现的杠杆倍数并打点, 下面是两张不同月份合约的杠杆计算结果图, 横轴为不同时间点, 纵轴为杠杆倍数。</p><p>📉 近月合约（2–3倍杠杆）：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760629002867.png" alt="1760629002867.png"></p><p>📈 远月合约（6–8倍杠杆）：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760629061847.png" alt="1760629061847.png"></p><p>读者可以自己算一下：<strong>杠杆倍数与价差成反比，与合约价格成正比。</strong>两张期权价差越小、价格越高，可开的杠杆就越大。</p><hr><h2 id="📊-我的持仓追踪与管理"><a href="#📊-我的持仓追踪与管理" class="headerlink" title="📊 我的持仓追踪与管理"></a>📊 我的持仓追踪与管理</h2><p>我使用 Google 表格来管理持仓与杠杆情况👇</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760629475045.png" alt="1760629475045.png"></p><p>并标记了每个区间段、每个月份的杠杆倍数：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760629373123.png" alt="1760629373123.png"></p><p>这些数据帮助我动态调整仓位，优化结构。</p><p>📍 开仓容易，管理更关键。很多期权合约不一定要持有到期的, 中途怎么调整, 可能是更重要的.</p><p>我做了几个月期权的一点思考就是: 只要你能在市场中活着, 你就有机会赚钱. 这个策略能让你在市场中活很久. 哪天失业了, 可以用这个策略给市场打工, 赚点小钱.</p><hr><h2 id="🧩-总结"><a href="#🧩-总结" class="headerlink" title="🧩 总结"></a>🧩 总结</h2><p>这套比率价差变种，是我实战中最核心、最常用的策略之一。<br>它特别适合趋势明确的单边行情，或是大幅的震荡行情。</p><p>对于更大体量的投资者，这种结构更像是 <strong>微型做市（Market Making）</strong>：<br>提供市场流动性、赚取结构性溢价。<br>当然，这需要更成熟的风险矩阵与资金分层体系。</p><hr><h3 id="🤔-为什么我不担心策略公开会失效？"><a href="#🤔-为什么我不担心策略公开会失效？" class="headerlink" title="🤔 为什么我不担心策略公开会失效？"></a>🤔 为什么我不担心策略公开会失效？</h3><ol><li><strong>市场需要流动性</strong>：更多人使用 → 价格更高效。</li><li><strong>机构更复杂</strong>：他们的模型理论上更加负责 我根本不需要担心他们。</li><li><strong>收益有限</strong>：Capped profit 不吸引极端投机者。</li></ol>]]></content>
    
    
    <summary type="html">这篇文章想和大家分享我一直在使用的期权策略，以及我对风险控制的一些体会。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="Option" scheme="https://corvo.myseu.cn/tags/Option/"/>
    
    <category term="科创50ETF" scheme="https://corvo.myseu.cn/tags/%E7%A7%91%E5%88%9B50ETF/"/>
    
  </entry>
  
  <entry>
    <title>使用Google表格整理期权持仓</title>
    <link href="https://corvo.myseu.cn/2025/10/14/2025-10-14-%E4%BD%BF%E7%94%A8Google%E8%A1%A8%E6%A0%BC%E6%95%B4%E7%90%86%E6%9C%9F%E6%9D%83%E6%8C%81%E4%BB%93/"/>
    <id>https://corvo.myseu.cn/2025/10/14/2025-10-14-%E4%BD%BF%E7%94%A8Google%E8%A1%A8%E6%A0%BC%E6%95%B4%E7%90%86%E6%9C%9F%E6%9D%83%E6%8C%81%E4%BB%93/</id>
    <published>2025-10-14T10:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一些背景"><a href="#一些背景" class="headerlink" title="一些背景"></a>一些背景</h2><p>我虽然已经使用Bolt开发了期权相关的页面, 但是在实际交易中, 还是习惯使用Google表格来整理期权数据, 主要有以下几个原因:</p><ol><li>目前还没有把后端系统接入到QMT, 只能手动导入数据, 所以并没有什么自动化的优势.</li><li>目前我做期权, 依然还是处于比较新手的阶段, 还在探索比较合适的工具, 这个时候去研究展示页面我认为收益不高</li><li>Google表格的界面非常友好, 可以很方便地进行数据的查看和编辑, 而且我能慢慢整理出自己想要的究竟是什么</li><li>我也使用了一下飞书的文档, 它的自定义函数支持我是没看懂, 考虑到实用性和扩展性, 还是选了Google表格</li></ol><p>我的Google表格的地址如下, 如果想修改, 读者可以直接复制一份到自己的Google账号下进行修改</p><p><a href="https://docs.google.com/spreadsheets/d/1IiRv47a8lwmZt84KsiZnTKOTp4HDsqJUgsyUxbWHGlU/edit?gid=1506563050#gid=1506563050">https://docs.google.com/spreadsheets/d/1IiRv47a8lwmZt84KsiZnTKOTp4HDsqJUgsyUxbWHGlU/edit?gid=1506563050#gid=1506563050</a></p><h2 id="期权持仓的获取"><a href="#期权持仓的获取" class="headerlink" title="期权持仓的获取"></a>期权持仓的获取</h2><p>我用的是国金的金太阳来看我的持仓, 它是通达信的一个定制版本, 也提供了数据导出的功能</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760454197980.png" alt="1760454197980.png"></p><p>我就用它的导出功能, 导出成Excel, 然后再复制到Google表格中</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760455027983.png" alt="1760455027983.png"></p><h2 id="持仓收益整理"><a href="#持仓收益整理" class="headerlink" title="持仓收益整理"></a>持仓收益整理</h2><p>我希望尽量记录自己的仓位变化情况, 正好也用Google表格以及图表进行记录和查看</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760456434235.png" alt="1760456434235.png"></p><h2 id="Google表格的整理-内置函数"><a href="#Google表格的整理-内置函数" class="headerlink" title="Google表格的整理(内置函数)"></a>Google表格的整理(内置函数)</h2><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760455185669.png" alt="1760455185669.png"></p><p>这张图中. 有几个部分我用了Google表格的内置函数来实现</p><h3 id="根据到期日进行过滤"><a href="#根据到期日进行过滤" class="headerlink" title="根据到期日进行过滤"></a>根据到期日进行过滤</h3><p>比如, 整个tab中, 我首先进行过滤, <code>Q2</code>这个单元格对应的到期日, 这里是<code>20251022</code>, 而后基于合约名称进行排序</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=sort(filter(&#x27;持仓&#x27;!A2:N, &#x27;持仓&#x27;!N2:N = Q2), 2, true)</span><br></pre></td></tr></table></figure><h3 id="获取未平仓的CALL"><a href="#获取未平仓的CALL" class="headerlink" title="获取未平仓的CALL"></a>获取未平仓的CALL</h3><p>而后, 我用这个公式来获取<code>未平仓的CALL</code>, 如下, 它的规则是:</p><ol><li>当我发现期权名称中包含<code>购</code>字  –  为看涨期权</li><li>可用量大于0  – 说明还有未平仓的</li><li>开仓价格为负数  – 说明当时是在卖出</li><li>并且不是备兑的时候 – 非备兑</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=FILTER(B2:O20, regexmatch(C2:C20,&quot;.*购.*&quot;), F2:F20&gt;0, G2:G20&lt;0, NOT(D2:D20=&quot;备兑&quot;))</span><br></pre></td></tr></table></figure><p>未平仓的PUT也是类似的, 读者可以自己去表格中查看公式</p><h2 id="调用自定义的函数"><a href="#调用自定义的函数" class="headerlink" title="调用自定义的函数"></a>调用自定义的函数</h2><p>针对这些可能有行权风险的义务仓, 我还编写了一些自定义的函数, 来帮助我进行一些计算. 比如, 当前标的价格, 计算合约是实值还是虚值</p><h3 id="函数代码编写"><a href="#函数代码编写" class="headerlink" title="函数代码编写"></a>函数代码编写</h3><p>可以从这个位置打开来查看脚本</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760456135053.png" alt="1760456135053.png"></p><p>里面的代码我是求助Gemini来做的, 它比自己写快太多了, 还有注释, 好评!</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760456203388.png" alt="1760456203388.png"></p><h3 id="表格中调用函数"><a href="#表格中调用函数" class="headerlink" title="表格中调用函数"></a>表格中调用函数</h3><p>我可以直接调用写好的函数来计算得到所有期权的状态, 方便我评估风险, 哪些属于实值的义务仓需要在到期前尽快平掉或是移仓</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=ANALYZE_OPTION_STATUS(C:C, R2*1000)</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>我说真的, 不管是用自己的程序还是用Google表格整理都不是特别方便. 但是我用了券商的软件包括通达信还是汇点, 他们的对于已持有的期权仓位的分析都非常有限,只能看到一些基本的信息. 甚至连按照月份来分类都没有, 只能看到一个大概的持仓. 当我做的期权越来越多的时候, 这些信息就显得非常不够用了.</p><p>如果是机构交易者应该也是要有自己的系统来管理这些数据的, 但是对于个人投资者来说, 我目前还没找到一个特别好的工具. 如果有推荐的期权工具也欢迎大家留言告诉我.</p>]]></content>
    
    
    <summary type="html">使用Google表格整理期权数据的经验分享</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="股指期权" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E6%8C%87%E6%9C%9F%E6%9D%83/"/>
    
    <category term="Option" scheme="https://corvo.myseu.cn/tags/Option/"/>
    
    <category term="Google" scheme="https://corvo.myseu.cn/tags/Google/"/>
    
    <category term="Sheets" scheme="https://corvo.myseu.cn/tags/Sheets/"/>
    
  </entry>
  
  <entry>
    <title>我的半自动化股票交易系统（四）</title>
    <link href="https://corvo.myseu.cn/2025/09/20/2025-09-20-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E8%82%A1%E7%A5%A8%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E5%9B%9B)/"/>
    <id>https://corvo.myseu.cn/2025/09/20/2025-09-20-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E8%82%A1%E7%A5%A8%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E5%9B%9B)/</id>
    <published>2025-09-20T10:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<hr><p>这篇文章是我的半自动化股票交易系统系列的第四篇，主要聚焦于期权相关的功能和策略改动。近期我的主要精力都放在期权自动化和策略优化上。本文不会详细介绍期权基础知识，更适合已有一定期权基础的读者。如果你对期权还不熟悉，建议先查阅相关入门资料，后续我也会专门写一篇期权基础与策略的介绍。</p><h2 id="国内期权市场现状"><a href="#国内期权市场现状" class="headerlink" title="国内期权市场现状"></a>国内期权市场现状</h2><p>很多朋友听到“期权”时，往往不相信国内也有类似的杠杆工具。实际上，国内不仅有商品期权，还有较为成熟的金融期权市场，尤其是股指期权。具体规则可以参考<a href="https://www.cs.ecitic.com/newsite/bdp/gpqq/jygz/">中信证券官网的交易规则</a>。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_22-51-55.jpg" alt="Xnip2025-09-20_22-51-55.jpg"></p><p>我个人主要关注的是<code>华夏科创50ETF（588000.SH）</code>的期权。选择这个标的的原因很简单：价格计算方便，每张合约大约1万元，且科创板股票波动率较高，非常适合期权策略的实践。</p><p>目前国内主流的期权交易软件如汇点、通达信等，对自定义指标和策略的支持有限。如果想实现自动化交易，基本只能靠自己开发程序。与券商沟通后了解到，若想开通API权限，通常需要满足100万元资金量和500张期权交易的门槛，我还在为这个目标努力中。</p><h2 id="T型报价与数据获取"><a href="#T型报价与数据获取" class="headerlink" title="T型报价与数据获取"></a>T型报价与数据获取</h2><p>T型报价表是期权交易的基础工具，也是我自动化程序的第一步。只有能实时获取期权报价和持仓数据，后续的分析和策略执行才有可能实现。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_22-23-34.jpg" alt="Xnip2025-09-20_22-23-34.jpg"></p><p>许多期权策略的分析和决策，都是基于当前的T型报价实时计算得出的。</p><h2 id="持仓数据解析"><a href="#持仓数据解析" class="headerlink" title="持仓数据解析"></a>持仓数据解析</h2><p>由于目前还没有开放的API接口，我的期权持仓数据主要通过券商导出的持仓文件（CSV格式）获取。程序会自动解析这些文件，生成标准化的持仓数据，便于后续分析和策略管理。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_11-30-48.jpg" alt="Xnip2025-09-20_11-30-48.jpg"></p><p>在系统中，我可以根据实际持仓情况，自定义和选择对应的策略组合。</p><h2 id="期权策略的维护与管理"><a href="#期权策略的维护与管理" class="headerlink" title="期权策略的维护与管理"></a>期权策略的维护与管理</h2><p>基于当前持有的期权合约，我可以自定义常见的策略组合，比如牛市价差、熊市价差等基础策略，也可以灵活组合更复杂的策略。由于缺乏API，目前策略的维护主要依赖手动操作。好在我的资金规模尚未大到需要频繁调整仓位，现阶段这种方式尚可接受。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/1758382525875.png" alt="1758382525875.png"></p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_11-29-21.jpg" alt="Xnip2025-09-20_11-29-21.jpg"></p><h2 id="报价监听与策略通知"><a href="#报价监听与策略通知" class="headerlink" title="报价监听与策略通知"></a>报价监听与策略通知</h2><p>在维护好策略后，系统会根据当前持仓和策略，自动监听合约报价的变化，判断是否需要进行买卖操作。需要说明的是，目前实际下单仍需手动在券商软件中完成，系统会通过 Telegram 发送通知，提醒我及时操作。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_12-05-48.jpg" alt="Xnip2025-09-20_12-05-48.jpg"></p><p>对于十几万元规模的账户来说，这种半自动化已经极大减轻了盯盘和计算压力。只需等待程序通知，无需频繁关注行情和手动计算盈亏。</p><h2 id="总结与展望"><a href="#总结与展望" class="headerlink" title="总结与展望"></a>总结与展望</h2><p>期权交易与股票有很大不同，需要学习和掌握的内容也更多。当前我主要利用期权获取稳定现金流，并对冲部分股票仓位的风险。期权策略丰富多样，自动化程度越高，效率和收益也会越好。受限于API门槛，目前我的系统还无法实现完全自动化，只能做价格提醒和部分策略维护。希望未来能达到券商API的要求，实现真正的自动化期权交易。</p><p>如果你对期权自动化、策略开发等话题感兴趣，欢迎留言交流！</p>]]></content>
    
    
    <summary type="html">本文作为交易系统系列的第四篇，主要介绍近期在期权相关策略和系统功能上的改动。近期我的主要精力都放在期权自动化和策略优化上，欢迎有兴趣的读者交流探讨。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="股指期权" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E6%8C%87%E6%9C%9F%E6%9D%83/"/>
    
  </entry>
  
  <entry>
    <title>使用 Bitwarden 在 K8s 集群管理 Secrets</title>
    <link href="https://corvo.myseu.cn/2025/08/23/2025-08-23-%E4%BD%BF%E7%94%A8Bitwarden%E5%9C%A8K8s%E9%9B%86%E7%BE%A4%E7%AE%A1%E7%90%86Secrets/"/>
    <id>https://corvo.myseu.cn/2025/08/23/2025-08-23-%E4%BD%BF%E7%94%A8Bitwarden%E5%9C%A8K8s%E9%9B%86%E7%BE%A4%E7%AE%A1%E7%90%86Secrets/</id>
    <published>2025-08-23T23:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>我一直用自建的 Vaultwarden 管理密码。最近突然意识到，K3s 集群里的密码都直接写在 Git 仓库里，既不安全也不优雅。于是决定把这些密码迁移到 Bitwarden，并实现自动同步到集群。</p><p>整个过程其实很顺利，这里记录一下操作流程，方便大家参考。</p><h2 id="为什么要做这件事"><a href="#为什么要做这件事" class="headerlink" title="为什么要做这件事"></a>为什么要做这件事</h2><p>虽然我用 ArgoCD 自动发布服务，但密码等敏感信息都直接写在 Git 仓库里。这样做不仅不安全，而且维护起来很麻烦。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/23/1755960391002.png" alt="1755960391002.png"></p><p>我希望能有一个自动同步 Secrets 的控制器，把密码从 Bitwarden 自动同步到 K8s 集群，提高安全性和管理效率。正好在 <a href="https://argo-cd.readthedocs.io/en/stable/operator-manual/secret-management/">ArgoCD 文档</a> 里看到官方推荐用独立的 Secrets 管理系统，比如 <a href="https://external-secrets.io/">external-secrets</a>。</p><h2 id="架构设计"><a href="#架构设计" class="headerlink" title="架构设计"></a>架构设计</h2><p>方案很简单：在集群里部署 Bitwarden 的转发服务和 external-secrets 控制器，Secrets 会自动创建到对应的 namespace。</p><p>详细流程可以参考：<a href="https://external-secrets.io/v0.19.2/examples/bitwarden/">argocd bitwarden</a></p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/23/1755962102555.png" alt="1755962102555.png"></p><h2 id="实现步骤"><a href="#实现步骤" class="headerlink" title="实现步骤"></a>实现步骤</h2><p>我是用 ArgoCD 做 IaC 管理的，下面用 Application 的方式举例说明。</p><h3 id="安装-external-secrets"><a href="#安装-external-secrets" class="headerlink" title="安装 external-secrets"></a>安装 external-secrets</h3><p>用 Helm 安装 external-secrets，并开启 ClusterSecretStore 的 CRD 支持。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">argoproj.io/v1alpha1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Application</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">external-secrets</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">argocd</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">project:</span> <span class="string">default</span></span><br><span class="line">  <span class="attr">source:</span></span><br><span class="line">    <span class="attr">repoURL:</span> <span class="string">&#x27;https://external-secrets.github.io/external-secrets/&#x27;</span></span><br><span class="line">    <span class="attr">chart:</span> <span class="string">external-secrets</span></span><br><span class="line">    <span class="attr">targetRevision:</span> <span class="number">0.19</span><span class="number">.2</span></span><br><span class="line">    <span class="attr">helm:</span></span><br><span class="line">      <span class="attr">parameters:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">bitwarden-sdk-server.enabled</span></span><br><span class="line">          <span class="attr">value:</span> <span class="string">&quot;false&quot;</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">&quot;crds.createClusterSecretStore&quot;</span></span><br><span class="line">          <span class="attr">value:</span> <span class="string">&quot;true&quot;</span></span><br><span class="line">  <span class="attr">destination:</span></span><br><span class="line">    <span class="attr">server:</span> <span class="string">&#x27;https://kubernetes.default.svc&#x27;</span></span><br><span class="line">    <span class="attr">namespace:</span> <span class="string">external-secrets</span></span><br><span class="line">  <span class="attr">syncPolicy:</span></span><br><span class="line">    <span class="attr">automated:</span></span><br><span class="line">      <span class="attr">selfHeal:</span> <span class="literal">true</span></span><br><span class="line">      <span class="attr">prune:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">syncOptions:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">CreateNamespace=true</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">ServerSideApply=true</span></span><br></pre></td></tr></table></figure><h3 id="部署-Bitwarden-服务"><a href="#部署-Bitwarden-服务" class="headerlink" title="部署 Bitwarden 服务"></a>部署 Bitwarden 服务</h3><p>部署 Bitwarden CLI 服务，确保能正常获取密码。可以在容器里执行 <code>bw list items</code> 验证。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/23/1755963071234.png" alt="1755963071234.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">kubectl apply -f - &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">apiVersion: v1</span></span><br><span class="line"><span class="string">kind: Secret</span></span><br><span class="line"><span class="string">metadata:</span></span><br><span class="line"><span class="string">  name: bitwarden-cli</span></span><br><span class="line"><span class="string">  namespace: external-secrets</span></span><br><span class="line"><span class="string">type: Opaque</span></span><br><span class="line"><span class="string">data:</span></span><br><span class="line"><span class="string">  BW_HOST: $(echo -n &quot;https://xxxxx&quot; | base64 | tr -d &#x27;\n&#x27;)</span></span><br><span class="line"><span class="string">  BW_USERNAME: $(echo -n &quot;&quot; | base64 | tr -d &#x27;\n&#x27;)</span></span><br><span class="line"><span class="string">  BW_PASSWORD: $(echo -n &quot;&quot; | base64 | tr -d &#x27;\n&#x27;)</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 参考文档：</span></span><br><span class="line"><span class="comment"># https://bitwarden.corvo.fun/#/vault?organizationId=unassigned&amp;search=ext&amp;itemId=502e2c9a-fefc-4d6d-93a9-0f66d7d4191a</span></span><br><span class="line"><span class="comment"># https://external-secrets.io/latest/examples/bitwarden/#deploy-bitwarden-credentials</span></span><br><span class="line"></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-cli</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">bitwarden-cli</span></span><br><span class="line">          <span class="attr">image:</span> <span class="string">ghcr.io/charlesthomas/bitwarden-cli:2025.6.1</span></span><br><span class="line">      <span class="comment"># ...</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Service</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-cli</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="comment"># ...</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">NetworkPolicy</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.k8s.io/v1</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">external-secret-2-bw-cli</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="comment"># ...</span></span><br></pre></td></tr></table></figure><h3 id="配置-external-secrets-的密码获取方式"><a href="#配置-external-secrets-的密码获取方式" class="headerlink" title="配置 external-secrets 的密码获取方式"></a>配置 external-secrets 的密码获取方式</h3><p>告诉 external-secrets 如何从 Bitwarden 获取密码。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-login</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">provider:</span></span><br><span class="line">    <span class="attr">webhook:</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">&quot;http://bitwarden-cli:8087/object/item/<span class="template-variable">&#123;&#123; .remoteRef.key &#125;&#125;</span>&quot;</span></span><br><span class="line">      <span class="attr">headers:</span></span><br><span class="line">        <span class="attr">Content-Type:</span> <span class="string">application/json</span></span><br><span class="line">      <span class="attr">result:</span></span><br><span class="line">        <span class="attr">jsonPath:</span> <span class="string">&quot;$.data.login.<span class="template-variable">&#123;&#123; .remoteRef.property &#125;&#125;</span>&quot;</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-fields</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">provider:</span></span><br><span class="line">    <span class="attr">webhook:</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">&quot;http://bitwarden-cli:8087/object/item/<span class="template-variable">&#123;&#123; .remoteRef.key &#125;&#125;</span>&quot;</span></span><br><span class="line">      <span class="attr">result:</span></span><br><span class="line">        <span class="attr">jsonPath:</span> <span class="string">&quot;$.data.fields[?@.name==\&quot;<span class="template-variable">&#123;&#123; .remoteRef.property &#125;&#125;</span>\&quot;].value&quot;</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-notes</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">provider:</span></span><br><span class="line">    <span class="attr">webhook:</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">&quot;http://bitwarden-cli:8087/object/item/<span class="template-variable">&#123;&#123; .remoteRef.key &#125;&#125;</span>&quot;</span></span><br><span class="line">      <span class="attr">result:</span></span><br><span class="line">        <span class="attr">jsonPath:</span> <span class="string">&quot;$.data.notes&quot;</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-attachments</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">provider:</span></span><br><span class="line">    <span class="attr">webhook:</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">&quot;http://bitwarden-cli:8087/object/attachment/<span class="template-variable">&#123;&#123; .remoteRef.property &#125;&#125;</span>?itemid=<span class="template-variable">&#123;&#123; .remoteRef.key &#125;&#125;</span>&quot;</span></span><br><span class="line">      <span class="attr">result:</span> &#123;&#125;</span><br></pre></td></tr></table></figure><h3 id="自动同步密码到集群"><a href="#自动同步密码到集群" class="headerlink" title="自动同步密码到集群"></a>自动同步密码到集群</h3><p>假如你已经在 Bitwarden 里保存了密码，只需创建 ExternalSecret，控制器会自动同步到 K8s 集群。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/23/1755962739832.png" alt="1755962739832.png"></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ExternalSecret</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">xx</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">refreshInterval:</span> <span class="string">1h</span></span><br><span class="line">  <span class="attr">secretStoreRef:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">bitwarden-secretsmanager</span></span><br><span class="line">    <span class="attr">kind:</span> <span class="string">SecretStore</span></span><br><span class="line">  <span class="attr">data:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">secretKey:</span> <span class="string">AAA</span></span><br><span class="line">    <span class="attr">sourceRef:</span></span><br><span class="line">      <span class="attr">storeRef:</span></span><br><span class="line">        <span class="attr">name:</span> <span class="string">bitwarden-notes</span></span><br><span class="line">        <span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line">    <span class="attr">remoteRef:</span></span><br><span class="line">      <span class="attr">key:</span> <span class="string">AAA</span></span><br></pre></td></tr></table></figure><p>最终会自动生成 K8s Secret，数据已经同步到集群，可以直接挂载和使用。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">Opaque</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Secret</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">xx</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">default</span></span><br><span class="line">  <span class="attr">ownerReferences:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line">    <span class="attr">kind:</span> <span class="string">ExternalSecret</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">xx</span></span><br><span class="line"><span class="attr">data:</span></span><br><span class="line">  <span class="attr">AAA:</span> <span class="string">QkJCQ0NDRERE</span></span><br></pre></td></tr></table></figure><h2 id="总结与建议"><a href="#总结与建议" class="headerlink" title="总结与建议"></a>总结与建议</h2><p>以前用 AWS SSM 管理密码，但因为成本没用起来。现在用 Bitwarden 管理 K8s 密码，既安全又方便。如果线上环境对安全性要求高，建议还是用专业的密码管理工具。</p><p>几点补充说明：</p><ol><li>Bitwarden 是我自建的密码管理工具，已经做了自动备份和容灾，所以用它管理集群密码比较放心。</li><li>Bitwarden 支持权限控制。如果用它管理 K8s 密钥，建议单独建一个 organization 存储，并用专门的用户读取。这样即使集群被攻破，也能保证其他密码安全。</li></ol>]]></content>
    
    
    <summary type="html">之前一直用自建的 Vaultwarden 管理密码，最近发现 K3s 集群的密码都直接写在 Git 仓库里，既不安全也不优雅。于是研究了如何用 Bitwarden 管理集群密码，并实现自动同步。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Kubernetes" scheme="https://corvo.myseu.cn/tags/Kubernetes/"/>
    
    <category term="K3s" scheme="https://corvo.myseu.cn/tags/K3s/"/>
    
    <category term="AWS" scheme="https://corvo.myseu.cn/tags/AWS/"/>
    
    <category term="Bitwarden" scheme="https://corvo.myseu.cn/tags/Bitwarden/"/>
    
    <category term="Vaultwarden" scheme="https://corvo.myseu.cn/tags/Vaultwarden/"/>
    
    <category term="external-secrets" scheme="https://corvo.myseu.cn/tags/external-secrets/"/>
    
  </entry>
  
  <entry>
    <title>我的半自动化股票交易系统（三）</title>
    <link href="https://corvo.myseu.cn/2025/08/15/2025-08-15-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E8%82%A1%E7%A5%A8%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%B8%89)/"/>
    <id>https://corvo.myseu.cn/2025/08/15/2025-08-15-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E8%82%A1%E7%A5%A8%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%B8%89)/</id>
    <published>2025-08-15T23:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>近期我的半自动化交易系统有了两项功能升级：一是扩展了 Telegram 的功能，可以直接在通知消息中通过标签实现买卖操作；二是集成了 LLM（大语言模型）工具，用于分析持仓和仓位变动。</p><h2 id="在-Telegram-中直接执行买卖操作"><a href="#在-Telegram-中直接执行买卖操作" class="headerlink" title="在 Telegram 中直接执行买卖操作"></a>在 Telegram 中直接执行买卖操作</h2><p>以往的半自动化模式是：程序检测到股票价格变化后，自动发送通知到 Telegram，我再根据提醒去券商软件下单。</p><p>最近我对这一流程进行了优化，现在可以直接在 Telegram 的通知消息上通过打标签来实现买卖操作，大大提升了效率和便捷性。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/16/1755357194553.png" alt="1755357194553.png"></p><h3 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h3><p>核心逻辑如下：后端会检查消息的发送者是否为管理员，并判断标签（icon）是否符合要求，只有都满足条件才会继续执行买卖操作。下面是部分实现代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">conv_command</span>(<span class="params">update: Update, context: ContextTypes.DEFAULT_TYPE</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    app_logger.info(<span class="string">f&quot;Update: <span class="subst">&#123;update&#125;</span>, Context: <span class="subst">&#123;context.__dict__&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">str</span>(update.message_reaction.user.<span class="built_in">id</span>) <span class="keyword">not</span> <span class="keyword">in</span> admin_user_ids:</span><br><span class="line">        app_logger.warning(<span class="string">f&quot;User <span class="subst">&#123;update.message_reaction.user.<span class="built_in">id</span>&#125;</span> is not an admin&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    act = update.message_reaction.new_reaction</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> act <span class="keyword">or</span> <span class="keyword">not</span> act[<span class="number">0</span>]:</span><br><span class="line">        app_logger.warning(<span class="string">&quot;No reaction found in the update.&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    emoji_data = act[<span class="number">0</span>].to_dict()</span><br><span class="line">    <span class="keyword">if</span> emoji_data[<span class="string">&#x27;emoji&#x27;</span>] != <span class="string">&#x27;👏&#x27;</span>:</span><br><span class="line">        app_logger.warning(<span class="string">f&quot;Reaction <span class="subst">&#123;act&#125;</span> is not supported&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    <span class="comment"># ... buy or sell logic</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    application = Application.builder().token(token).build()</span><br><span class="line">    application.add_handler(MessageReactionHandler(conv_command))</span><br></pre></td></tr></table></figure><p>通过这种方式，用户只需在 Telegram 消息上添加指定标签（如“👏”），系统就会自动完成买卖操作，无需手动切换到券商软件。</p><h2 id="利用-LLM-工具分析持仓与仓位调整"><a href="#利用-LLM-工具分析持仓与仓位调整" class="headerlink" title="利用 LLM 工具分析持仓与仓位调整"></a>利用 LLM 工具分析持仓与仓位调整</h2><p>我参考了 <a href="https://github.com/TauricResearch/TradingAgents">TauricResearch&#x2F;TradingAgents</a> 项目。虽然它主要支持 OpenAI 并且是终端交互，但我借鉴了其中的 prompt 设计，并在自己的系统中集成了 LLM 分析工具。现在，自动化代码生成和模型调用都非常高效，能够快速完成分析任务。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/17/1755392398699.png" alt="1755392398699.png"></p><h3 id="TradingAgents-的功能亮点"><a href="#TradingAgents-的功能亮点" class="headerlink" title="TradingAgents 的功能亮点"></a>TradingAgents 的功能亮点</h3><p>TradingAgents 利用 OpenAI 的函数调用能力（<a href="https://platform.openai.com/docs/guides/function-calling">Function Calling</a>），可以自动获取股票行情、检查新闻，并通过多轮交互生成分析报告。整个过程类似如下：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/17/1755360355504.png" alt="1755360355504.png"></p><p>这种方式让模型能够主动调用后端函数，自动完成数据抓取和分析，极大提升了智能化水平。</p><h3 id="我的实际应用"><a href="#我的实际应用" class="headerlink" title="我的实际应用"></a>我的实际应用</h3><p>我没有 OpenAI 的 API，但之前充值了 DeepSeek 的，所以直接用它来做持仓分析。目前项目中的 LLM 交互流程比较简洁：系统会整理最近的持仓数据，上传给 DeepSeek 进行分析，模型会给出仓位变动建议和操作意见。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/17/1755400172041.png" alt="1755400172041.png"></p><p>目前我每周查看一次模型生成的报告，已经能够满足日常的持仓管理和策略调整需求。</p><p><img src="https://rawforcorvofeng.cn/flarum/2025/08/16/41d2d526-346e-49e0-aedb-46c9ab7fc933-image.png" alt="image.png"></p>]]></content>
    
    
    <summary type="html">本文介绍近期系统的主要改动，包括 Telegram 扩展功能和 LLM 工具的集成。现在可以直接在 Telegram 通知中打标签实现买卖操作，并利用大模型分析持仓及仓位变动。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="bolt" scheme="https://corvo.myseu.cn/tags/bolt/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="ChatGPT" scheme="https://corvo.myseu.cn/tags/ChatGPT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="ECharts" scheme="https://corvo.myseu.cn/tags/ECharts/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="DeepSeek" scheme="https://corvo.myseu.cn/tags/DeepSeek/"/>
    
  </entry>
  
  <entry>
    <title>我的半自动化股票交易系统(二)</title>
    <link href="https://corvo.myseu.cn/2025/06/15/2025-06-15-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%8C)/"/>
    <id>https://corvo.myseu.cn/2025/06/15/2025-06-15-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%8C)/</id>
    <published>2025-06-15T23:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>最近两个月, 我又完善了一下交易系统. 目前bolt已经支持了<a href="https://support.bolt.new/integrations/git">GitHub项目的集成</a>, 我就顺势把前后端代码分开了.</p><p>前端代码完全使用bolt来生成的, 因此我开源了一份<a href="https://github.com/corvofeng/trader-frontend-mirror">放在GitHub corvofeng&#x2F;trader-frontend-mirror</a>,会不定期同步最新代码过去. 纯前端页面部署了一份在Cloudflare上, 可以直接预览这里:</p><p><a href="https://trader-front-mirror.corvofeng.workers.dev/">https://trader-front-mirror.corvofeng.workers.dev/</a></p><!-- ![1749951978788.png](https://rawforcorvofeng.cn/blog/2025/06/15/1749951978788.png) --><h1 id="新增的几个功能"><a href="#新增的几个功能" class="headerlink" title="新增的几个功能"></a>新增的几个功能</h1><h2 id="展示自动操作记录"><a href="#展示自动操作记录" class="headerlink" title="展示自动操作记录"></a>展示自动操作记录</h2><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749955395119.png" alt="1749955395119.png"></p><p>这个功能主要是确认我的程序是不是在正常运行, 所以我在关键位置打点了, 偶尔翻下记录就能知道有没有正常在跑.AI生成代码真的好用, 这个功能我自己写肯定要花不少时间.</p><h2 id="Treemap展示股票持仓"><a href="#Treemap展示股票持仓" class="headerlink" title="Treemap展示股票持仓"></a>Treemap展示股票持仓</h2><p>Treemap 这里是用的 echarts 的组件.</p><p><a href="https://echarts.apache.org/examples/en/index.html#chart-type-treemap">https://echarts.apache.org/examples/en/index.html#chart-type-treemap</a></p><p>说真的, 这个组件我用了很多的 token, 每次不满意就要重新生成一整个组件代码, 而且需要不少手动微调.</p><p>目前可以根据资金量展示不同大小的卡片, 当日的盈亏情况展示不同颜色.</p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749955483322.png" alt="1749955483322.png"></p><p>点开分组之后可以查看每个股票的持仓情况.</p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749955499836.png" alt="1749955499836.png"></p><h2 id="上传券商导出的持仓文件"><a href="#上传券商导出的持仓文件" class="headerlink" title="上传券商导出的持仓文件"></a>上传券商导出的持仓文件</h2><p>因为我有一些券商没有开通QMT, 只能导出xls文件来查看仓位, 我想顺便集成到这个系统中,就增加了这个功能.</p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749955449612.png" alt="1749955449612.png"></p><p>在用户上传持仓文件之后, 后台程序会解析持仓并返回预览, 而且会提供一个uuid来提供查看和分享</p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749956853677.png" alt="1749956853677.png"></p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749957323780.png" alt="1749957323780.png"></p><h1 id="一些功能展望"><a href="#一些功能展望" class="headerlink" title="一些功能展望"></a>一些功能展望</h1><p>以下功能是我准备逐步增加的:</p><ul><li>多种券商持仓文件的支持</li></ul><blockquote><p>我自己只测试了两种券商, 中金财富和国泰君安, 如果用户有其他券商的持仓文件需要导入, 可能会考虑支持.</p></blockquote><ul><li>期权价格的监听</li></ul><blockquote><p>期权和保险的功能类似, 可以令你拥有稳定现金流的工具.我近期的很多时间也放在了期权交易上, 所以可能会在这方面投入一些时间</p></blockquote><ul><li>AI分析持仓</li></ul><blockquote><p> 用户在上传持仓文件后, 可以丢给AI, 针对持仓风格给出一些建议</p></blockquote>]]></content>
    
    
    <summary type="html">最近两个月, 我又完善了一下交易系统. 在之前的基础上又增加了一些新功能. 也包括一些未来的功能展望.</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="bolt" scheme="https://corvo.myseu.cn/tags/bolt/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="ECharts" scheme="https://corvo.myseu.cn/tags/ECharts/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
  </entry>
  
  <entry>
    <title>日经ETF的一些技术面统计</title>
    <link href="https://corvo.myseu.cn/2025/05/24/2025-05-24-%E6%97%A5%E7%BB%8FETF%E7%9A%84%E4%B8%80%E4%BA%9B%E6%8A%80%E6%9C%AF%E9%9D%A2%E7%BB%9F%E8%AE%A1/"/>
    <id>https://corvo.myseu.cn/2025/05/24/2025-05-24-%E6%97%A5%E7%BB%8FETF%E7%9A%84%E4%B8%80%E4%BA%9B%E6%8A%80%E6%9C%AF%E9%9D%A2%E7%BB%9F%E8%AE%A1/</id>
    <published>2025-05-24T15:32:41.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<script src="https://cdn.jsdelivr.net/npm/plotly.js-dist-min@3.0.1/plotly.min.js"></script><style>.js-plotly-plot,.plotly-graph-div {  width: 100% !important;  max-width: 100% !important;}.js-plotly-plot {  overflow-x: auto;  -webkit-overflow-scrolling: touch;}</style><p>我个人从去年开始就逐步买入日经相关的场外基金, 也同时在场内有看 <a href="https://xueqiu.com/S/SH513520">日经ETF(SH:513520)</a> 这只ETF基金:在当时我使用 Backtrader 做回测时, 这只基金是我回测最多的, 所以我也针对它做了一些技术面的统计.</p><blockquote><p>其分析结果仅仅是一种技术面的观察, 不能预测未来趋势, 也不保证买了就可以赚钱,如果你认为只是技术面分析就能稳赚不赔, 我可能会认为你并不适合炒股, 也不适合做我的读者.</p></blockquote><p>如果想要查看部分代码, 以及更加优雅的图形交互, 请打开 <a href="https://colab.research.google.com/drive/1Lx0dRRFGdyECvKhS5LYry7L4Oz7CwKPf">Google Colab地址</a>.</p><h2 id="亏损盈利分布"><a href="#亏损盈利分布" class="headerlink" title="亏损盈利分布"></a>亏损盈利分布</h2><h3 id="当日相比前一日的盈亏情况"><a href="#当日相比前一日的盈亏情况" class="headerlink" title="当日相比前一日的盈亏情况"></a>当日相比前一日的盈亏情况</h3><blockquote><p>计算基于盘中价格相对于前一日最高价和最低价的不同盈亏情景概率。比如横座标</p><ul><li>0.05表明, 今日的最低价相比昨日的收盘价下跌超过5%</li><li>-0.05表明, 今日的最高价相比昨日的收盘价上涨超过5%</li></ul></blockquote><p>我本来是想使用正态分布做拟合的, 但是当我把数据贴给ChatGPT的时候, 它帮我做了几种不同分布的拟合分析,发现下面这个分布更加适合 Lorentzian 分布</p><table><thead><tr><th>特性</th><th>描述</th></tr></thead><tbody><tr><td><strong>重尾（fat tails）</strong></td><td>比高斯分布的尾部更“厚重”，意味着极端值出现的概率更高</td></tr><tr><td><strong>无定义的均值和方差</strong></td><td>理论上平均值、方差都<strong>不存在</strong>，因为积分发散</td></tr><tr><td><strong>中心尖锐</strong></td><td>峰值区域比高斯更尖锐，快速变化</td></tr><tr><td><strong>峰值对称</strong></td><td>关于中心对称</td></tr><tr><td><strong>多见于物理过程</strong></td><td>如<strong>共振峰</strong>、<strong>谱线展宽</strong>、<strong>傅里叶变换中的响应函数</strong></td></tr></tbody></table><div id='e6782097-d8f6-43e8-8e28-c501e7c730be' width="80%"></div><script>window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("e6782097-d8f6-43e8-8e28-c501e7c730be")) {                    Plotly.newPlot(                        "e6782097-d8f6-43e8-8e28-c501e7c730be",                        [{"marker":{"color":"blue"},"mode":"markers+lines","name":"Probability (Actual)","x":{"dtype":"f8","bdata":"CtejcD0Kt797FK5H4Xq0v+xRuB6F67G\u002fuB6F61G4rr+amZmZmZmpv3sUrkfheqS\u002fuB6F61G4nr8ZBFYOLbKdv9nO91PjpZu\u002fmpmZmZmZmb9aZDvfT42Xvxsv3SQGgZW\u002f2\u002fl+arx0k7+cxCCwcmiRv7gehetRuI6\u002fObTIdr6fir+6SQwCK4eGvzvfT42XboK\u002feekmMQisfL97FK5H4Xp0v3sUrkfhenQ\u002feekmMQisfD8730+Nl26CP7pJDAIrh4Y\u002fObTIdr6fij+4HoXrUbiOP5zEILByaJE\u002f2\u002fl+arx0kz8bL90kBoGVP1pkO99PjZc\u002fmpmZmZmZmT\u002fZzvdT46WbPxkEVg4tsp0\u002fuB6F61G4nj97FK5H4XqkP5qZmZmZmak\u002fuB6F61G4rj\u002fsUbgeheuxP3sUrkfherQ\u002fCtejcD0Ktz8="},"y":{"dtype":"f8","bdata":"HwdUrCQXgT8ptBo7hsmGP2xfzJ4eNog\u002fdgyTLYDojT\u002fnCGnX7VyVP5KLCJibxZs\u002f8bUvZk8Pqz\u002fVNrr7MzKtP1inttHdn7E\u002fFp58vscBtT89yri3RJG4P5yWV9Z6qbw\u002f5mbxhmuOwD\u002fBrWgGsjTEP1kaakqh1cg\u002f1Ta6+zMyzT95lHFviSLRP3ArmoEsDdU\u002f+u9CfO2L2T9Hd39GpkPePwk6ExaefN4\u002fs6eHDQbh2D8I9iN1md\u002fUP4kiMao+sM8\u002fbDAIx1+dyj88+XyPAyrGP1inttHdn8E\u002fbQFE76AEvT+b9N+F+Nq3PzwoQWfCwrM\u002ffjF7ethgsD\u002fxtS9mTw+rP\u002foeB1SsJKc\u002fiN5BCToTpj\u002fVNrr7MzKdPwOI3kEJOpM\u002fKbQaO4bJhj9isgUQvYOCP7m3RJEYVX8\u002fHwdUrCQXcT8="},"type":"scatter"},{"line":{"color":"red","dash":"dash"},"mode":"lines","name":"Probability (Fitted)","x":{"dtype":"f8","bdata":"CtejcD0Kt7+7\u002f9aJmfK2v20oCqP12ra\u002fHlE9vFHDtr\u002fQeXDVrau2v4Gio+4JlLa\u002fM8vWB2Z8tr\u002fk8wkhwmS2v5YcPToeTba\u002fR0VwU3o1tr\u002f5baNs1h22v6qW1oUyBra\u002fXL8Jn47utb8N6Dy46ta1v78QcNFGv7W\u002fcDmj6qKntb8iYtYD\u002f4+1v9OKCR1beLW\u002fhLM8Nrdgtb823G9PE0m1v+cEo2hvMbW\u002fmS3WgcsZtb9KVgmbJwK1v\u002fx+PLSD6rS\u002fradvzd\u002fStL9f0KLmO7u0vxD51f+Xo7S\u002fwiEJGfSLtL9zSjwyUHS0vyVzb0usXLS\u002f1puiZAhFtL+IxNV9ZC20vzntCJfAFbS\u002f6hU8sBz+s7+cPm\u002fJeOazv01nouLUzrO\u002f\u002f4\u002fV+zC3s7+wuAgVjZ+zv2LhOy7ph7O\u002fEwpvR0Vws7\u002fFMqJgoVizv3Zb1Xn9QLO\u002fKIQIk1kps7\u002fZrDustRGzv4rVbsUR+rK\u002fPP6h3m3isr\u002fuJtX3ycqyv59PCBEms7K\u002fUHg7KoKbsr8CoW5D3oOyv7TJoVw6bLK\u002fZfLUdZZUsr8WGwiP8jyyv8hDO6hOJbK\u002feWxuwaoNsr8rlaHaBvaxv9y91PNi3rG\u002fjuYHDb\u002fGsb8\u002fDzsmG6+xv\u002fE3bj93l7G\u002fomChWNN\u002fsb9UidRxL2ixvwWyB4uLULG\u002ftto6pOc4sb9oA269QyGxvxosodafCbG\u002fy1TU7\u002fvxsL98fQcJWNqwvy6mOiK0wrC\u002f385tOxCrsL+R96BUbJOwv0Ig1G3Ie7C\u002f9EgHhyRksL+lcTqggEywv1eabbncNLC\u002fCMOg0jgdsL+669PrlAWwv9YoDgri26+\u002fOXp0PJqsr7+cy9puUn2vv\u002f8cQaEKTq+\u002fYm6n08Ier7\u002fFvw0Ge++uvygRdDgzwK6\u002fi2LaauuQrr\u002fus0Cdo2Guv1AFp89bMq6\u002ftFYNAhQDrr8WqHM0zNOtv3n52WaEpK2\u002f3EpAmTx1rb8\u002fnKbL9EWtv6LtDP6sFq2\u002fBT9zMGXnrL9okNliHbisv8vhP5XViKy\u002fLjOmx41ZrL+RhAz6RSqsv\u002fTVciz++qu\u002fVyfZXrbLq7+6eD+Rbpyrvx3KpcMmbau\u002fgBsM9t49q7\u002fjbHIolw6rv0a+2FpP36q\u002fqA8\u002fjQewqr8LYaW\u002fv4Cqv26yC\u002fJ3Uaq\u002f0QNyJDAiqr80VdhW6PKpv5emPomgw6m\u002f+veku1iUqb9dSQvuEGWpv8CacSDJNam\u002fI+zXUoEGqb+GPT6FOdeov+mOpLfxp6i\u002fTOAK6ql4qL+vMXEcYkmovxKD104aGqi\u002fdNQ9gdLqp7\u002fXJaSzirunvzp3CuZCjKe\u002fnchwGPtcp78AGtdKsy2nv2NrPX1r\u002fqa\u002fxryjryPPpr8pDgri25+mv4xfcBSUcKa\u002f77DWRkxBpr9SAj15BBKmv7VTo6u84qW\u002fGKUJ3nSzpb979m8QLYSlv95H1kLlVKW\u002fQZk8dZ0lpb+k6qKnVfakvwY8CdoNx6S\u002faY1vDMaXpL\u002fM3tU+fmikvy8wPHE2OaS\u002fkoGio+4JpL\u002f10gjWptqjv1gkbwhfq6O\u002fu3XVOhd8o78exzttz0yjv4EYop+HHaO\u002f5GkI0j\u002fuor9Hu24E+L6iv6oM1Tawj6K\u002fDV47aWhgor9wr6GbIDGiv9IACM7YAaK\u002fNVJuAJHSob+Yo9QySaOhv\u002fv0OmUBdKG\u002fXkahl7lEob\u002fBlwfKcRWhvyTpbfwp5qC\u002fhzrULuK2oL\u002fqizphmoegv03doJNSWKC\u002fsC4HxgopoL8mANvwhfOfv+yip1X2lJ+\u002fskV0umY2n7946EAf19eevz6LDYRHeZ6\u002fBC7a6Lcanr\u002fI0KZNKLydv45zc7KYXZ2\u002fVBZAFwn\u002fnL8auQx8eaCcv+Bb2eDpQZy\u002fqP6lRVrjm79soXKqyoSbvzBEPw87Jpu\u002f+OYLdKvHmr+8idjYG2mav4QspT2MCpq\u002fSM9xovyrmb8Qcj4HbU2Zv9QUC2zd7pi\u002fnLfX0E2QmL9gWqQ1vjGYvyj9cJou05e\u002f7J89\u002f550l7+0QgpkDxaXv3jl1sh\u002ft5a\u002fQIijLfBYlr8EK3CSYPqVv8zNPPfQm5W\u002fkHAJXEE9lb9UE9bAsd6Uvxy2oiUigJS\u002f4FhvipIhlL+o+zvvAsOTv2yeCFRzZJO\u002fNEHVuOMFk7\u002f446EdVKeSv8CGboLESJK\u002fhCk75zTqkb9MzAdMpYuRvxBv1LAVLZG\u002f2BGhFYbOkL+ctG169m+Qv2RXOt9mEZC\u002fUPQNiK5lj7\u002fgOadRj6iOv2h\u002fQBtw642\u002f8MTZ5FAujb+ACnOuMXGMvwhQDHgStIu\u002fmJWlQfP2ir8g2z4L1DmKv7Ag2NS0fIm\u002fOGZxnpW\u002fiL\u002fIqwpodgKIv1DxozFXRYe\u002f4DY9+zeIhr9ofNbEGMuFv\u002fjBb475DYW\u002fgAcJWNpQhL8QTaIhu5ODv5iSO+ub1oK\u002fINjUtHwZgr+wHW5+XVyBvzhjB0g+n4C\u002fkFFBIz7Ef7+g3HO2\u002f0l+v8BnpknBz3y\u002f0PLY3IJVe7\u002fwfQtwRNt5vwAJPgMGYXi\u002fIJRwlsfmdr8wH6MpiWx1v1Cq1bxK8nO\u002fYDUIUAx4cr+AwDrjzf1wvyCX2uweB2+\u002fQK0\u002fE6ISbL+Aw6Q5JR5pv6DZCWCoKWa\u002f4O9uhis1Y78ABtSsrkBgv4A4cqZjmFq\u002fwGQ882mvVL+AIg2A4IxNvwB7oRntukG\u002fAFDXzOajJ78ATtfM5qMnP4B6oRntukE\u002fACINgOCMTT+AZDzzaa9UP0A4cqZjmFo\u002f4AXUrK5AYD\u002fA726GKzVjP6DZCWCoKWY\u002fYMOkOSUeaT9ArT8TohJsPwCX2uweB28\u002fcMA64839cD9QNQhQDHhyP0Cq1bxK8nM\u002fIB+jKYlsdT8QlHCWx+Z2P\u002fAIPgMGYXg\u002f4H0LcETbeT\u002fA8tjcglV7P7BnpknBz3w\u002fkNxztv9Jfj+AUUEjPsR\u002fPzBjB0g+n4A\u002fqB1ufl1cgT8g2NS0fBmCP5CSO+ub1oI\u002fCE2iIbuTgz94BwlY2lCEP\u002fDBb475DYU\u002fYHzWxBjLhT\u002fYNj37N4iGP0jxozFXRYc\u002fwKsKaHYCiD8wZnGelb+IP6gg2NS0fIk\u002fGNs+C9Q5ij+QlaVB8\u002faKPwBQDHgStIs\u002feApzrjFxjD\u002fwxNnkUC6NP2B\u002fQBtw640\u002f2DmnUY+ojj9I9A2IrmWPP2BXOt9mEZA\u002fmLRtevZvkD\u002fUEaEVhs6QPwxv1LAVLZE\u002fSMwHTKWLkT+AKTvnNOqRP7yGboLESJI\u002f9OOhHVSnkj8wQdW44wWTP2ieCFRzZJM\u002fpPs77wLDkz\u002fgWG+KkiGUPxi2oiUigJQ\u002fVBPWwLHelD+McAlcQT2VP8jNPPfQm5U\u002fACtwkmD6lT88iKMt8FiWP3Tl1sh\u002ft5Y\u002fsEIKZA8Wlz\u002fonz3\u002fnnSXPyT9cJou05c\u002fXFqkNb4xmD+Yt9fQTZCYP9AUC2zd7pg\u002fDHI+B21NmT9Ez3Gi\u002fKuZP4AspT2MCpo\u002fvInY2Btpmj\u002f05gt0q8eaPzBEPw87Jps\u002faKFyqsqEmz+k\u002fqVFWuObP9xb2eDpQZw\u002fGLkMfHmgnD9QFkAXCf+cP4xzc7KYXZ0\u002fxNCmTSi8nT8ALtrotxqePziLDYRHeZ4\u002fdOhAH9fXnj+sRXS6ZjafP+iip1X2lJ8\u002fIADb8IXznz+uLgfGCimgP0zdoJNSWKA\u002f6Is6YZqHoD+GOtQu4ragPyLpbfwp5qA\u002fwJcHynEVoT9cRqGXuUShP\u002fr0OmUBdKE\u002flqPUMkmjoT80Um4AkdKhP9AACM7YAaI\u002fbK+hmyAxoj8MXjtpaGCiP6gM1Tawj6I\u002fRLtuBPi+oj\u002fkaQjSP+6iP4AYop+HHaM\u002fHMc7bc9Moz+4ddU6F3yjP1gkbwhfq6M\u002f9NII1qbaoz+QgaKj7gmkPywwPHE2OaQ\u002fzN7VPn5opD9ojW8MxpekPwQ8CdoNx6Q\u002foOqip1X2pD9AmTx1nSWlP9xH1kLlVKU\u002fePZvEC2EpT8UpQnedLOlP7RTo6u84qU\u002fUAI9eQQSpj\u002fssNZGTEGmP4xfcBSUcKY\u002fKA4K4tufpj\u002fEvKOvI8+mP2BrPX1r\u002fqY\u002fABrXSrMtpz+cyHAY+1ynPzh3CuZCjKc\u002f1CWks4q7pz901D2B0uqnPxCD104aGqg\u002frDFxHGJJqD9I4ArqqXioP+iOpLfxp6g\u002fhD0+hTnXqD8g7NdSgQapP8CacSDJNak\u002fXEkL7hBlqT\u002f496S7WJSpP5SmPomgw6k\u002fNFXYVujyqT\u002fQA3IkMCKqP2yyC\u002fJ3Uao\u002fCGGlv7+Aqj+oDz+NB7CqP0S+2FpP36o\u002f4GxyKJcOqz98Gwz23j2rPxzKpcMmbas\u002fuHg\u002fkW6cqz9UJ9letsurP\u002fTVciz++qs\u002fkIQM+kUqrD8sM6bHjVmsP8jhP5XViKw\u002faJDZYh24rD8EP3MwZeesP6DtDP6sFq0\u002fPJymy\u002fRFrT\u002fcSkCZPHWtP3j52WaEpK0\u002fFKhzNMzTrT+wVg0CFAOuP1AFp89bMq4\u002f7LNAnaNhrj+IYtpq65CuPyQRdDgzwK4\u002fxL8NBnvvrj9gbqfTwh6vP\u002fwcQaEKTq8\u002fnMvablJ9rz84enQ8mqyvP9QoDgri268\u002fuOvT65QFsD8Iw6DSOB2wP1aabbncNLA\u002fpHE6oIBMsD\u002fySAeHJGSwP0Ig1G3Ie7A\u002fkPegVGyTsD\u002fezm07EKuwPyymOiK0wrA\u002ffH0HCVjasD\u002fKVNTv+\u002fGwPxgsodafCbE\u002faANuvUMhsT+22jqk5zixPwSyB4uLULE\u002fUonUcS9osT+iYKFY03+xP\u002fA3bj93l7E\u002fPg87JhuvsT+M5gcNv8axP9y91PNi3rE\u002fKpWh2gb2sT94bG7Bqg2yP8ZDO6hOJbI\u002fFhsIj\u002fI8sj9k8tR1llSyP7LJoVw6bLI\u002fAqFuQ96Dsj9QeDsqgpuyP55PCBEms7I\u002f7CbV98nKsj88\u002fqHebeKyP4rVbsUR+rI\u002f2Kw7rLURsz8mhAiTWSmzP3Zb1Xn9QLM\u002fxDKiYKFYsz8SCm9HRXCzP2DhOy7ph7M\u002fsLgIFY2fsz\u002f+j9X7MLezP0xnouLUzrM\u002fnD5vyXjmsz\u002fqFTywHP6zPzjtCJfAFbQ\u002fhsTVfWQttD\u002fWm6JkCEW0PyRzb0usXLQ\u002fcko8MlB0tD\u002fAIQkZ9Iu0PxD51f+Xo7Q\u002fXtCi5ju7tD+sp2\u002fN39K0P\u002fp+PLSD6rQ\u002fSlYJmycCtT+YLdaByxm1P+YEo2hvMbU\u002fNtxvTxNJtT+Eszw2t2C1P9KKCR1beLU\u002fIGLWA\u002f+PtT9wOaPqoqe1P74QcNFGv7U\u002fDOg8uOrWtT9avwmfju61P6qW1oUyBrY\u002f+G2jbNYdtj9GRXBTejW2P5QcPToeTbY\u002f5PMJIcJktj8yy9YHZny2P4Cio+4JlLY\u002fznlw1a2rtj8eUT28UcO2P2woCqP12rY\u002fuv\u002fWiZnytj8K16NwPQq3Pw=="},"y":{"dtype":"f8","bdata":"xSHvLhLKez85OdMw7gJ8P2yM\u002f7t4PHw\u002fDkDbmrR2fD+YnRSmpLF8P5i5+MRL7Xw\u002fcI3N7awpfT\u002fLmC4my2Z9P2EfbIOppH0\u002fuBjtKkvjfT\u002f355NSsyJ+PzXzJUHlYn4\u002f4DG2TuSjfj9iyxLls+V+P27fNYBXKH8\u002fCpO5rtJrfz+VfU8SKbB\u002fP+KSO2Be9X8\u002f9FPpMLsdgD+JWH56OkGAPx1tXQYvZYA\u002fwszY2JqJgD\u002fgb1sBgK6AP\u002fdEsprg04A\u002fxJxXy775gD\u002fX3MDFHCCBP\u002fKMrsj8RoE\u002fx9N+H2FugT\u002f6eIIiTJaBP7CCVDfAvoE\u002fP4Y00b\u002fngT8bxGNxTRGCP3UohadrO4I\u002fnkoAEh1mgj+mhmdeZJGCP5BN4UlEvYI\u002ficmUob\u002fpgj8g9RlD2RaDPyhF7RyURIM\u002f2gbnLvNygz+YlLaK+aGDP5OFYVSq0YM\u002fuv3GwggChD8uRScgGDOEP8jPr8rbZIQ\u002fS98LNVeXhD9i7PnmjcqEP2ME5n2D\u002foQ\u002f+UuJrTszhT+72I5AumiFP9AVPhkDn4U\u002fEeoqMhrWhT9s2OueAw6GP7ZV1ozDRoY\u002fy5HBQ16Ahj9D9M8m2LqGP0yQP7U19oY\u002fktVBi3syhz\u002f+x9pirm+HP3EKyBTTrYc\u002f6gxwme7shz9usdkJBi2IP0G\u002frKAebog\u002flH87uz2wiD9R45XaaPOIP8CVpqSlN4k\u002fY2Ra5fl8iT9FadKPa8OJPxFqob8AC4o\u002feeMUur9Tij\u002fmPYrvrp2KP8+u0PzU6Io\u002fh0+YrDg1iz+O+e744IKLP5d+ywzV0Ys\u002fQtqnRRwijD+eAis1vnOMP+AE46LCxow\u002f2yMQjjEbjT\u002fjtoEvE3GNP8GQhftvyI0\u002flsDqo1Ahjj+ZiBgavnuOP7FxOpHB144\u002fb26CgGQ1jz\u002f4C4KlsJSPP4q8mwaw9Y8\u002fLqrGejYskD9EcAoJeV6QPwuHWCalkZA\u002f6TO\u002fdMDFkD\u002f+YJnB0PqQP34eHAfcMJE\u002fe630behnkT8C3PdO\u002fJ+RP\u002f2E4zQe2ZE\u002fcxEz3lQTkj9q5Ac\u002fp06SP16nJoMci5I\u002fSHoKELzIkj81GA+HjQeTP10Qs8eYR5M\u002fM0Pz8eWIkz+g48BofcuTP0tOk9RnD5Q\u002fZBsXJq5UlD9P4\u002fuYWZuUP7ND4rZz45Q\u002fh8hrWgYtlT+idG6yG3iVP32+TUW+xJU\u002fXfB69PgSlj\u002fD9x4A12KWPwjO7wpktJY\u002fDcQzHqwHlz85HfWtu1yXP\u002fmJaJ2fs5c\u002fsDiJQ2UMmD8eXe1vGmeYP5g51m\u002fNw5g\u002fXeR+E40imT9MNK2zaIOZP3p1iDdw5pk\u002fqr25GrRLmj8N9dlzRbOaP+rmMfs1HZs\u002fIfLQEZiJmz+HOf\u002fIfvibP5qBEOr9aZw\u002fTDud\u002finenD9WkydZGFWdP5a7Mh7fzp0\u002frAfTTZVLnj\u002f04L3NUsueP\u002f8H4XMwTp8\u002fKxOJEUjUnz8Fzo8\u002f2i6gP\u002fsLRdRIdaA\u002fH3YZTX69oD9gdmPHiQehP1MO2f56U6E\u002ftZ4zVWKhoT+yPD\u002faUPGhP1UiXFRYQ6I\u002fuTV5SYuXoj\u002fLF48I\u002fe2iPxGpo7PBRqM\u002fmHheSu6hoz9UIDe1mP+jP4EqR9HXX6Q\u002fgr7JfMPCpD8jAVSkdCilPxvN0VAFkaU\u002foi1TtpD8pT8B17dDM2umP9C3RrMK3aY\u002fPqtAHDZSpz+AUH4F1sqnPyYXKnkMR6g\u002fHKuoGf3GqD8fF8M3zUqpP9cwJ+qj0qk\u002fti9UJqpeqj\u002fOrgrbCu+qPyvKWAzzg6s\u002fiolc8ZEdrD8IXNgTGbysPyIJt3G8X60\u002f+ymeoLIIrj\u002fx96\u002fzNLeuPwgAn6N\u002fa68\u002fLAmc\u002fOgSsD9lRUQ9N3OwP6JoZI3N1rA\u002f50+attA9sT\u002fpGn5tZ6ixP3yIPW66FrI\u002fGwHxmvSIsj\u002fStMEbQ\u002f+yPw18+IDVebM\u002fEjgN5934sz\u002fJK84ckXy0P7MftssmBbU\u002fLf6GotmStT9A1jyC5yW2P5exaq2RvrY\u002fxT8P+hxdtz9Sy+oF0gG4P20EWm39rLg\u002fo5ixBPBeuT\u002fi\u002fAwU\u002fxe6PyzQdpWE2Lo\u002fB1xCdd+guz\u002fiWlvUc3G8P3uuOkyrSr0\u002fkT8TNPUsvj9e86jmxhi\u002fP5yyDQROB8A\u002f4c1eZXuHwD8l6uwYMA3BP2iCfSi0mME\u002fuX0BQ1Mqwj9c6PjVXMLCPxCn5yEkYcM\u002fwxZPSAAHxD\u002fLXVBRTLTEP2STvSZnacU\u002foSHzgbMmxj8IIlXJl+zGP61HvNl9u8c\u002fqap5t9KTyD9AXd8hBnbJP+6ObAOKYso\u002fyJjXt9FZyz90fzggUVzMP0Ygj3x7as0\u002fPRrQAMKEzj8b\u002fpQakqvPP1lwx62pb9A\u002f7eUBfjIQ0T+OwgZ0jbfRP7IJFSXdZdI\u002fGpoTwzob0z\u002fel2TMs9fTP6hXiGlHm9Q\u002fhpwGduNl1T\u002fGfxA1YTfWP9ucdbaBD9c\u002f0fsQ9unt1z+VDOrGHtLYP0RJBaSAu9k\u002fhn8\u002fi0ep2j8C4FQSf5rbP0qc4vICjtw\u002fLjnuVnyC3T+SiAY7YHbeP4pxtUPvZ98\u002ffFLQs5sq4D+BewXmC57gP+uTCpIjDeE\u002fplodZa524T8ThQ1TbtnhPxh8ld8iNOI\u002fz830kJGF4j+8ma8+j8ziP8OebNAJCOM\u002fBQ8q5xE34z+6lrfa41jjP6eUQ3LvbOM\u002fjg8Ty91y4z9Op1T8lGrjP5stITA5VOM\u002fJ+WnGysw4z+gJyz1A\u002f\u002fiP9cZVDePweI\u002fe3Z4qMJ44j\u002fuRwE2tSXiP7wnhD2VyeE\u002fIl3V155l4T\u002flZBmoEvvgP\u002f6S+pUti+A\u002fn1\u002fMuiEX4D9EflhTIUDfP4lAsDsOTt4\u002fY3NSBfRZ3T8je+5tiWXcP9P7ccRQcts\u002ff93bV5iB2j+qwmxJfJTZPzaIo2Xpq9g\u002fDR61sKDI1z8w1gVfO+vWP7OH9\u002f4uFNY\u002f+4DzpdFD1T9Pmyj+XXrUP0COkhz3t9M\u002fBSRYD6z80j8fYWEbe0jSP1KKUqVUm9E\u002fDJoLxh310D8wpZqNslXQP67M4fLPec8\u002fftCfRxtVzj\u002fz+PVl3jzNP2S4zB2rMMw\u002fZIP\u002fxw8wyz8vt7jymDrKP\u002f0ZUcDST8k\u002ft0BqA0pvyD8edeshjZjHPzdoeccsy8Y\u002fAtz7brwGxj9ioc\u002fJ0krFP9ZOYgoKl8Q\u002f04wpFwDrwz+09jGqVkbDP\u002f6+4GCzqMI\u002fkEP2vr8Rwj8ICWUnKYHBP3pxJs2g9sA\u002f1D3bndtxwD9FlG9PJOW\u002fP7PS8vcA8b4\u002f75bTHcwGvj8LP4ssCya9Px3fZs1JTrw\u002fAfWroRl\u002fuz+pNtL8Ebi6P6iYgZ\u002fP+Lk\u002f7Kjcc\u002fRAuT95FX9LJ5C4P8eqfZ8T5rc\u002fB1CfUmlCtz9KzfR13KS2P8XG5g8lDbY\u002fk8vF5f56tT+RHN9HKe60P92KEeBmZrQ\u002ffiDYgn3jsz8H77sCNmWzP\u002fIcGwZc67I\u002fRO4w3711sj\u002fN30hmLASyP3\u002ffBdZ6lrE\u002fIxemqX4ssT8Fiit9D8awP7DeUe8GY7A\u002fLgA6hUADsD\u002fPiGkfM02vPy3PLCTima4\u002fa9X6VE\u002fsrT83YPD2PkStP1gZ6y14oaw\u002fqcfa1MQDrD8wkl5Y8WqrPy0JjJPM1qo\u002frXK\u002fridHqj9Qj1YA1rupP465OO+sNKk\u002fIN8Q14OxqD\u002f1Yx\u002fuMzKoP4B8iyyYtqc\u002fI\u002focNY0+pz\u002fC4Ug\u002f8cmmP1RufAKkWKY\u002fF1yToobqpT8sgWede3+lP9fRaLlmF6U\u002fgPYt9SyypD8GlO53tE+kP0JR2YLk76M\u002feIE4Y6WSoz\u002fWK1ll4DejP0nqKMh\u002f36I\u002fK9F\u002fsW6Joj97PQwjmTWiP5kH1+\u002fr46E\u002f4i9XslSUoT92pwzDwUahP5Fcmi8i+6A\u002fOi1YsmWxoD\u002fJ11WqfGmgP+5syBNYI6A\u002fPVu4AdO9nz+EO8olRjifP9bc0efutZ4\u002fzmr6oLM2nj\u002fZbeqje7qdP2KdtTEvQZ0\u002f2ZVcb7fKnD\u002fxltJb\u002flacPyXogcbu5Zs\u002fRPFHRnR3mz9lfuIwewubP5oKyJLwoZo\u002fKUhlJ8I6mj8BdbpR3tWZP6xaUxU0c5k\u002fiSaVD7MSmT+YjV1xS7SYPzjz7vjtV5g\u002fd4gl7Iv9lz+llfESF6WXP6JWE7KBTpc\u002fAAcVhr75lj9w63++wKaWP+JUSfl7VZY\u002fGsR0PuQFlj83fej77beVP24BcgGOa5U\u002fWAj4fLkglT+JtNf2ZdeUP03eak6Jj5Q\u002fEG61thlJlD9J2zezDQSUP8\u002f\u002f5BRcwJM\u002f2Ic59\u002ft9kz8eX3O95DyTP\u002fSQ5w8O\u002fZI\u002flyZ12W++kj8FohNFAoGSP\u002fDGe7u9RJI\u002fOXTp4JoJkj\u002ftYPWSks+RP8ifheadlpE\u002fSdrTJbZekT\u002fGQojO1CeRP3VJ6I\u002fz8ZA\u002ffS0YSQy9kD8Ajm4HGYmQP8Qq2QQUVpA\u002f9w1SpvcjkD8Ixsj0fOWPP3iOgG\u002fGhI8\u002fotS5d8Eljz8AuVATZMiOP7bhiJCkbI4\u002f5EGgg3kSjj9izXnE2bmNPxgPX2y8Yo0\u002f+6XX0xgNjT+9t5WQ5riMP\u002ftzdnMdZow\u002fDc6VhrUUjD8NnXQLp8SLPyVcMHnqdYs\u002fvM3Lengoiz+xzYftSdyKP1qmS99XkYo\u002frEQcjZtHij92rqFhDv+JP\u002fQluvOpt4k\u002fuGsaBWhxiT8Bl\u002fqAQiyJPx4Cz3oz6Ig\u002fLs8MLTWliD8wjvn3QWOIPwSThWBUIog\u002fI48wD2fihz9PB\u002fjOdKOHPz5CT4x4ZYc\u002fN1EgVG0ohz9a2NVSTuyGP5Q\u002fbdMWsYY\u002fXvmQPsJ2hj+cj7oZTD2GP+YqXAawBIY\u002fFEsRwenMhT+Ma9Yg9ZWFPzRQRxbOX4U\u002fXbvjqnAqhT8jT1oA2fWEP05f2U8DwoQ\u002fuHtl6euOhD\u002fafDUzj1yEP+jeE6npKoQ\u002fijnF2\u002ff5gz\u002fJpHNwtsmDP0ndHiAimoM\u002f\u002ffsQtzdrgz8Il1cU9DyDP50jQSlUD4M\u002f0XHe+FTigj80HYiX87WCPzvOZyotioI\u002fOioF5\u002f5egj\u002fZUNYSZjSCPxDH0wJgCoI\u002fabEPG+rggT\u002f6P1DOAbiBP\u002fovrZ2kj4E\u002fr0cwGNBngT\u002fVsnjagUCBPyQmYY63GYE\u002fCLKo6m7zgD8fLZ6ypc2AP0QgzrVZqIA\u002fkh6zz4iDgD++dGjnMF+AP6IbX+9PO4A\u002fAtsU5eMXgD\u002fzE5uh1el\u002fPzO2nIrFpH8\u002fokY2v5Ngfz+9FWuNPB1\u002fPxUxvFa82n4\u002fMQ+ujw+Zfj+8s1G\u002fMlh+PyMv0X4iGH4\u002fUF7\u002feNvYfT+8z+ppWpp9P5e0cx6cXH0\u002fDcXkc50ffT8dAI9XW+N8P6UvaMbSp3w\u002f8RqszABtfD8QUoCF4jJ8P4B9mhp1+Xs\u002f\u002fR3pw7XAez+GqT7HoYh7Pw=="},"type":"scatter"}],                        {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"legend":{"x":0.01,"y":0.99},"title":{"text":"Probability With Lorentzian Fitted Curven"},"xaxis":{"title":{"text":"Threshold (%)"}},"yaxis":{"title":{"text":"Probability"}},"width": "20%",},                        {"responsive": true}                    ).then(function(){                            var gd = document.getElementById('e6782097-d8f6-43e8-8e28-c501e7c730be');var x = new MutationObserver(function (mutations, observer) {{        var display = window.getComputedStyle(gd).display;        if (!display || display === 'none') {{            console.log([gd, 'removed!']);            Plotly.purge(gd);            observer.disconnect();        }}}});// Listen for the removal of the full notebook cellsvar notebookContainer = gd.closest('#notebook-container');if (notebookContainer) {{    x.observe(notebookContainer, {childList: true});}}// Listen for the clearing of the current output cellvar outputEl = gd.closest('.output');if (outputEl) {{    x.observe(outputEl, {childList: true});}}                        })                };</script><h3 id="连续的盈利或亏损"><a href="#连续的盈利或亏损" class="headerlink" title="连续的盈利或亏损"></a>连续的盈利或亏损</h3><blockquote><p>横座标表示连续几天, 5表示连续五天盈利, -5表示连续5天亏损这张图的统计结果表明, 连续3天以上都盈利或是亏损的概率只有不到10%, 连续5天以上的盈利亏损概率仅1%</p></blockquote><div id="e6ae1475-5e1b-47df-8c96-eccaed1f0323" class="plotly-graph-div" style="height:600px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("e6ae1475-5e1b-47df-8c96-eccaed1f0323")) {                    Plotly.newPlot(                        "e6ae1475-5e1b-47df-8c96-eccaed1f0323",                        [{"marker":{"color":"blue"},"mode":"markers+lines","name":"Probability (Actual)","x":{"dtype":"i1","bdata":"9vf4+fr7\u002fP3+\u002fwECAwQFBgcICQo="},"y":{"dtype":"f8","bdata":"AAAAAAAAAAAAAAAAAAAAAKsCb3B4xUY\u002fqwJvcHjFVj8AQlNUGhRxPwHjfH4nnok\u002fQKrdnp02oz\u002fxSNqrhhW5PzttJtgfk8s\u002fHUEuhEfS3j9+RCGbaMzdPxs54TLegco\u002florrrEwPtj8rMlrbcYCiP+vJz5DuXZA\u002fAeN8fieeeT8AQlNUGhRhP6sCb3B4xUY\u002fAAAAAAAAAAAAAAAAAAAAAA=="},"type":"scatter"},{"line":{"color":"red","dash":"dash"},"mode":"lines","name":"Probability (Fitted)","x":{"dtype":"f8","bdata":"AAAAAAAAJMCoaPyceusjwFHR+Dn11iPA+Tn11m\u002fCI8ChovFz6q0jwEkL7hBlmSPA8nPqrd+EI8Ca3OZKWnAjwEJF4+fUWyPA6q3fhE9HI8CTFtwhyjIjwDt\u002f2L5EHiPA4+fUW78JI8CMUNH4OfUiwDS5zZW04CLA3CHKMi\u002fMIsCEisbPqbciwC3zwmwkoyLA1Vu\u002fCZ+OIsB9xLumGXoiwCYtuEOUZSLAzpW04A5RIsB2\u002frB9iTwiwB5nrRoEKCLAx8+pt34TIsBvOKZU+f4hwBehovFz6iHAvwmfju7VIcBocpsracEhwBDbl8jjrCHAuEOUZV6YIcBgrJAC2YMhwAkVjZ9TbyHAsX2JPM5aIcBZ5oXZSEYhwAJPgnbDMSHAqrd+Ez4dIcBSIHuwuAghwPqId00z9CDAo\u002fFz6q3fIMBLWnCHKMsgwPPCbCSjtiDAnCtpwR2iIMBElGVemI0gwOz8YfsSeSDAlGVemI1kIMA9zlo1CFAgwOU2V9KCOyDAjZ9Tb\u002f0mIMA1CFAMeBIgwLzhmFLl+x\u002fADLORjNrSH8BchIrGz6kfwK1VgwDFgB\u002fA\u002fiZ8OrpXH8BO+HR0ry4fwJ7Jba6kBR\u002fA75pm6JncHsBAbF8ij7MewJA9WFyEih7A4Q5RlnlhHsAy4EnQbjgewIKxQgpkDx7A0oI7RFnmHcAjVDR+Tr0dwHQlLbhDlB3AxPYl8jhrHcAUyB4sLkIdwGWZF2YjGR3AtmoQoBjwHMAGPAnaDcccwFcNAhQDnhzAqN76Tfh0HMD4r\u002fOH7UscwEiB7MHiIhzAmVLl+9f5G8DqI941zdAbwDr11m\u002fCpxvAisbPqbd+G8Dbl8jjrFUbwCxpwR2iLBvAfDq6V5cDG8DNC7ORjNoawB7dq8uBsRrAbq6kBXeIGsC+f50\u002fbF8awA9RlnlhNhrAYCKPs1YNGsCw84ftS+QZwADFgCdBuxnAUZZ5YTaSGcCiZ3KbK2kZwPI4a9UgQBnAQwpkDxYXGcCU21xJC+4YwOSsVYMAxRjANH5OvfWbGMCFT0f36nIYwNYgQDHgSRjAJvI4a9UgGMB3wzGlyvcXwMeUKt+\u002fzhfAGGYjGbWlF8BoNxxTqnwXwLkIFY2fUxfACdoNx5QqF8BaqwYBigEXwKt8\u002fzp\u002f2BbA+034dHSvFsBMH\u002fGuaYYWwJzw6eheXRbA7cHiIlQ0FsA9k9tcSQsWwI5k1JY+4hXA3jXN0DO5FcAvB8YKKZAVwH\u002fYvkQeZxXA0Km3fhM+FcAhe7C4CBUVwHFMqfL96xTAwh2iLPPCFMAS75pm6JkUwGPAk6DdcBTAs5GM2tJHFMAEY4UUyB4UwFQ0fk699RPApQV3iLLME8D11m\u002fCp6MTwEaoaPycehPAl3lhNpJRE8DnSlpwhygTwDgcU6p8\u002fxLAiO1L5HHWEsDZvkQeZ60SwCmQPVhchBLAemE2klFbEsDKMi\u002fMRjISwBsEKAY8CRLAa9UgQDHgEcC8phl6JrcRwA14ErQbjhHAXUkL7hBlEcCuGgQoBjwRwP7r\u002fGH7EhHAT731m\u002fDpEMCfju7V5cAQwPBf5w\u002fblxDAQDHgSdBuEMCRAtmDxUUQwOHT0b26HBDAZEqV71\u002fnD8AG7YZjSpUPwKaPeNc0Qw\u002fASDJqSx\u002fxDsDo1Fu\u002fCZ8OwIp3TTP0TA7AKho\u002fp976DcDMvDAbyagNwGxfIo+zVg3ADgIUA54EDcCwpAV3iLIMwFBH9+pyYAzA8unoXl0ODMCSjNrSR7wLwDQvzEYyagvA1NG9uhwYC8B2dK8uB8YKwBYXoaLxcwrAuLmSFtwhCsBYXISKxs8JwPr+df6wfQnAnKFncpsrCcA8RFnmhdkIwN7mSlpwhwjAfok8zlo1CMAgLC5CReMHwMDOH7YvkQfAYnERKho\u002fB8ACFAOeBO0GwKS29BHvmgbARFnmhdlIBsDm+9f5w\u002fYFwIieyW2upAXAKEG74ZhSBcDK46xVgwAFwGqGnsltrgTADCmQPVhcBMCsy4GxQgoEwE5ucyUtuAPA7hBlmRdmA8CQs1YNAhQDwDBWSIHswQLA0vg59dZvAsB0mytpwR0CwBQ+Hd2rywHAtuAOUZZ5AcBWgwDFgCcBwPgl8jhr1QDAmMjjrFWDAMA6a9UgQDEAwLgbjilVvv+\u002f+GBxESoa\u002f784plT5\u002fnX+v4DrN+HT0f2\u002fwDAbyagt\u002fb8Adv6wfYn8v0C74ZhS5fu\u002fiADFgCdB+7\u002fIRaho\u002fJz6vwiLi1DR+Pm\u002fSNBuOKZU+b+QFVIge7D4v9BaNQhQDPi\u002fEKAY8CRo979Y5fvX+cP2v5gq37\u002fOH\u002fa\u002f2G\u002fCp6N79b8YtaWPeNf0v2D6iHdNM\u002fS\u002foD9sXyKP87\u002fghE9H9+ryvyDKMi\u002fMRvK\u002faA8WF6Gi8b+oVPn+df7wv+iZ3OZKWvC\u002fYL5\u002fnT9s77\u002fgSEZt6SPuv2DTDD2T2+y\u002f4F3TDD2T679w6Jnc5krqv\u002fByYKyQAum\u002fcP0mfDq657\u002fwh+1L5HHmv4AStBuOKeW\u002fAJ166zfh47+AJ0G74ZjivxCyB4uLUOG\u002fkDzOWjUI4L8gjilVvn\u002fdvyCjtvQR79q\u002fQLhDlGVe2L9AzdAzuc3Vv0DiXdMMPdO\u002fQPfqcmCs0L\u002fAGPAkaDfMv8BCCmQPFse\u002fwGwko7b0wb8ALn3Eu6a5vwAEY4UUyK6\u002fAFiXA2OFlL8AWJcDY4WUPwADY4UUyK4\u002fgC19xLumuT\u002fAbCSjtvTBP8BCCmQPFsc\u002fgBjwJGg3zD9A9+pyYKzQP0DiXdMMPdM\u002fIM3QM7nN1T8guEOUZV7YPyCjtvQR79o\u002fII4pVb5\u002f3T+APM5aNQjgPwCyB4uLUOE\u002fgCdBu+GY4j8AnXrrN+HjP3AStBuOKeU\u002f8IftS+Rx5j9w\u002fSZ8OrrnP+ByYKyQAuk\u002fYOiZ3OZK6j\u002fgXdMMPZPrP2DTDD2T2+w\u002f0EhGbekj7j9Qvn+dP2zvP+iZ3OZKWvA\u002fqFT5\u002fnX+8D9gDxYXoaLxPyDKMi\u002fMRvI\u002f4IRPR\u002ffq8j+YP2xfIo\u002fzP1j6iHdNM\u002fQ\u002fGLWlj3jX9D\u002fYb8Kno3v1P5Aq37\u002fOH\u002fY\u002fUOX71\u002fnD9j8QoBjwJGj3P9BaNQhQDPg\u002fiBVSIHuw+D9I0G44plT5PwiLi1DR+Pk\u002fwEWoaPyc+j+AAMWAJ0H7P0C74ZhS5fs\u002fAHb+sH2J\u002fD+4MBvJqC39P3jrN+HT0f0\u002fOKZU+f51\u002fj\u002f4YHERKhr\u002fP7AbjilVvv8\u002fOGvVIEAxAECYyOOsVYMAQPQl8jhr1QBAVIMAxYAnAUC04A5RlnkBQBQ+Hd2rywFAcJsracEdAkDQ+Dn11m8CQDBWSIHswQJAkLNWDQIUA0DsEGWZF2YDQExucyUtuANArMuBsUIKBEAIKZA9WFwEQGiGnsltrgRAyOOsVYMABUAoQbvhmFIFQISeyW2upAVA5PvX+cP2BUBEWeaF2UgGQKC29BHvmgZAABQDngTtBkBgcREqGj8HQMDOH7YvkQdAHCwuQkXjB0B8iTzOWjUIQNzmSlpwhwhAPERZ5oXZCECYoWdymysJQPj+df6wfQlAWFyEisbPCUC0uZIW3CEKQBQXoaLxcwpAdHSvLgfGCkDU0b26HBgLQDAvzEYyagtAkIza0ke8C0Dw6eheXQ4MQFBH9+pyYAxArKQFd4iyDEAMAhQDngQNQGxfIo+zVg1AyLwwG8moDUAoGj+n3voNQIh3TTP0TA5A6NRbvwmfDkBEMmpLH\u002fEOQKSPeNc0Qw9ABO2GY0qVD0BkSpXvX+cPQODT0b26HBBAkALZg8VFEEBAMeBJ0G4QQO5f5w\u002fblxBAno7u1eXAEEBOvfWb8OkQQP7r\u002fGH7EhFArBoEKAY8EUBcSQvuEGURQAx4ErQbjhFAvKYZeia3EUBq1SBAMeARQBoEKAY8CRJAyjIvzEYyEkB4YTaSUVsSQCiQPVhchBJA2L5EHmetEkCI7UvkcdYSQDYcU6p8\u002fxJA5kpacIcoE0CWeWE2klETQEaoaPycehNA9NZvwqejE0CkBXeIsswTQFQ0fk699RNAAmOFFMgeFECykYza0kcUQGLAk6DdcBRAEu+aZuiZFEDAHaIs88IUQHBMqfL96xRAIHuwuAgVFUDQqbd+Ez4VQH7YvkQeZxVALgfGCimQFUDeNc3QM7kVQIxk1JY+4hVAPJPbXEkLFkDsweIiVDQWQJzw6eheXRZASh\u002fxrmmGFkD6Tfh0dK8WQKp8\u002fzp\u002f2BZAWqsGAYoBF0AI2g3HlCoXQLgIFY2fUxdAaDccU6p8F0AWZiMZtaUXQMaUKt+\u002fzhdAdsMxpcr3F0Ak8jhr1SAYQNQgQDHgSRhAhE9H9+pyGEA0fk699ZsYQOSsVYMAxRhAlNtcSQvuGEBACmQPFhcZQPA4a9UgQBlAoGdymytpGUBQlnlhNpIZQADFgCdBuxlAsPOH7UvkGUBgIo+zVg0aQBBRlnlhNhpAvH+dP2xfGkBsrqQFd4gaQBzdq8uBsRpAzAuzkYzaGkB8OrpXlwMbQCxpwR2iLBtA3JfI46xVG0CIxs+pt34bQDj11m\u002fCpxtA6CPeNc3QG0CYUuX71\u002fkbQEiB7MHiIhxA+K\u002fzh+1LHECo3vpN+HQcQFQNAhQDnhxABDwJ2g3HHEC0ahCgGPAcQGSZF2YjGR1AFMgeLC5CHUDE9iXyOGsdQHQlLbhDlB1AJFQ0fk69HUDQgjtEWeYdQICxQgpkDx5AMOBJ0G44HkDgDlGWeWEeQJA9WFyEih5AQGxfIo+zHkDwmmbomdweQJzJba6kBR9ATPh0dK8uH0D8Jnw6ulcfQKxVgwDFgB9AXISKxs+pH0AMs5GM2tIfQLzhmFLl+x9ANAhQDHgSIECMn1Nv\u002fSYgQOQ2V9KCOyBAPM5aNQhQIECUZV6YjWQgQOz8YfsSeSBARJRlXpiNIECcK2nBHaIgQPLCbCSjtiBASlpwhyjLIECi8XPqrd8gQPqId00z9CBAUiB7sLgIIUCqt34TPh0hQAJPgnbDMSFAWOaF2UhGIUCwfYk8zlohQAgVjZ9TbyFAYKyQAtmDIUC4Q5RlXpghQBDbl8jjrCFAaHKbK2nBIUC+CZ+O7tUhQBahovFz6iFAbjimVPn+IUDGz6m3fhMiQB5nrRoEKCJAdv6wfYk8IkDOlbTgDlEiQCYtuEOUZSJAfMS7phl6IkDUW78Jn44iQCzzwmwkoyJAhIrGz6m3IkDcIcoyL8wiQDS5zZW04CJAjFDR+Dn1IkDi59RbvwkjQDp\u002f2L5EHiNAkhbcIcoyI0Dqrd+ET0cjQEJF4+fUWyNAmtzmSlpwI0Dyc+qt34QjQEgL7hBlmSNAoKLxc+qtI0D4OfXWb8IjQFDR+Dn11iNAqGj8nHrrI0AAAAAAAAAkQA=="},"y":{"dtype":"f8","bdata":"YEKUjo5I1D093CfL3FrYPTL4wSngON09xUopw6SE4T3U0SQC9fzkPZxAJAR8IOk9VQdzAUYP7j0uv2uQl\u002ffxPfRWyxt0dvU95ruBxZOe+T0cDYBZBo\u002f+PRMLmfUvNgI+OX88b9WwBT6wxgTpwNAJPueBlNqrsw4+VRoUUT0+Ej433P8ODaoVPl2t4HJAtRk+OZftzex7Hj5+S7Emdw8iPococwpYYiU+sGQS2wlNKT6ZVy9avuktPmWU+FqBqzE+Q2c83TjcND6C3I2cwJs4PuiE6Es3Aj0+L+JSwdMVQT47DHYaUhxEPpfFEzd+p0c+64ncyUTNSz7MlS75hlNQPtv4+VkiKVM+HAX\u002fAHl4Vj5lvKgGN1VaPpV8H2sV1l4+7D3s2aYKYj72YybjjhhlPmmcehIvpmg+BDiCe5bHbD5bdY4j7MlwPiBlUxy9knM+K6BqE3nNdj4z51Immot6Pso0o0cq4X4+x\u002fYRRY\u002fygT4YwxEy39iEPmcHhzCMMog+rCGI8MIQjD6mshztj0OQPq0UrmQB1pI+mYEvqXbMlT7toGJldjWZPs+34LeIIZ0+WkZ6Cr3RoD5u5AslU2ijPhP8xEWmYKY+\u002fiXYxXbIqT43io9aWq+tPngc3m57E7E+lOQz9aGhsz6uf0cDao22PjCQ7BGT47k+pHzdKYCyvT6BwdMnNQXBPsNuHULMfsM+XmAm9E5Qxj4rInJOT4XJPndNMgTOKs0+OjVNTbKn0D6GXnMDugHTPgTdXhKsrNU+nm1kO9Cy2D6umwRWpx\u002fcPpnIYdsGAOA+9XtigDAx4j6jGeHWVKvkPsJVlE5kd+c+O6BNgFSf6j6bcNmAOy7uPo\u002fhquA2GPE+TR5qWM9Z8z7yBRgrguP1PtmPEQ6\u002fvfg+9p9rht\u002fx+z4BBLXePYr\u002fPviHRgsnyQE\u002fIMPEd1wLBD+bcEGevJIGP8gG+sz9Zgk\u002fu0XTW6CQDD+OZ1iXgAwQP7CSb9U2BRI\u002fxFjlmhw4FD9v5OwpaqsWP5vTZL\u002fyZRk\u002fw\u002fex5TFvHD8wDWC7Wc8fP8Oy4RyxxyE\u002fkiD0w4zcIz+RaQ6zmismP7PIJ9+yuig\u002f4yapMjSQKz\u002fstWgMD7MuP9W7XDFoFTE\u002flDAGyNb\u002fMj+seCpnSB01P+cvAzOTcjc\u002f786HSvUEOj8WD90YHNo8P7gpXAYs+D8\u002fcPtAReSyQT9o9dlPDpVDP85ircxxpkU\u002fmPgrLjnrRz9dPKl84GdKP9dp4VM6IU0\u002f5jwAiDoOUD+td3kUkK9RP2VRNN2Yd1M\u002fKvdEG4ZpVT9zK3ggwohXPxyGflfz2Fk\u002f48MUVf9dXD+gmjT4DRxfPz+viUvGC2E\u002frRk1m5iqYj+bZhvk\u002fmxkP6oEarehVWY\u002fAqR74FJnaD90T2UFD6VqP4yYAkT\u002fEW0\u002fl0ZFyXqxbz9GFzAwhENxPxLhm\u002fsvy3I\u002f1N+qCrZxdD9dSTihJTl2PzVatayoI3g\u002fqopBYoQzej8h16LPGWt8P7iXUV3mzH4\u002fajPcH8KtgD+Dd9tq1QyCP5gvM3kXhYM\u002fo\u002foHiAEYhT9S6By1G8eGP8UjUv78k4g\u002fA0yFMkuAij\u002fUmrrSuo2MP\u002fQ7deIOvo4\u002flw4TU4yJkD8Km02nW8eRP3PvLshrGZM\u002f1bj6krmAlD+jGgYeSP6VP5vHP2Mgk5c\u002ftOe43lBAmT\u002fqz8Eg7QabP+qsNlMN6Jw\u002fBJyisc3knj\u002f6qvX5Jn+gP5c+olXYmqE\u002fOu+bSA3Goj9CvE\u002fkWAGkP4xzP4hOTaU\u002fUuxddIGqpj8KNmRUhBmoP5FbM8Tomqk\u002fOxNhzT4vqz8V8RheFNesPwheh7n0kq4\u002fatgH8bMxsD9jms3+eCSxP5LSLVoJIrI\u002fUUs0RaIqsz89LVYafj60P6QH0fTTXbU\u002fuNY5V9eItj\u002f074nQt7+3P\u002fUf\u002fp+gArk\u002fhoMiWLhRuj8zq2uBIK27P0Fgwzz1FL0\u002fMtV05kyJvj++kvTcGwXAP8vZVLvfy8A\u002f4hORg\u002fOYwT8VwM8UVWzCP19dBo7+RcM\u002ffQ54JeYlxD+F9BYC\u002fgvFP1M0Cxc0+MU\u002f48OiAXLqxj8K4+zpnOLHP4t8Q2aV4Mg\u002fY5sDYjfkyT+VnbQHWu3KP0PY267P+8s\u002f9vm3zWUPzT9VmRzv5CfOP4UPo6wQRc8\u002fH\u002fyw1lMz0D\u002fJPqzUMcbQP3T52rj8WtE\u002f\u002f5oQf4zx0T8I7Y6\u002ftonSPwqp07pOI9M\u002fgBEKaCW+0z\u002feViaGCVrUP6Itra\u002fH9tQ\u002fH3omcSqU1T\u002fMWTZi+jHWP+ogVEH+z9Y\u002f6CETEvtt1z8gSu09tAvYPyDRe7frqNg\u002f52wGIGJF2T9fvU3v1uDZP9XvcZ0Ie9o\u002f0gLTzrQT2z95lsSBmKrbPxfg6z1wP9w\u002fLisbRfjR3D9rWXvF7GHdP3wQ0QwK790\u002f7sGovAx53j\u002fFdzL\u002fsf\u002feP\u002fZYlLy3gt8\u002fd5c8aO4A4D\u002fgbc+fcD7gP+LWkzbDeeA\u002f+Wi4p8ey4D+k6xdSYOngPxahzJFwHeE\u002fdk0p2dxO4T9BlvnIin3hP3Hp60dhqeE\u002fjN8HmUjS4T+e\u002fRRxKvjhP5zb1gryGuI\u002fG\u002f4EOow64j86J+Z851biP\u002f9+eAz0b+I\u002fW7UR66OF4j9mJGTx6pfiP7D919m+puI\u002fxq0pShey4j\u002fK2kDb7bniP2GxNR8+vuI\u002faZN8pQW\u002f4j9gqTL9Q7ziPyVOiLX6teI\u002fmshIXC2s4j+qQ4F64Z7iP5tuS48ejuI\u002fxqHCCO554j8yyiw7W2LiP3e1YlZzR+I\u002fcZqFWUUp4j9M5xEF4gfiP4xuYctb4+E\u002fZv+wv8a74T9JR7+DOJHhP8mHHDTIY+E\u002fmjJEU44z4T+32pqzpADhP6YcbGAmy+A\u002faSUFhi+T4D96WAlZ3VjgPwQ+H\u002f1NHOA\u002fhroo1kC73z9J4y2t6DnfP5cISSfUtN4\u002fQMGY90Qs3j9fMcmmfaDdP03An13BEd0\u002fuNTjr1OA3D\u002fhad5neOzbP+B5qFJzVts\u002fkRh+DYi+2j\u002fysknU+STaP3dAmFELitk\u002f7VEkcP7t2D\u002fM0iIuFFHYPzwOeXKMs9c\u002fgRwA5KUV1z9qUfbCnXfWPwmcu8Sv2dU\u002fzQ7y8RU81T\u002fO\u002fheHCJ\u002fUP9Bcrde9AtQ\u002frhzyM2pn0z\u002fJukfRP83SPyI2PLVuNNI\u002fpy5BoySd0T+bSg4NjQfRP4aUqgXRc9A\u002fg2wqbi7Ezz\u002fdmQW1B6XOPxwtQ2Zxis0\u002f99SnFqp0zD89pJto62PLP2daABBqWMo\u002f+TVz2lVSyT+mzca72VHIP8vnfd4bV8c\u002f3jkNuD1ixj8bXKcgXHPFP4YXVG6PisQ\u002fWH4Sk+unwz\u002fa\u002fMM9gMvCPyS7nf1Y9cE\u002f3z\u002fdZ30lwT\u002fMQH0\u002f8VvAP3XgTz1pMb8\u002fCqtJQ4i3vT+6qgImMkq8PyT0aDFT6bo\u002fP4QAxNGUuT\u002fDcamrjky4P2Wx9oJlELc\u002fT1enDi3gtT8Ajtmat7u0P8wclFfTorM\u002fiUZJtEqVsj8T7vu55JKxP5hEtmNlm7A\u002feHEP6htdrz\u002fo0oycOpitP+DfrXyg56s\u002fdcmHo8NKqj+nCOo9F8GoP42GuB4MSqc\u002fidbqShHlpT969PV+lJGkPxHbca0CT6M\u002f6rPXdsgcoj83WUCaUvqgPz6YKr4czp8\u002fQUhg79PEnT+ag9u5qdebP5R4hkWABZo\u002fyxPViz1NmD9fmIjly62WP4nSJYsaJpU\u002fpGxyCB61kz8G31ij0FmSP4oYnLYyE5E\u002fFs6YAZbAjz\u002fSqezPTYCNP5JpFGW1Y4s\u002fVOL\u002fawNpiT+9\u002fXz3fI6HP94borl10oU\u002fhbLrKVAzhD8TmSabfa+CP\u002fBlQEJ+RYE\u002fVkYrXsLnfz8AD6VwiHJ9P\u002f7n7LanKHs\u002fb6QJJJYHeT+Xc8455gx3P+ku+o1GNnU\u002fsiGZP4GBcz8gUX5ee+xxP9KulUY0dXA\u002fDRB44Ykzbj\u002f4RWh1vrBrP4MjdU+aXmk\u002fytpGNuA5Zz8BUa0cgD9lP+oj0oaVbGM\u002f0lDz6mW+YT8qPckPXzJgP6AxHtUqjF0\u002fw2bz\u002fITuWj9bP35+hodYP8MTUvAsU1Y\u002fATIJcrZNVD+rcjqUnnNSP2apl1CbwVA\u002frYMHKDRpTj9fX124eZNLP1K5ENSu\u002fEg\u002fLOVEFNmfRj9wpsbnVnhEP2lsdYDagUI\u002fgYG08GS4QD+8lCfzgjA+P7N\u002fIxQCPDs\u002fY6Ei3+uMOD8KDbxuXx02P97mvYHu5zM\u002fFonK\u002f5XnMT9tNKvcthcwP26SDLEe6Cw\u002f2s\u002fCNWnxKT+9WzhMGUQnP3n8u0GR2SQ\u002fOmyP5b6rIj9dZjFjEbUgP41Zcm\u002ff4B0\u002fPzGQeF+yGj\u002faFvh+G9YXP4SGfk9JRBU\u002fPgOcMM31Ej+lM58lLOQQPxVGtz3+Eg4\u002fT0WoFc7ACj+PCit5A8gHPxVWbje\u002fHwU\u002ffq6BJfS\u002fAj+7Ug5iVaEAP9ifodWLev0+nj\u002fD3pIb+j6QlTyb7Br3Pq4Wm0nRbvQ+4tjL2mwO8j6XkLYQkuPvPn6F6WByI+w++0WcsI\u002fP6D5hN4xuS9zlPqxkIl00P+M+H9C8Jeru4D4HKYK7BsbdPvIIipzrJ9o+kIXqowH21j6sDkg\u002fMyTUPkj8I7Wyp9E+baU9ELPtzj6q5g6yFRLLPt7T9BAxrcc+FIuDulWxxD5OPLPxVBLCPgBj4J2xir8+HMnocoCBuz46y4fG\u002fPe3PkLkoO\u002f63rQ+VoIWZwgpsj7hQiaCeJSvPg2RcucYcKs+7s1x8U7Spz7PNKXBo6qkPoYTYfKO6qE+Vj7kqn4Knz7k\u002foYM096aPnytZno3Ppc+tZahvSwXlD67xZCbUVqRPm+nZkVI9I0+nrKLsZPViT6u668pvEOGPp1Zt8KLLIM+5ZnBoxGAgD5pvS8auWB8PqbC1pF6Yng+5jRNWCDwdD62lbDGGfdxPrxVKG5vzm4+av0zo8Jkaj6CDkhyo5hmPpVpnDK7VGM+hK0pZH+GYD7gW6NWrjtcPsit1oqXGVg+SnThY4WOVD4zWLLegIVRPq2\u002fjCnL2E0+1Sk4bAdnST437DiQm5pFPiIPpoEhXEI+LFz9+tQuPz5F4IEII3Y6PgWHDbU3cDY+9LbsuUsDMz6U52JBNRkwPv33RR7UPSs+J7b4YSQIJz7Jmz5CUnUjPjd4xQdXbSA+DwhxkD+3Gz5H964OJF0XPtTBKwpCrhM+AMSSGOOQED7WLglsKd4LPmIx0Os9bAc+Op8QWRysAz4TAgMSmoIAPvAQHqkzsfs9NDR6DOo09z0tp5iD9G7zPZXkjYT8QvA9rHfnlfIx6z0kPnBVGbnmPc611Mru+OI97doO5Iao3z1R3NpC1WTaPaCSgIwY\u002fdU9ZwlrfCBO0j1Z9XqYfnTOPQ=="},"type":"scatter"}],                        {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"legend":{"x":0.01,"y":0.99},"title":{"text":"Probability With Gaussian Fitted Curve"},"xaxis":{"title":{"text":"Days"}},"yaxis":{"title":{"text":"Probability"}},"width":800,"height":600},                        {"responsive": true}                    )                };            </script><h2 id="收益预期管理"><a href="#收益预期管理" class="headerlink" title="收益预期管理"></a>收益预期管理</h2><h3 id="股票降价后的收益率"><a href="#股票降价后的收益率" class="headerlink" title="股票降价后的收益率"></a>股票降价后的收益率</h3><blockquote><p>这里计算得到的图表内容解释</p><ul><li>Expected Return 的数字表示预期盈利是 4%</li><li>以横座标为3为例, 它意味着当日的股票比前一天最高价低了3%以上</li><li>纵座标表示的是达到预期收益的, 如果以 14 天这条线为例, 它表示, 在未来14个交易日中, 能达到4%收益的概率接近60%</li></ul></blockquote><p>如果使用更加简单的例子</p><blockquote><ul><li>第0天, high: 1.0(最高价)</li><li>第1天: low: 0.97 (存在一个价格比前一天低了3%)</li><li>第2天: ….</li><li>第3天: ….</li><li>第14天: 存在一个价格大于 0.97 * 1.04 的概率接近是60%</li></ul></blockquote><p>可以看到, 随着我们的耐心等待, 从7天,14天,到21天,30天之后, 获利概率其实是逐步提升的.</p><div id="5a5d9953-9b13-4396-ad9f-b45860631c27"> </div><script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("5a5d9953-9b13-4396-ad9f-b45860631c27")) {                    Plotly.newPlot(                        "5a5d9953-9b13-4396-ad9f-b45860631c27",                        [{"mode":"lines+markers","name":"7 Days","x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[0.1566265060240964,0.16793066088840736,0.19614147909967847,0.22926829268292684,0.2595419847328244,0.373015873015873,0.46875,0.4883720930232558,0.4642857142857143,0.5652173913043478],"type":"scatter"},{"mode":"lines+markers","name":"14 Days","x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[0.2851817334575955,0.2981501632208923,0.317741935483871,0.36341463414634145,0.37786259541984735,0.5079365079365079,0.65625,0.6744186046511628,0.6428571428571429,0.6521739130434783],"type":"scatter"},{"mode":"lines+markers","name":"21 Days","x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[0.35767790262172283,0.36899563318777295,0.3790322580645161,0.424390243902439,0.4389312977099237,0.5873015873015873,0.71875,0.7441860465116279,0.75,0.782608695652174],"type":"scatter"},{"mode":"lines+markers","name":"30 Days","x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[0.4265536723163842,0.43468715697036225,0.43344155844155846,0.48284313725490197,0.4942528735632184,0.6349206349206349,0.734375,0.7906976744186046,0.7857142857142857,0.782608695652174],"type":"scatter"}],                        {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"title":{"text":"Rise Probability for Different Drop Thresholds Over Various Future Days\u003cbr\u003e(Expected Return: 4.0%)"},"xaxis":{"title":{"text":"Drop Threshold (%)"}},"yaxis":{"title":{"text":"Rise Probability"}},"width":800,"height":600,"hovermode":"x unified"},                        {"responsive": true}                    ).then(function(){                            var gd = document.getElementById('5a5d9953-9b13-4396-ad9f-b45860631c27');var x = new MutationObserver(function (mutations, observer) {{        var display = window.getComputedStyle(gd).display;        if (!display || display === 'none') {{            console.log([gd, 'removed!']);            Plotly.purge(gd);            observer.disconnect();        }}}});// Listen for the removal of the full notebook cellsvar notebookContainer = gd.closest('#notebook-container');if (notebookContainer) {{    x.observe(notebookContainer, {childList: true});}}// Listen for the clearing of the current output cellvar outputEl = gd.closest('.output');if (outputEl) {{    x.observe(outputEl, {childList: true});}}                        })                };            </script><h3 id="降价后的收益率-3D"><a href="#降价后的收益率-3D" class="headerlink" title="降价后的收益率-3D"></a>降价后的收益率-3D</h3><p>我尝试使用plotly也制作了 3D 的曲面, 可能没那么光滑, 不过只是查询看起来足够了.</p><div id="bc03a572-4b63-49c2-b15e-833fb96f5f19" class="plotly-graph-div" style="height:600px; width:100%;"></div><script>window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("bc03a572-4b63-49c2-b15e-833fb96f5f19")) {                    Plotly.newPlot(                        "bc03a572-4b63-49c2-b15e-833fb96f5f19",                        [{"colorscale":[[0.0,"#440154"],[0.1111111111111111,"#482878"],[0.2222222222222222,"#3e4989"],[0.3333333333333333,"#31688e"],[0.4444444444444444,"#26828e"],[0.5555555555555556,"#1f9e89"],[0.6666666666666666,"#35b779"],[0.7777777777777778,"#6ece58"],[0.8888888888888888,"#b5de2b"],[1.0,"#fde725"]],"x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[7,14,21,30],"z":{"dtype":"f8","bdata":"yOfE0KxYyz9IvPZCweLMP6gNDpL65c8\u002f0u2M+7Eo0j9D9Q0Yq7jVPwgIeS6PIts\u002fSPbKSt8d4D9aAARqaGPhP1LTKNMH+OE\u002f8H3jdE6Z4j8kzXxQAtTRPwa\u002fxurnhdI\u002fsvi3pdXu0z\u002fd3gdqzx3WPwJ+sPcvx9k\u002fbJpAiqGR3z9MqarRBpbiP+itIaSnAOQ\u002fUhnJIg195D\u002f6DhdNGdzkPxcct8Rgn9Y\u002fxLiLp1ot1z+m5DzkY2bYP8Rs6tMQgto\u002ftoAH9yo63j8O12jCrBriP3BFv\u002fI0CuU\u002fvZTl6TSh5j8EmeYHcirnP\u002f6Mya8eZ+c\u002fgAK\u002fUv+g2T\u002f6fXRK5g7aP+DK2TiTHds\u002fb3bKm6Qk3T\u002f8bwSdRWngP9zjA6CJWeM\u002fb5iSXIo\u002f5j+ByrVO2+vnP9NjUAXpgOg\u002f\u002fN+0Pbuq6D8=","shape":"4, 10"},"type":"surface"},{"line":{"color":"red","width":6},"mode":"lines+markers","name":"Max Gradient Slice","x":[3.0,3.0,3.0,3.0],"y":[7,14,21,30],"z":{"dtype":"f8","bdata":"CAh5Lo8i2z9smkCKoZHfPw7XaMKsGuI\u002f3OMDoIlZ4z8="},"type":"scatter3d"}],                        {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermap":[{"type":"scattermap","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"}}},"title":{"text":"3D Rise Probability Surface\u003cbr\u003e(Expected Return: 4.0%)"},"width":800,"height":600,"scene":{"xaxis":{"title":{"text":"Drop Threshold (%)"}},"yaxis":{"title":{"text":"Future Days"}},"zaxis":{"title":{"text":"Rise Probability (%)"}}}},                        {"responsive": true}                    ).then(function(){                            var gd = document.getElementById('bc03a572-4b63-49c2-b15e-833fb96f5f19');var x = new MutationObserver(function (mutations, observer) {{        var display = window.getComputedStyle(gd).display;        if (!display || display === 'none') {{            console.log([gd, 'removed!']);            Plotly.purge(gd);            observer.disconnect();        }}}});// Listen for the removal of the full notebook cellsvar notebookContainer = gd.closest('#notebook-container');if (notebookContainer) {{    x.observe(notebookContainer, {childList: true});}}// Listen for the clearing of the current output cellvar outputEl = gd.closest('.output');if (outputEl) {{    x.observe(outputEl, {childList: true});}}                        })                };            </script><h3 id="平均套牢天数"><a href="#平均套牢天数" class="headerlink" title="平均套牢天数"></a>平均套牢天数</h3><p>我这里的评价套牢天数的定义是, 当你用某个价位买入时, 比如1元, 你想要以1.025d的价格卖出, 需要的时间分布.从图中的数据来看, 在1.41到1.48这段买入后, 平均时间是最短的, 大概是21个交易日内就可以获得2.5%的收益</p><div id="060dd9bf-a2d6-4689-ab54-cf9aee77323b" class="plotly-graph-div" style="height:600px; width:100%;"></div><script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("060dd9bf-a2d6-4689-ab54-cf9aee77323b")) {                    Plotly.newPlot(                        "060dd9bf-a2d6-4689-ab54-cf9aee77323b",                        [{"mode":"lines+markers","x":[1.3,1.301,1.3019999999999998,1.3029999999999997,1.3039999999999996,1.3049999999999995,1.3059999999999994,1.3069999999999993,1.3079999999999992,1.308999999999999,1.309999999999999,1.3109999999999988,1.3119999999999987,1.3129999999999986,1.3139999999999985,1.3149999999999984,1.3159999999999983,1.3169999999999982,1.317999999999998,1.318999999999998,1.3199999999999978,1.3209999999999977,1.3219999999999976,1.3229999999999975,1.3239999999999974,1.3249999999999973,1.3259999999999972,1.326999999999997,1.327999999999997,1.3289999999999969,1.3299999999999967,1.3309999999999966,1.3319999999999965,1.3329999999999964,1.3339999999999963,1.3349999999999962,1.335999999999996,1.336999999999996,1.3379999999999959,1.3389999999999957,1.3399999999999956,1.3409999999999955,1.3419999999999954,1.3429999999999953,1.3439999999999952,1.344999999999995,1.345999999999995,1.3469999999999949,1.3479999999999948,1.3489999999999946,1.3499999999999945,1.3509999999999944,1.3519999999999943,1.3529999999999942,1.353999999999994,1.354999999999994,1.3559999999999939,1.3569999999999938,1.3579999999999937,1.3589999999999935,1.3599999999999934,1.3609999999999933,1.3619999999999932,1.362999999999993,1.363999999999993,1.3649999999999929,1.3659999999999928,1.3669999999999927,1.3679999999999926,1.3689999999999924,1.3699999999999923,1.3709999999999922,1.3719999999999921,1.372999999999992,1.373999999999992,1.3749999999999918,1.3759999999999917,1.3769999999999916,1.3779999999999915,1.3789999999999913,1.3799999999999912,1.3809999999999911,1.381999999999991,1.382999999999991,1.3839999999999908,1.3849999999999907,1.3859999999999906,1.3869999999999905,1.3879999999999904,1.3889999999999902,1.3899999999999901,1.39099999999999,1.39199999999999,1.3929999999999898,1.3939999999999897,1.3949999999999896,1.3959999999999895,1.3969999999999894,1.3979999999999893,1.3989999999999891,1.399999999999989,1.400999999999989,1.4019999999999888,1.4029999999999887,1.4039999999999886,1.4049999999999885,1.4059999999999884,1.4069999999999883,1.4079999999999881,1.408999999999988,1.409999999999988,1.4109999999999878,1.4119999999999877,1.4129999999999876,1.4139999999999875,1.4149999999999874,1.4159999999999873,1.4169999999999872,1.417999999999987,1.418999999999987,1.4199999999999868,1.4209999999999867,1.4219999999999866,1.4229999999999865,1.4239999999999864,1.4249999999999863,1.4259999999999862,1.426999999999986,1.427999999999986,1.4289999999999858,1.4299999999999857,1.4309999999999856,1.4319999999999855,1.4329999999999854,1.4339999999999853,1.4349999999999852,1.435999999999985,1.436999999999985,1.4379999999999848,1.4389999999999847,1.4399999999999846,1.4409999999999845,1.4419999999999844,1.4429999999999843,1.4439999999999842,1.444999999999984,1.445999999999984,1.4469999999999839,1.4479999999999837,1.4489999999999836,1.4499999999999835,1.4509999999999834,1.4519999999999833,1.4529999999999832,1.453999999999983,1.454999999999983,1.4559999999999829,1.4569999999999828,1.4579999999999826,1.4589999999999825,1.4599999999999824,1.4609999999999823,1.4619999999999822,1.462999999999982,1.463999999999982,1.4649999999999819,1.4659999999999818,1.4669999999999817,1.4679999999999815,1.4689999999999814,1.4699999999999813,1.4709999999999812,1.471999999999981,1.472999999999981,1.4739999999999809,1.4749999999999808,1.4759999999999807,1.4769999999999806,1.4779999999999804,1.4789999999999803,1.4799999999999802,1.48099999999998,1.48199999999998,1.48299999999998,1.4839999999999798,1.4849999999999797,1.4859999999999796,1.4869999999999794,1.4879999999999793,1.4889999999999792,1.4899999999999791,1.490999999999979,1.491999999999979,1.4929999999999788,1.4939999999999787,1.4949999999999786,1.4959999999999785,1.4969999999999783,1.4979999999999782,1.4989999999999781,1.499999999999978,1.500999999999978,1.5019999999999778,1.5029999999999777,1.5039999999999776,1.5049999999999775,1.5059999999999774,1.5069999999999772,1.5079999999999771,1.508999999999977,1.509999999999977,1.5109999999999768,1.5119999999999767,1.5129999999999766,1.5139999999999765,1.5149999999999764,1.5159999999999763,1.5169999999999761,1.517999999999976,1.518999999999976,1.5199999999999758,1.5209999999999757,1.5219999999999756,1.5229999999999755,1.5239999999999754,1.5249999999999753,1.5259999999999752,1.526999999999975,1.527999999999975,1.5289999999999748,1.5299999999999747,1.5309999999999746,1.5319999999999745,1.5329999999999744,1.5339999999999743,1.5349999999999742,1.535999999999974,1.536999999999974,1.5379999999999738,1.5389999999999737,1.5399999999999736,1.5409999999999735,1.5419999999999734,1.5429999999999733,1.5439999999999732,1.544999999999973,1.545999999999973,1.5469999999999728,1.5479999999999727,1.5489999999999726,1.5499999999999725],"y":[207.96875,220.46875,223.41935483870967,233.40625,217.0625,238.75757575757575,229.625,232.58823529411765,248.72222222222223,260.35,256.0487804878049,252.8780487804878,230.875,229.1578947368421,217.65714285714284,194.33333333333334,165.32258064516128,159.8125,145.82758620689654,146.68965517241378,138.59259259259258,143.84615384615384,143.84615384615384,143.23076923076923,138.16666666666666,150.36363636363637,144.3,131.36363636363637,131.36363636363637,101.83333333333333,125.05263157894737,118.9,105.47368421052632,95.95238095238095,73.6,81.75,95.58823529411765,95.58823529411765,101.375,100.75,81.75,81.75,77.58823529411765,77.58823529411765,133.61111111111111,155.21052631578948,155.21052631578948,155.21052631578948,147.6,167.0,159.77272727272728,162.66666666666666,132.44444444444446,132.38888888888889,121.7,121.7,141.8095238095238,131.2173913043478,131.47826086956522,112.95454545454545,106.6842105263158,105.95,103.04761904761905,80.0952380952381,74.0952380952381,69.17391304347827,72.63636363636364,79.4,72.86363636363636,92.57142857142857,92.0952380952381,92.0952380952381,88.77272727272727,85.56521739130434,71.85714285714286,69.89655172413794,72.25,73.74074074074075,49.5,46.32142857142857,44.1,42.41379310344828,43.03448275862069,42.758620689655174,41.9,40.29032258064516,37.38235294117647,35.94444444444444,38.666666666666664,38.1764705882353,39.625,38.57575757575758,39.09375,38.90625,42.10344827586207,49.416666666666664,51.17391304347826,49.083333333333336,49.25,42.333333333333336,19.73076923076923,19.296296296296298,17.413793103448278,15.96551724137931,9.766666666666667,9.741935483870968,11.25,12.41025641025641,13.6,13.153846153846153,12.25,12.487804878048781,12.577777777777778,12.681818181818182,12.702127659574469,10.847826086956522,11.489795918367347,11.816326530612244,13.270833333333334,20.79245283018868,20.07843137254902,18.617021276595743,16.791666666666668,27.3,24.065217391304348,24.274509803921568,19.06,19.040816326530614,19.245283018867923,19.879310344827587,20.6,21.07017543859649,21.803571428571427,21.423728813559322,19.767857142857142,20.29090909090909,22.894736842105264,17.617021276595743,16.434782608695652,18.891304347826086,21.386363636363637,21.682926829268293,21.743589743589745,22.026315789473685,22.228571428571428,22.61764705882353,23.28125,21.363636363636363,20.5625,16.93103448275862,14.733333333333333,14.32258064516129,14.064516129032258,12.935483870967742,11.838709677419354,12.580645161290322,13.366666666666667,14.53125,14.151515151515152,14.875,14.515151515151516,14.848484848484848,14.571428571428571,14.5,12.82857142857143,12.944444444444445,11.657142857142857,10.424242424242424,10.303030303030303,11.294117647058824,13.514285714285714,13.382352941176471,12.787878787878787,11.258064516129032,11.258064516129032,10.5625,10.666666666666666,12.457142857142857,11.972972972972974,11.972972972972974,15.512820512820513,15.512820512820513,16.05,16.30952380952381,15.55813953488372,17.3953488372093,17.261904761904763,38.19512195121951,37.45238095238095,36.904761904761905,37.476190476190474,37.73809523809524,36.80487804878049,35.15,33.75609756097561,31.71794871794872,32.18421052631579,28.08108108108108,26.864864864864863,27.47222222222222,29.77777777777778,28.0,27.444444444444443,26.864864864864863,19.514285714285716,20.555555555555557,16.5625,10.433333333333334,10.433333333333334,8.89655172413793,8.89655172413793,10.466666666666667,10.833333333333334,10.833333333333334,10.833333333333334,13.96875,15.454545454545455,18.294117647058822,17.53125,27.939393939393938,29.483870967741936,29.516129032258064,28.875,28.151515151515152,22.741935483870968,20.75862068965517,19.925925925925927,19.925925925925927,22.14814814814815,23.576923076923077,24.32,23.46153846153846,22.74074074074074,23.5,22.0,22.703703703703702,22.703703703703702,21.655172413793103,18.77777777777778,18.464285714285715,19.0,18.392857142857142,18.133333333333333,17.151515151515152,15.515151515151516,15.636363636363637,15.65625,14.096774193548388,32.3125,32.46875,33.225806451612904],"type":"scatter"}],                        {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"width":800,"height":600,"title":{"text":"Average Days to Target Price"},"xaxis":{"title":{"text":"Price"}},"yaxis":{"title":{"text":"Average Days"}}},                        {"responsive": true}                    )                };</script><script>(function () {  function resizeAllPlotlyGraphs() {    if (!window.Plotly) return;    document.querySelectorAll('.js-plotly-plot').forEach(function (gd) {      try {        Plotly.relayout(gd, { autosize: true });        Plotly.Plots.resize(gd);      } catch (e) {      }    });  }  resizeAllPlotlyGraphs();  window.addEventListener('resize', resizeAllPlotlyGraphs, { passive: true });  window.addEventListener('orientationchange', resizeAllPlotlyGraphs, { passive: true });})();</script><h2 id="数据的分析与讨论"><a href="#数据的分析与讨论" class="headerlink" title="数据的分析与讨论"></a>数据的分析与讨论</h2><blockquote><p>以下的观点仅代表个人, 且只针对日经ETF, 我不对任何读者的选择负责. 赚钱赔钱与我无关.</p></blockquote><h3 id="符合直觉的结论"><a href="#符合直觉的结论" class="headerlink" title="符合直觉的结论"></a>符合直觉的结论</h3><ul><li>连续上涨, 连续下跌的概率会随着天数增加而快速减少</li><li>同一支股票的涨跌情况基本符合正态分布, 不过这里我拟合得到的是柯西分布(洛伦兹分布)</li><li>以一个合适的价位买入, 基本不太会被套, 但也不会赚大钱</li></ul><h3 id="可能的策略"><a href="#可能的策略" class="headerlink" title="可能的策略"></a>可能的策略</h3><p>假设每年的交易日大概240天</p><ul><li>根据盈亏的分布</li></ul><p>当日跌幅超4%时, 可以考虑买入并持有15-30个交易日, 在一年中买入的时机大概为 240天*2% 约为5个交易日</p><blockquote><p>因为每次交易有7成以上的概率获得4%的收益, 所以一年的预期收益大概为 4% * 0.7 * 5 大约为 14%</p></blockquote><ul><li>根据平均套牢时间</li></ul><p>日经的数据中, 从1.41到1.48这段的平均回本时间是最短的, 大概是21个交易日内就可以获得2.5%的收益. 平均的交易周期为21天.</p><blockquote><p>假设你每次都能在1.41到1.48之间买到股票, 那么你每年能交易的次数为 240&#x2F;21 &#x3D; 10 次,  那么年化有可能达到 10 * 2.5% &#x3D; 25% 的收益</p></blockquote>]]></content>
    
    
    <summary type="html">我个人从去年开始就逐步买入日经相关的场外基金, 也同时在场内有看日经ETF这只基金, 在当时我使用 Backtrader 做回测时, 这只基金是我用到最多的, 所以我也针对它做了一些技术面的统计.</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="Backtrader" scheme="https://corvo.myseu.cn/tags/Backtrader/"/>
    
    <category term="日经ETF" scheme="https://corvo.myseu.cn/tags/%E6%97%A5%E7%BB%8FETF/"/>
    
  </entry>
  
  <entry>
    <title>飞牛NAS的一些底层探索和磁盘扩容</title>
    <link href="https://corvo.myseu.cn/2025/05/18/2025-05-18-%E9%A3%9E%E7%89%9Bnas%E7%9A%84%E4%B8%80%E4%BA%9B%E5%BA%95%E5%B1%82%E6%8E%A2%E7%B4%A2%E5%92%8C%E7%A3%81%E7%9B%98%E6%89%A9%E5%AE%B9/"/>
    <id>https://corvo.myseu.cn/2025/05/18/2025-05-18-%E9%A3%9E%E7%89%9Bnas%E7%9A%84%E4%B8%80%E4%BA%9B%E5%BA%95%E5%B1%82%E6%8E%A2%E7%B4%A2%E5%92%8C%E7%A3%81%E7%9B%98%E6%89%A9%E5%AE%B9/</id>
    <published>2025-05-18T23:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>上一篇博客介绍了我对于飞牛NAS的一些使用, 这篇博客我就简单分享下我对于这个系统本身的一些研究,本文默认读者有一定的Linux还有折腾NAS的基础, 没有的话就不要强求去阅读理解了..</p><h2 id="命令行登录"><a href="#命令行登录" class="headerlink" title="命令行登录"></a>命令行登录</h2><h3 id="SSH服务"><a href="#SSH服务" class="headerlink" title="SSH服务"></a>SSH服务</h3><p>确保系统中的SSH服务打开了:</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747537544479.png" alt="1747537544479.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ ssh corvo@192.168.xxx.yyy</span><br><span class="line">corvo@192.168.xxx.yyy<span class="string">&#x27;s password:</span></span><br><span class="line"><span class="string">Linux HomeFN 6.12.18-trim #5 SMP PREEMPT_DYNAMIC Thu Mar 27 10:30:00 CST 2025 x86_64</span></span><br><span class="line"><span class="string">Last login: Sun May 18 11:06:10 2025 from 192.168.101.221</span></span><br><span class="line"><span class="string">corvo@HomeFN:~$</span></span><br></pre></td></tr></table></figure><p>在第一次登录之后, 我发现每次输入密码麻烦就加了公钥到机器上, 可以自行添加这个目录以及文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">corvo@HomeFN:~$ <span class="built_in">ls</span> ~/.ssh/authorized_keys</span><br><span class="line">/home/corvo/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><h3 id="切换root用户"><a href="#切换root用户" class="headerlink" title="切换root用户"></a>切换root用户</h3><p>也可以切换到root用户, 正常输入密码就可以了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">corvo@HomeFN:~$ <span class="built_in">sudo</span> su - root</span><br><span class="line">[<span class="built_in">sudo</span>] password <span class="keyword">for</span> corvo:</span><br><span class="line">root@HomeFN:~#  <span class="comment"># 已经切换到了root用户</span></span><br></pre></td></tr></table></figure><h2 id="系统组件"><a href="#系统组件" class="headerlink" title="系统组件"></a>系统组件</h2><h3 id="操作系统"><a href="#操作系统" class="headerlink" title="操作系统"></a>操作系统</h3><p>这是一个Debian 12的系统, 我个人很喜欢他们的这个选择, 和我的其他NAS系统都能保持一致了.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">corvo@HomeFN:~$ <span class="built_in">cat</span> /etc/*-release</span><br><span class="line">PRETTY_NAME=<span class="string">&quot;Debian GNU/Linux 12 (bookworm)&quot;</span></span><br><span class="line">NAME=<span class="string">&quot;Debian GNU/Linux&quot;</span></span><br><span class="line">VERSION_ID=<span class="string">&quot;12&quot;</span></span><br><span class="line">VERSION=<span class="string">&quot;12 (bookworm)&quot;</span></span><br><span class="line">VERSION_CODENAME=bookworm</span><br><span class="line">ID=debian</span><br><span class="line">HOME_URL=<span class="string">&quot;https://www.debian.org/&quot;</span></span><br><span class="line">SUPPORT_URL=<span class="string">&quot;https://www.debian.org/support&quot;</span></span><br><span class="line">BUG_REPORT_URL=<span class="string">&quot;https://bugs.debian.org/&quot;</span></span><br></pre></td></tr></table></figure><h3 id="系统进程"><a href="#系统进程" class="headerlink" title="系统进程"></a>系统进程</h3><p>查看系统进程我推荐<code>systemctl</code>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# systemctl status</span><br><span class="line">● HomeFN</span><br><span class="line">    State: degraded</span><br><span class="line">    Units: 441 loaded (incl. loaded aliases)</span><br><span class="line">     Jobs: 0 queued</span><br><span class="line">   Failed: 3 units</span><br><span class="line">    Since: Mon 2025-05-12 21:02:26 CST; 5 days ago</span><br><span class="line">  systemd: 252.30-1~deb12u2</span><br><span class="line">   CGroup: /</span><br><span class="line">           ├─init.scope</span><br><span class="line">           │ └─1 /sbin/init</span><br><span class="line">           ├─system.slice</span><br><span class="line">           │ ├─ModemManager.service</span><br><span class="line">           │ │ └─843 /usr/sbin/ModemManager</span><br><span class="line">           │ ├─NetworkManager.service</span><br><span class="line">           │ │ └─816 /usr/sbin/NetworkManager --no-daemon</span><br><span class="line">           │ ├─accountsrv.service</span><br><span class="line">           │ │ └─2409 /usr/trim/bin/accountsrv</span><br></pre></td></tr></table></figure><h3 id="磁盘挂载"><a href="#磁盘挂载" class="headerlink" title="磁盘挂载"></a>磁盘挂载</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">corvo@HomeFN:~$ <span class="built_in">df</span> -Th</span><br><span class="line">Filesystem                                              Type         Size  Used Avail Use% Mounted on</span><br><span class="line">udev                                                    devtmpfs     3.9G     0  3.9G   0% /dev</span><br><span class="line">tmpfs                                                   tmpfs        796M   22M  775M   3% /run</span><br><span class="line">/dev/sda2                                               ext4          63G  5.6G   54G  10% /</span><br><span class="line">tmpfs                                                   tmpfs        3.9G  1.4M  3.9G   1% /dev/shm</span><br><span class="line">tmpfs                                                   tmpfs        5.0M     0  5.0M   0% /run/lock</span><br><span class="line">trimafs                                                 trimafs       52G  1.7G   50G   4% /fs</span><br><span class="line">1000-1-c86c2633&#123;SYtpW&#125;:cloud-storage/v1/dav             fuse.rclone  1.0P     0  1.0P   0% /vol02/1000-1-c86c2633</span><br><span class="line">//192.168.xxx.yyy/Data                                  cifs         1.6G  6.0M  1.6G   1% /vol02/1000-0-cb29116f</span><br><span class="line">1000-1-4a74aa03&#123;2_a9I&#125;:cloud-storage/v1/dav             fuse.rclone  1.0P     0  1.0P   0% /vol02/1000-1-4a74aa03</span><br><span class="line">tmpfs                                                   tmpfs        796M     0  796M   0% /run/user/1000</span><br><span class="line">/dev/mapper/trim_fc35013f_f739_4592_942f_d054200d2a3a-0 btrfs        6.0G  5.9M  5.5G   1% /vol2</span><br><span class="line">/dev/mapper/trim_5ab5694e_275a_417b_8f53_88510b630e5f-0 btrfs         52G  1.7G   50G   4% /vol1</span><br></pre></td></tr></table></figure><p>其中, 这两个<code>fuse.rclone</code>的磁盘是百度云盘和阿里云盘, <code>cifs</code>挂载的目录是我自己的smb服务器,另外两个<code>btrfs</code>系统是我自己挂载的虚拟硬盘.</p><p>再看一下</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/nginx# ps -aux | grep rclone</span><br><span class="line">root        2944  0.0  0.3 730112 30572 ?        Sl   May12   3:41 /usr/bin/rclone --config /etc/mountmgr/rclone/1000.conf mount --daemon 1000-1-c86c2633:/cloud-storage/v1/dav /vol02/1000-1-c86c2633 --no-check-certificate --allow-other --uid 1000 --gid 1001 --<span class="built_in">umask</span> 000 --default-permissions --dir-cache-time 10s --webdav-vendor baidu --vfs-cache-mode off --<span class="built_in">timeout</span> 600s --contimeout 200s --daemon-timeout 3000s --daemon-wait 30s --poll-interval 10s --low-level-retries 2</span><br><span class="line">root       93267  0.0  0.2 729344 23932 ?        Sl   May17   0:01 /usr/bin/rclone --config /etc/mountmgr/rclone/1000.conf mount --daemon 1000-1-4a74aa03:/cloud-storage/v1/dav /vol02/1000-1-4a74aa03 --no-check-certificate --allow-other --uid 1000 --gid 1001 --<span class="built_in">umask</span> 000 --default-permissions --dir-cache-time 10s --webdav-vendor ali --vfs-cache-mode off --<span class="built_in">timeout</span> 600s --contimeout 200s --daemon-timeout 3000s --daemon-wait 30s --poll-interval 10s --low-level-retries 2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 再看看其中的rclone配置</span></span><br><span class="line">root@HomeFN:/usr/trim/nginx# <span class="built_in">cat</span> /etc/mountmgr/rclone/1000.conf</span><br><span class="line">[1000-1-c86c2633]</span><br><span class="line"><span class="built_in">type</span> = webdav</span><br><span class="line">user = 1000_qxSsjpVcKsVORqoA</span><br><span class="line">pass = xxxxxxxxxxx</span><br><span class="line">url = http://127.0.0.1:15244</span><br><span class="line"></span><br><span class="line">[1000-1-4a74aa03]</span><br><span class="line"><span class="built_in">type</span> = webdav</span><br><span class="line">url = http://127.0.0.1:15244</span><br><span class="line">user = 1000_0XKC8OEuwEaVrUvn</span><br><span class="line">pass = xxxxxxxxxxx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 这里的15244是由 `cloud_storage_dav` 监听的, 提供了webdav接口之后, 由rclone挂载成为本地目录,</span></span><br><span class="line"><span class="comment"># 非常符合Linux的使用逻辑.</span></span><br></pre></td></tr></table></figure><h3 id="用户组"><a href="#用户组" class="headerlink" title="用户组"></a>用户组</h3><p>每个应用会有一个属于自己的用户, 看起来也是有权限控制的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# <span class="built_in">cat</span> /etc/passwd</span><br><span class="line"><span class="comment"># ...</span></span><br><span class="line">trim-media:x:999:901::/home/trim-media:/usr/sbin/nologin</span><br><span class="line">trim.photos:x:996:901::/home/trim.photos:/usr/sbin/nologin</span><br><span class="line">baidu.netdisk:x:994:901::/home/baidu.netdisk:/usr/sbin/nologin</span><br><span class="line">git:x:993:901::/home/git:/usr/sbin/nologin</span><br><span class="line">trim.text-editor:x:992:901::/home/trim.text-editor:/usr/sbin/nologin</span><br></pre></td></tr></table></figure><h3 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h3><p>飞牛使用的是<code>PostgreSQL</code>做数据库的, 有兴趣可以自己研究下里面的数据库和表格, 看起来飞牛对AI相关的内容还是蛮重视的, 单独有一个AI相关的数据库.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:~# ps -aux | grep postgres</span><br><span class="line">postgres    1399  0.0  1.0 239912 86084 ?        Ss   May12   0:58 /usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/main -c config_file=/etc/postgresql/15/main/postgresql.conf</span><br><span class="line"></span><br><span class="line">root@HomeFN:/usr/trim/etc# su - postgres</span><br><span class="line">postgres@HomeFN:~$ psql</span><br><span class="line">psql (15.8 (Debian 15.8-0+deb12u1))</span><br><span class="line">Type <span class="string">&quot;help&quot;</span> <span class="keyword">for</span> <span class="built_in">help</span>.</span><br><span class="line"></span><br><span class="line">postgres=# \list</span><br><span class="line">                                                       List of databases</span><br><span class="line">      Name      |     Owner      | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider |   Access privileges</span><br><span class="line">----------------+----------------+----------+-------------+-------------+------------+-----------------+-----------------------</span><br><span class="line"> ai_manager     | postgres       | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |</span><br><span class="line"> appcenter      | postgres       | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |</span><br><span class="line"> dm             | postgres       | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |</span><br><span class="line"> <span class="comment">#....</span></span><br></pre></td></tr></table></figure><h3 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a>Docker</h3><p>飞牛NAS里面也提供了<code>Docker</code>的集成, 普通用户是可以通过Docker来启动一部分组件了.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# docker info</span><br><span class="line">Client: Docker Engine - Community</span><br><span class="line"> Version:    26.0.0</span><br><span class="line"> Context:    default</span><br><span class="line"> Debug Mode: <span class="literal">false</span></span><br><span class="line"> Plugins:</span><br><span class="line">  buildx: Docker Buildx (Docker Inc.)</span><br><span class="line">    Version:  v0.13.1</span><br><span class="line">    Path:     /usr/libexec/docker/cli-plugins/docker-buildx</span><br><span class="line">  compose: Docker Compose (Docker Inc.)</span><br><span class="line">    Version:  v2.29.2</span><br><span class="line">    Path:     /usr/libexec/docker/cli-plugins/docker-compose</span><br></pre></td></tr></table></figure><h2 id="虚拟磁盘扩容"><a href="#虚拟磁盘扩容" class="headerlink" title="虚拟磁盘扩容"></a>虚拟磁盘扩容</h2><p>这个部分的是我写这篇文章的原动力, 因为我一开始就是使用<a href="https://pve.proxmox.com/">Proxmox</a>来启动这个系统的, 后续是有可能使用PVE自带的功能增加磁盘大小的,所以我就尝试研究了一下飞牛系统以及它的磁盘管理, 希望对那些同样使用PVE的用户一些帮助. </p><ul><li>数据无价, 请务必在操作之前做好备份!!!</li><li>数据无价, 请务必在操作之前做好备份!!!</li><li>数据无价, 请务必在操作之前做好备份!!!</li></ul><p>有部分内容参考: <a href="https://club.fnnas.com/forum.php?mod=viewthread&tid=12963">关于飞牛在虚拟化下的存储硬盘扩容</a>, 另外一部分我从<code>ChatGPT</code>学习来的,请注意, 这个步骤仅适合单磁盘的用户. 我自己本身仅仅了解RAID的功能, 但是没有任何RAID相关的实际操作.</p><p>这部分的内容不是给小白看的, 是我需要记录一下自己的操作方案, 方便以后进行磁盘管理做的.</p><h3 id="查询当前磁盘信息"><a href="#查询当前磁盘信息" class="headerlink" title="查询当前磁盘信息"></a>查询当前磁盘信息</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# <span class="built_in">df</span> -Th</span><br><span class="line">/dev/mapper/trim_fc35013f_f739_4592_942f_d054200d2a3a-0 btrfs        6.0G  5.9M  5.5G   1% /vol2</span><br><span class="line">/dev/mapper/trim_5ab5694e_275a_417b_8f53_88510b630e5f-0 btrfs         52G  1.7G   50G   4% /vol1</span><br><span class="line"></span><br><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">NAME                                              MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS</span><br><span class="line">sdb                                                 8:16   0   52G  0 disk</span><br><span class="line">└─sdb1                                              8:17   0   52G  0 part</span><br><span class="line">  └─md0                                             9:0    0   52G  0 raid1</span><br><span class="line">    └─trim_5ab5694e_275a_417b_8f53_88510b630e5f-0 253:0    0   52G  0 lvm   /vol1</span><br><span class="line">sdc                                                 8:32   0    6G  0 disk</span><br><span class="line">└─sdc1                                              8:33   0    6G  0 part</span><br><span class="line">  └─md1                                             9:1    0    6G  0 raid1</span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    6G  0 lvm   /vol2</span><br></pre></td></tr></table></figure><p>确定好自己要扩容的磁盘, 我这里会以<code>/vol2</code>这个磁盘做演示, 从<code>6G</code>扩容到<code>8G</code>.</p><h3 id="PVE中调整磁盘"><a href="#PVE中调整磁盘" class="headerlink" title="PVE中调整磁盘"></a>PVE中调整磁盘</h3><p>选择磁盘进行扩容</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747562793690.png" alt="1747562793690.png"></p><p>增加2G的磁盘</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747562847107.png" alt="1747562847107.png"></p><blockquote><p>确认磁盘已经增加</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">NAME                                              MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS</span><br><span class="line">sdc                                                 8:32   0    8G  0 disk  <span class="comment"># 这里已经变成了8G</span></span><br><span class="line">└─sdc1                                              8:33   0    6G  0 part</span><br><span class="line">  └─md1                                             9:1    0    6G  0 raid1</span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    6G  0 lvm   /vol2</span><br></pre></td></tr></table></figure><p>我们的目标其实是要扩容最后的<code>lvm</code>分区, 使其也到<code>8G</code>就完成了.</p><h3 id="卸载磁盘"><a href="#卸载磁盘" class="headerlink" title="卸载磁盘"></a>卸载磁盘</h3><p>在系统设置中先卸载磁盘, 没用命令行是因为飞牛NAS有进程会占用, 不如直接从网页端卸载来的安全.</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747563085795.png" alt="1747563085795.png"></p><h3 id="逐步调整分区大小"><a href="#逐步调整分区大小" class="headerlink" title="逐步调整分区大小"></a>逐步调整分区大小</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装fdisk工具</span></span><br><span class="line">apt update &amp;&amp; apt install fdisk</span><br></pre></td></tr></table></figure><h4 id="调整分区"><a href="#调整分区" class="headerlink" title="调整分区"></a>调整分区</h4><p>这里的核心逻辑是, 删除重建分区, 但是不更改分区表内容.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# fdisk /dev/sdc</span><br><span class="line"></span><br><span class="line">Welcome to fdisk (util-linux 2.38.1).</span><br><span class="line">Changes will remain <span class="keyword">in</span> memory only, <span class="keyword">until</span> you decide to write them.</span><br><span class="line">Be careful before using the write <span class="built_in">command</span>.</span><br><span class="line"></span><br><span class="line">GPT PMBR size mismatch (12582911 != 16777215) will be corrected by write.</span><br><span class="line">The backup GPT table is not on the end of the device. This problem will be corrected by write.</span><br><span class="line">This disk is currently <span class="keyword">in</span> use - repartitioning is probably a bad idea.</span><br><span class="line">It<span class="string">&#x27;s recommended to umount all file systems, and swapoff all swap</span></span><br><span class="line"><span class="string">partitions on this disk.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): p</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Disk /dev/sdc: 8 GiB, 8589934592 bytes, 16777216 sectors</span></span><br><span class="line"><span class="string">Disk model: QEMU HARDDISK</span></span><br><span class="line"><span class="string">Units: sectors of 1 * 512 = 512 bytes</span></span><br><span class="line"><span class="string">Sector size (logical/physical): 512 bytes / 512 bytes</span></span><br><span class="line"><span class="string">I/O size (minimum/optimal): 512 bytes / 512 bytes</span></span><br><span class="line"><span class="string">Disklabel type: gpt</span></span><br><span class="line"><span class="string">Disk identifier: FA6EEB5E-CA1C-4B0D-A7B3-F5CE97C59BC7</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Device     Start      End  Sectors Size Type</span></span><br><span class="line"><span class="string">/dev/sdc1   2048 12580863 12578816   6G Linux RAID</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): d</span></span><br><span class="line"><span class="string">Selected partition 1</span></span><br><span class="line"><span class="string">Partition 1 has been deleted.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): n</span></span><br><span class="line"><span class="string">Partition number (1-128, default 1):</span></span><br><span class="line"><span class="string">First sector (34-16777182, default 2048):</span></span><br><span class="line"><span class="string">Last sector, +/-sectors or +/-size&#123;K,M,G,T,P&#125; (2048-16777182, default 16775167):</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Created a new partition 1 of type &#x27;</span>Linux filesystem<span class="string">&#x27; and of size 8 GiB.</span></span><br><span class="line"><span class="string">Partition #1 contains a linux_raid_member signature.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Do you want to remove the signature? [Y]es/[N]o: N  # 一定要保留当前签名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): t</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Selected partition 1</span></span><br><span class="line"><span class="string">Partition type or alias (type L to list all): 42</span></span><br><span class="line"><span class="string">Changed type of partition &#x27;</span>Linux filesystem<span class="string">&#x27; to &#x27;</span>Linux RAID<span class="string">&#x27;.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): w</span></span><br><span class="line"><span class="string">The partition table has been altered.</span></span><br><span class="line"><span class="string">Syncing disks.</span></span><br></pre></td></tr></table></figure><p>查看调整结果:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">NAME                                              MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS</span><br><span class="line">sdc                                                 8:32   0    8G  0 disk</span><br><span class="line">└─sdc1                                              8:33   0    8G  0 part  <span class="comment"># 分区变为了8G</span></span><br><span class="line">  └─md1                                             9:1    0    6G  0 raid1</span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    6G  0 lvm   /vol2</span><br></pre></td></tr></table></figure><h4 id="调整raid"><a href="#调整raid" class="headerlink" title="调整raid"></a>调整raid</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# mdadm --grow /dev/md1 --size=max</span><br><span class="line">mdadm: component size of /dev/md1 has been <span class="built_in">set</span> to 8381440K</span><br><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">NAME                                              MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS</span><br><span class="line">sdc                                                 8:32   0    8G  0 disk</span><br><span class="line">└─sdc1                                              8:33   0    8G  0 part</span><br><span class="line">  └─md1                                             9:1    0    8G  0 raid1  <span class="comment"># raid变为了8G</span></span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    6G  0 lvm   /vol2</span><br></pre></td></tr></table></figure><h4 id="调整lvm卷"><a href="#调整lvm卷" class="headerlink" title="调整lvm卷"></a>调整lvm卷</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc#  pvresize /dev/md1</span><br><span class="line">root@HomeFN:/usr/trim/etc# lvresize /dev/trim_fc35013f_f739_4592_942f_d054200d2a3a/0 -l +100%FREE</span><br><span class="line">  Size of logical volume trim_fc35013f_f739_4592_942f_d054200d2a3a/0 changed from 5.99 GiB (1534 extents) to 7.99 GiB (2046 extents).</span><br><span class="line">  Logical volume trim_fc35013f_f739_4592_942f_d054200d2a3a/0 successfully resized.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">sdc                                                 8:32   0    8G  0 disk</span><br><span class="line">└─sdc1                                              8:33   0    8G  0 part</span><br><span class="line">  └─md1                                             9:1    0    8G  0 raid1</span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    8G  0 lvm   /vol2  <span class="comment"># lvm卷变为了8G</span></span><br></pre></td></tr></table></figure><h4 id="调整文件系统"><a href="#调整文件系统" class="headerlink" title="调整文件系统"></a>调整文件系统</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# btrfs filesystem resize max /vol2/</span><br><span class="line">Resize device <span class="built_in">id</span> 1 (/dev/mapper/trim_fc35013f_f739_4592_942f_d054200d2a3a-0) from 5.99GiB to max</span><br><span class="line"></span><br><span class="line">root@HomeFN:/usr/trim/etc# <span class="built_in">df</span> -Th</span><br><span class="line">/dev/mapper/trim_fc35013f_f739_4592_942f_d054200d2a3a-0 btrfs        8.0G  5.9M  7.5G   1% /vol2  <span class="comment"># 文件系统也变成了8G</span></span><br></pre></td></tr></table></figure><p>我仅仅在单磁盘上做了这个操作, 其他RAID形式我没有操作过, 建议慎重.</p><h2 id="系统更新"><a href="#系统更新" class="headerlink" title="系统更新"></a>系统更新</h2><p>目前我只安装了一个版本, 这个系统的后期更新也是个问题, 包括系统本身, 内部组件, 希望开发团队已经有完整的方案了.</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>我觉得飞牛NAS的低层系统以及其技术选型已经非常好了: <code>Debian 12</code>, <code>PostgreSQL</code>, <code>Docker</code>, <code>Rclone</code>, 组件大部分使用<code>Golang</code>编写,自由度拉满, 也方便和我之前的NAS系统做集成, 客户端也多端支持. 我想我没有什么可能拒绝继续使用这个NAS平台.</p><p>另外一点就是我担心他们的目标用户, 如果目标用户是像我一样的NAS使用者, 这个项目怕是要亏到底掉, 我既不想多花钱又不需要技术支持…</p><p>我挺好奇他们的增值服务到底要往什么方向发展, 如果是某个组件收费, 那一个组件的收益怎么负担所有组件的开发, 会不会存在团队间的不平衡?在我看来这个服务一定要走企业化方向的, 类似CentOS的咨询, PVE的授权, 或者是被小米这种厂商收购作为集成系统.</p><p>目前的阶段, 我会尝试使用一部分功能, 但是不会把所有服务都迁移过去. 除非项目组能够在钱烧完之前获得更加稳定的收入流.让用户相信盈利模式可持续比让用户体验一下难太多了, 希望你们能成功吧.</p>]]></content>
    
    
    <summary type="html">上一篇博客介绍了我对于飞牛NAS的一些使用, 这篇博客我就简单分享下我对于这个系统本身的一些研究.</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Linux" scheme="https://corvo.myseu.cn/tags/Linux/"/>
    
    <category term="Debian" scheme="https://corvo.myseu.cn/tags/Debian/"/>
    
    <category term="OpenSSH" scheme="https://corvo.myseu.cn/tags/OpenSSH/"/>
    
    <category term="飞牛" scheme="https://corvo.myseu.cn/tags/%E9%A3%9E%E7%89%9B/"/>
    
    <category term="NAS" scheme="https://corvo.myseu.cn/tags/NAS/"/>
    
    <category term="Proxmox" scheme="https://corvo.myseu.cn/tags/Proxmox/"/>
    
    <category term="LVM" scheme="https://corvo.myseu.cn/tags/LVM/"/>
    
    <category term="PostgreSQL" scheme="https://corvo.myseu.cn/tags/PostgreSQL/"/>
    
  </entry>
  
  <entry>
    <title>飞牛NAS使用体验分享</title>
    <link href="https://corvo.myseu.cn/2025/05/17/2025-05-17-%E9%A3%9E%E7%89%9Bnas%E7%9A%84%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    <id>https://corvo.myseu.cn/2025/05/17/2025-05-17-%E9%A3%9E%E7%89%9Bnas%E7%9A%84%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E5%88%86%E4%BA%AB/</id>
    <published>2025-05-17T23:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>之前一直听说过<a href="https://www.fnnas.com/">飞牛NAS</a>这个系统，最近终于有空体验了一下。试用了几天，感觉相当满意。正好有机会写两篇博客分享我的使用情况，本文将专注于使用体验，另一篇文章会分析其底层系统。</p><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>有些朋友知道，我自己的 NAS 并没有安装定制化的 Linux 系统，而是购买了几块移动硬盘挂载到 <a href="https://www.proxmox.com/en/">Proxmox</a> 中，然后安装 <a href="https://www.debian.org/">Debian</a> 来使用。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747492356082.png" alt="1747492356082.png"></p><p>之后手动启动里面的 Samba, <a href="https://jellyfin.org/">Jellyfin</a> 等服务。因为不止一台机器，也包括云厂商的，所以我使用 <a href="https://k3s.io/">K3s</a> 统一编排这些服务。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">(⎈|default:default)➜  BlogSource git:(master) ✗ kubectl get pods</span><br><span class="line">jellyfin-web-b5488b69b-cz69t                1/1     Running   0              15d</span><br><span class="line">timemachine-dbc898585-j4ln8                 1/1     Running   0              42d</span><br><span class="line">uptime-kuma-74b49dd555-qfnvz                1/1     Running   0              22h</span><br><span class="line">samba-7c95544b86-qjj7q                      1/1     Running   0              16d</span><br></pre></td></tr></table></figure><p>我自己额外的服务也有很多，所以只能使用这种形式来组织服务了。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>这次的<a href="https://www.fnnas.com/">飞牛NAS</a>我其实是作为虚拟机安装在<a href="https://www.proxmox.com/en/">Proxmox</a>中的，然后挂了虚拟的硬盘进去：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747492896256.png" alt="1747492896256.png"></p><p>具体过程可以自己尝试下，最后页面大概长这样</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747494483164.png" alt="1747494483164.png"></p><h2 id="我的一些用法"><a href="#我的一些用法" class="headerlink" title="我的一些用法"></a>我的一些用法</h2><h3 id="云盘挂载"><a href="#云盘挂载" class="headerlink" title="云盘挂载"></a>云盘挂载</h3><p>我之前一直开着百度云盘和阿里云盘的会员，这次终于有官方的系统能直接挂载到Linux下面了。另外我还把原有的SMB服务也挂过来了，相当于飞牛NAS做了一个家用NAS的中心</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747495220013.png" alt="1747495220013.png"></p><h3 id="影视照片"><a href="#影视照片" class="headerlink" title="影视照片"></a>影视照片</h3><p>其实我想写篇博客就是因为它的影视功能太好了，我把原来在<a href="https://jellyfin.org/">Jellyfin</a>添加的路径以及网盘保存的电影、电视剧都加到这里了。</p><p>我顺便也给电视和iPad装了客户端，比Plex和Jellyfin使用体验好太多了。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747495571675.png" alt="1747495571675.png"></p><h3 id="Time-Machine"><a href="#Time-Machine" class="headerlink" title="Time Machine"></a>Time Machine</h3><p>之前我的Time Machine是用容器挂了磁盘来做的，类似这样进行创建的，估计我之后就会把这个功能也放到飞牛里面了。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">timemachine</span></span><br><span class="line"><span class="attr">image:</span> <span class="string">mbentley/timemachine:smb-20250328</span></span><br><span class="line"><span class="attr">hostPath:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">  <span class="attr">hostPath:</span> <span class="string">/run/mount/AppleBackup/timemachine</span></span><br><span class="line">  <span class="attr">podPath:</span> <span class="string">/opt/timemachine</span></span><br></pre></td></tr></table></figure><h3 id="网盘备份"><a href="#网盘备份" class="headerlink" title="网盘备份"></a>网盘备份</h3><p>原来我的备份方案是先用rclone同步到Windows中，再通过Windows虚拟机中的阿里云盘客户端做文件备份的</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">rclone-backup</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">yaml</span></span><br><span class="line"><span class="attr">image:</span> <span class="string">rclone/rclone:1.68</span></span><br><span class="line"><span class="attr">template:</span> <span class="string">rclone</span></span><br><span class="line"><span class="attr">command:</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">/bin/sh</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">-c</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">while</span> <span class="literal">true</span><span class="string">;</span> <span class="string">do</span> <span class="string">rclone</span> <span class="string">sync</span> <span class="string">/data</span> <span class="string">win-smb:/K3sBackup/$&#123;NODE_NAME&#125;</span> <span class="string">-v;</span> <span class="string">sleep</span> <span class="number">7200</span><span class="string">;</span> <span class="string">done</span></span><br><span class="line"><span class="attr">hostPath:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data-sync</span></span><br><span class="line">  <span class="attr">hostPath:</span> <span class="string">/var/lib/K3sData/</span></span><br><span class="line">  <span class="attr">podPath:</span>  <span class="string">/data</span></span><br></pre></td></tr></table></figure><p>现在可以考虑直接将文件同步到飞牛NAS中，再配置它原生的备份方案来放到网盘了。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747534861771.png" alt="1747534861771.png"></p><h3 id="新加硬盘"><a href="#新加硬盘" class="headerlink" title="新加硬盘"></a>新加硬盘</h3><p>我的另一台NAS上面的硬盘可能不会再动了，但是新买的硬盘估计会用用PVE的USB挂到飞牛这边来了。至于RAID目前我还没有这方面的需求。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747535408666.png" alt="1747535408666.png"></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>我挺喜欢它的很多功能的，基本上已经将我心目中的NAS实现了。我甚至想要将部分服务迁移到这里来了(Jellyfin, TimeMachine, alist)。它也增强了很多原来NextCloud的支持不好的功能，如果有一天我开工作室，估计会用它来做内部共享系统，比用很多云服务的SaaS功能提供的都好。</p>]]></content>
    
    
    <summary type="html">之前一直听说飞牛 NAS 系统，最近终于有空体验了一下。试用了几天，感觉相当满意。正好有机会写两篇博客分享我的使用情况，本文将专注于使用体验，另一篇文章会分析其底层系统。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Linux" scheme="https://corvo.myseu.cn/tags/Linux/"/>
    
    <category term="Debian" scheme="https://corvo.myseu.cn/tags/Debian/"/>
    
    <category term="飞牛" scheme="https://corvo.myseu.cn/tags/%E9%A3%9E%E7%89%9B/"/>
    
    <category term="NAS" scheme="https://corvo.myseu.cn/tags/NAS/"/>
    
    <category term="Proxmox" scheme="https://corvo.myseu.cn/tags/Proxmox/"/>
    
  </entry>
  
  <entry>
    <title>我的半自动化股票交易系统</title>
    <link href="https://corvo.myseu.cn/2025/04/02/2025-04-02-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    <id>https://corvo.myseu.cn/2025/04/02/2025-04-02-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/</id>
    <published>2025-04-02T23:15:00.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>从去年开始，我就逐步在构建自己的交易系统。后来借助 bolt 的支持，我完善了交易系统的前端部分。目前，基本功能已经具备。希望通过这篇文章分享开发流程和交易系统的一些功能，给大家带来启发。不过，本文内容不构成任何投资建议！</p><p>本文内容承接 <a href="https://corvo.myseu.cn/2024/07/17/2024-07-16-InfluxDB%E7%9A%84%E4%BD%BF%E7%94%A8%E4%B8%8E%E4%B8%80%E4%BA%9BA%E8%82%A1%E6%8C%81%E4%BB%93%E5%88%86%E4%BA%AB/">InfluxDB 的使用与一些 A 股持仓分享</a>。当时，我的交易系统已经有了后台任务，定时将部分数据同步到 InfluxDB 并展示出来。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743604757339.png" alt="1743604757339.png"></p><p>去年 11 月，我发现了 <a href="http://bolt.new/">bolt.new</a>，可以使用 AI 快速生成前端代码。我借此机会为交易系统添加了前端页面，对页面效果非常满意。因此，我写下这篇博客，分享我的半自动化股票交易系统。为什么说是半自动化呢？因为我已经设置好了买入卖出的价格和数量，仅使用这个系统执行交易并发送提醒。</p><h2 id="系统界面"><a href="#系统界面" class="headerlink" title="系统界面"></a>系统界面</h2><p>作为游客，你可以直接访问这里：</p><p><a href="https://stock.corvo.fun/">https://stock.corvo.fun/</a></p><p>其中落地页和持仓页面是公开可见的。</p><h3 id="落地页"><a href="#落地页" class="headerlink" title="落地页"></a>落地页</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743600093543.png" alt="1743600093543.png"></p><p>这里的图表展示的是上证指数。我问 bolt 有没有更炫酷的落地页，它就生成了这个动态绘图。</p><h3 id="持仓页面"><a href="#持仓页面" class="headerlink" title="持仓页面"></a>持仓页面</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743600347451.png" alt="1743600347451.png"></p><p>这里的图表记录了我的仓位分布和操作情况。操作记录中仅显示成功的交易，并支持查看很久以前的交易。</p><hr><h2 id="我的交易计划"><a href="#我的交易计划" class="headerlink" title="我的交易计划"></a>我的交易计划</h2><p><code>Trade Plan</code> 标签页记录了我手动创建的一些条件单。</p><h4 id="上半部分：股票走势"><a href="#上半部分：股票走势" class="headerlink" title="上半部分：股票走势"></a>上半部分：股票走势</h4><p>上半部分展示了选定股票的走势情况：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743600539694.png" alt="1743600539694.png"></p><h4 id="下半部分：预期计划"><a href="#下半部分：预期计划" class="headerlink" title="下半部分：预期计划"></a>下半部分：预期计划</h4><p>下半部分是我的预期计划：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743600692668.png" alt="1743600692668.png"></p><p>这些条件单比同花顺或腾讯自选股的条件单更加个性化。我并不纠结程序是否会因故障而错过交易，因为股市从来不缺机会，不是吗？</p><hr><h2 id="一些交易策略"><a href="#一些交易策略" class="headerlink" title="一些交易策略"></a>一些交易策略</h2><p>在上述系统页面中，我记录了一种确定价格和仓位的自动交易策略。此外，这个系统还支持几种其他策略，以下是具体分享。</p><h3 id="1-确定价格和仓位的自动交易"><a href="#1-确定价格和仓位的自动交易" class="headerlink" title="1. 确定价格和仓位的自动交易"></a>1. 确定价格和仓位的自动交易</h3><p>我的仓位图中大约有 20 多只股票。如果每天都要逐一查看这些股票，想想都觉得麻烦。通过程序的自动化，我节省了大量看盘时间。<br>我只需创建股票的交易预期，程序会自动监听并执行操作。例如，对于中远海控，我已经设置好了买卖点对应的价格和数量。</p><h3 id="2-动态止盈的自动交易"><a href="#2-动态止盈的自动交易" class="headerlink" title="2. 动态止盈的自动交易"></a>2. 动态止盈的自动交易</h3><p>对于已经盈利的股票，我会设置一些止盈点来决定何时卖出。<br>以 2500 元为界限，当某只股票的阶段性收益超过 2500 元时，我会考虑卖出接近 2500 元的部分仓位。下一次卖出的点则会递增，比如 2500 × 1.1 &#x3D; 2750 元。<br>我的数据库记录大致如下：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743601874108.png" alt="1743601874108.png"></p><h3 id="3-成功买卖后自动创建未来交易"><a href="#3-成功买卖后自动创建未来交易" class="headerlink" title="3. 成功买卖后自动创建未来交易"></a>3. 成功买卖后自动创建未来交易</h3><p>有些交易策略是以买入和卖出形成闭环的操作逻辑。我实现了一个功能：当每日交易成功后，程序会自动创建未来的交易记录。<br>例如，当我以 1.532 的价格卖出 5000 股某股票时，程序会自动生成一条未来买入记录，价格为卖出价的 0.9 倍（即 1.3788）。同样，买入成功后也会生成未来的卖出记录。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743602167758.png" alt="1743602167758.png"></p><hr><h2 id="一些模型和回测的分享"><a href="#一些模型和回测的分享" class="headerlink" title="一些模型和回测的分享"></a>一些模型和回测的分享</h2><p>我认为股票交易在长期来看是一个概率问题，因此会通过模型和回测来量化收益和风险。以下是一些分享：</p><h3 id="盈利与亏损模型"><a href="#盈利与亏损模型" class="headerlink" title="盈利与亏损模型"></a>盈利与亏损模型</h3><p><a href="https://colab.research.google.com/drive/1ZSx6gjOYQBs6Kv3lUFxGAUrbspKn-UKO">查看 Colab Notebook</a></p><p>这个文档并不是告诉你能赚多少钱或亏多少钱，而是帮助你量化预期收益或损失。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743602768755.png" alt="1743602768755.png"></p><h3 id="使用-Backtrader-进行回测"><a href="#使用-Backtrader-进行回测" class="headerlink" title="使用 Backtrader 进行回测"></a>使用 Backtrader 进行回测</h3><p><a href="https://colab.research.google.com/drive/10Na4a0COSXyzP6dQbDyjjAn9nerJJY1G">查看 Colab Notebook</a></p><p>这个回测策略是基于某只股票当天价格相较于前一天最高点的跌幅进行买入，再逐步卖出的收益率分析。它可以回测过去几年的数据，标记买卖点并分析最终结果，非常实用。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743602782918.png" alt="1743602782918.png"></p><p>如果你是 Backtrader 的新手，可以参考这个 <a href="https://colab.research.google.com/drive/1a3aKFW656QBf4T3bIWynRWCoogKGlVP7">Notebook</a>，它详细介绍了如何使用 Backtrader 以及展示回测结果。</p><hr><h2 id="bolt-的一些使用技巧"><a href="#bolt-的一些使用技巧" class="headerlink" title="bolt 的一些使用技巧"></a>bolt 的一些使用技巧</h2><h3 id="1-页面分离与项目结构化"><a href="#1-页面分离与项目结构化" class="headerlink" title="1. 页面分离与项目结构化"></a>1. 页面分离与项目结构化</h3><p>在使用 bolt 时，我会要求它将不同的页面或组件进行分离。这不仅方便后续修改，也让项目逻辑更加清晰。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743603303831.png" alt="1743603303831.png"></p><h3 id="2-Mock-数据与生产数据分离"><a href="#2-Mock-数据与生产数据分离" class="headerlink" title="2. Mock 数据与生产数据分离"></a>2. Mock 数据与生产数据分离</h3><p>bolt 的后端功能无法完全满足我的需求，因此我要求它规范化接口并提供 Mock 数据功能。以下是实现示例：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743603470481.png" alt="1743603470481.png"></p><p>在开发阶段，页面使用 Mock 数据；而在生产部署时，切换为我自己的接口。这种分离极大提升了开发效率。</p><h3 id="3-客户端集成的痛点"><a href="#3-客户端集成的痛点" class="headerlink" title="3. 客户端集成的痛点"></a>3. 客户端集成的痛点</h3><p>目前，bolt 生成的前端代码需要手动下载并导入到本地项目中。虽然前后端分离已经实现，但这个过程仍然不够高效。希望未来 bolt 能支持远程同步代码到本地的功能。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743603753439.png" alt="1743603753439.png"></p><hr><h2 id="项目部署与自动化"><a href="#项目部署与自动化" class="headerlink" title="项目部署与自动化"></a>项目部署与自动化</h2><p>作为我的老本行，CI&#x2F;CD 流程是我非常熟悉的领域。未来有机会，我会专门写一篇文章分享我的自用 CI&#x2F;CD 流程。</p><hr><h2 id="整理和总结"><a href="#整理和总结" class="headerlink" title="整理和总结"></a>整理和总结</h2><p>虽然我的账户一直是盈利的，但我并不在意这个交易系统能赚多少钱或亏多少钱。对我来说，这个系统的意义在于让交易更加结构化和可追溯化。<br>大多数时候，我们追求的不是赚钱，而是创建一个系统来解决问题。当你解决了足够多的问题，自然会获得一些收益。<br>我并不认为自己是投资者，而是一个拥有自动化工具的交易员。</p><hr>]]></content>
    
    
    <summary type="html">从去年开始, 我就逐步在构建自己的交易系统, 后来借助bolt的支持, 将交易系统的前端部分也进行了完善. 目前基本的功能也已经具备. 希望借这篇文章能把开发流程以及交易系统的部分功能与大家分享一下, 希望有所启发. 此文章分享的内容不构成任何投资建议!!</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="回测" scheme="https://corvo.myseu.cn/tags/%E5%9B%9E%E6%B5%8B/"/>
    
    <category term="bolt" scheme="https://corvo.myseu.cn/tags/bolt/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="Backtrader" scheme="https://corvo.myseu.cn/tags/Backtrader/"/>
    
  </entry>
  
  <entry>
    <title>日本旅游时的井盖</title>
    <link href="https://corvo.myseu.cn/2025/03/04/2025-03-04-%E6%97%A5%E6%9C%AC%E6%97%85%E6%B8%B8%E6%97%B6%E7%9A%84%E4%BA%95%E7%9B%96/"/>
    <id>https://corvo.myseu.cn/2025/03/04/2025-03-04-%E6%97%A5%E6%9C%AC%E6%97%85%E6%B8%B8%E6%97%B6%E7%9A%84%E4%BA%95%E7%9B%96/</id>
    <published>2025-03-04T15:32:41.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<!-- 文档内容部分 --><p>在日本旅行时，我发现日本的井盖设计非常精美，每个城市都有其独特的设计风格。以下是我在不同城市拍摄的井盖照片集。</p><!-- 数据配置部分 --><script type="text/javascript">// 图片 URL 前缀配置const IMAGE_PREFIX = {  RAW: "https://rawforcorvofeng.cn",  BLOG: "https://rawforcorvofeng.cn/blog/2024/10/16",  JAPAN: "https://rawforcorvofeng.cn/JapanManholeCover"};// 图片数据配置const galleryImages = {  "大阪": [    {      path: "/JapanManholeCover/DSC06881.jpeg",      location: "大阪",      description: "已经忘记在哪里拍的了"    },    {      path: "/JapanManholeCover/DSC07062.jpeg",      location: "天王寺",      // description: ""    },    {      path: "/JapanManholeCover/IMG_6894.jpeg",      location: "大阪府",      // description: ""    },    {      path: "/JapanManholeCover/IMG_6951.jpeg",      location: "茶屋町駅",      // description: ""    },  ],  "神户": [    {      path: "/JapanManholeCover/IMG_6902.jpeg",      location: "神户三宫",      description: ""    },    {      path: "/JapanManholeCover/IMG_6910.jpeg",      location: "东川崎町",      description: ""    },    {      path: "/JapanManholeCover/IMG_6913.jpeg",      location: "东川崎町-2",      description: ""    },    {      path: "/JapanManholeCover/IMG_6914.jpeg",      location: "須磨",      description: ""    },  ],  "宇治": [    {      path: "/JapanManholeCover/IMG_6957.jpeg",      location: "宇治",      description: ""    },    {      path: "/JapanManholeCover/IMG_6966.jpeg",      location: "宇治-2",      description: ""    },    {      path: "/JapanManholeCover/IMG_7027.jpeg",      location: "宇治-3",      description: ""    },    {      path: "/JapanManholeCover/IMG_7040.jpeg",      location: "宇治-4",      description: ""    },    {      path: "/JapanManholeCover/IMG_7048.jpeg",      location: "宇治上神社",      description: ""    },  ],  "奈良": [    {      path: "/JapanManholeCover/IMG_7211.jpeg",      location: "奈良",      description: ""    }  ]};// 处理图片数据，添加完整 URLconst galleryData = Object.fromEntries(  Object.entries(galleryImages).map(([city, images]) => [    city,    images.map(img => ({      ...img,      url: `${IMAGE_PREFIX.RAW}${img.path}`    }))  ]));</script><!-- 样式部分 --><style>  .gallery-section {    margin: 2rem -2rem;    padding: 20px;    background: rgba(255, 255, 255, 0.6);    backdrop-filter: blur(10px);    -webkit-backdrop-filter: blur(10px);    border-radius: 20px;    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);  }    .gallery-title {    font-size: 1.8rem;    margin-bottom: 1.5rem;    color: #1d1d1f;    font-weight: 500;    padding-left: 15px;    border-left: 4px solid #007AFF;  }  #images {    display: flex;    flex-direction: column;    gap: 30px;    padding: 0;    width: 100%;  }  .image-group {    position: relative;    width: 100%;  }  .image-group-inner {    display: grid;    gap: 20px;    padding: 0 20px;  }  /* 根据图片数量自动调整网格布局 */  .image-group-inner[data-count="1"] {    grid-template-columns: 1fr;    max-width: 800px;    margin: 0 auto;  }  .image-group-inner[data-count="2"] {    grid-template-columns: repeat(2, 1fr);  }  .image-group-inner[data-count="3"] {    grid-template-columns: repeat(3, 1fr);  }  .image-group-inner[data-count="4"] {    grid-template-columns: repeat(2, 1fr);  }  .image-group-inner[data-count="5"],  .image-group-inner[data-count="6"] {    grid-template-columns: repeat(3, 1fr);  }  .image-container {    width: 100%;    padding-bottom: 100%;    position: relative;    border-radius: 12px;    overflow: hidden;    background: rgba(255, 255, 255, 0.7);    backdrop-filter: blur(10px);    -webkit-backdrop-filter: blur(10px);    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);    transition: transform 0.3s ease, box-shadow 0.3s ease;  }  .image-container:hover {    transform: scale(1.02);    box-shadow: 0 8px 12px rgba(0, 0, 0, 0.15);  }  .image-container img {    position: absolute;    top: 0;    left: 0;    width: 100%;    height: 100%;    object-fit: cover;    transition: filter 0.3s ease;    will-change: filter;  /* 优化渲染性能 */    /* transform: translateZ(0);  强制GPU加速 */  }  /* 添加占位符样式 */  .image-container::before {    content: '';    position: absolute;    top: 0;    left: 0;    width: 100%;    height: 100%;    background: #f0f0f0;    border-radius: 12px;  }  .location-label {    position: absolute;    bottom: 0;    left: 0;    right: 0;    padding: 12px;    background: rgba(255, 255, 255, 0.8);    backdrop-filter: blur(5px);    -webkit-backdrop-filter: blur(5px);    font-size: 0.9rem;    color: #1d1d1f;    text-align: center;  }  /* 响应式布局 */  @media (max-width: 1024px) {    .gallery-section {      margin: 1.5rem -1.5rem;      padding: 15px;    }    .gallery-title {      font-size: 1.5rem;      margin-bottom: 1.2rem;    }    .image-group-inner[data-count="3"],    .image-group-inner[data-count="5"],    .image-group-inner[data-count="6"] {      grid-template-columns: repeat(2, 1fr);    }    .image-group-inner {      gap: 15px;      padding: 0 15px;    }  }  @media (max-width: 640px) {    .gallery-section {      margin: 1rem -1rem;      padding: 12px;      border-radius: 15px;    }    .gallery-title {      font-size: 1.3rem;      margin-bottom: 1rem;      padding-left: 12px;      border-left: 3px solid #007AFF;    }    .image-group-inner {      gap: 12px;      padding: 0 8px;    }    .image-group-inner[data-count="2"],    .image-group-inner[data-count="3"],    .image-group-inner[data-count="4"],    .image-group-inner[data-count="5"],    .image-group-inner[data-count="6"] {      grid-template-columns: repeat(2, 1fr);      gap: 8px;    }    .image-container {      border-radius: 8px;    }    .location-label {      padding: 8px;      font-size: 0.85rem;    }  }  @media (max-width: 380px) {    .gallery-section {      margin: 0.8rem -0.8rem;      padding: 10px;    }    .image-group-inner {      padding: 0 6px;    }    .image-group-inner[data-count="2"],    .image-group-inner[data-count="3"],    .image-group-inner[data-count="4"],    .image-group-inner[data-count="5"],    .image-group-inner[data-count="6"] {      grid-template-columns: 1fr;      gap: 10px;    }    .location-label {      padding: 6px;      font-size: 0.8rem;    }  }</style><!-- 图片展示容器 --><div id='images'></div><!-- 脚本部分 --><script type="module">  document.addEventListener("DOMContentLoaded", function() {    const container = document.getElementById('images');    // 创建图片组    for (const [city, images] of Object.entries(galleryData)) {      const groupSection = document.createElement('div');      groupSection.classList.add('gallery-section');            const groupTitle = document.createElement('h2');      groupTitle.classList.add('gallery-title');      groupTitle.textContent = city;            const groupContainer = document.createElement('div');      groupContainer.classList.add('image-group');      const groupInner = document.createElement('div');      groupInner.classList.add('image-group-inner');      groupInner.setAttribute('data-count', images.length);      images.forEach(imageData => {        const anchor = document.createElement('a');        anchor.setAttribute('data-fancybox', city);        anchor.setAttribute('data-src', imageData.url);        const caption = `${city} · ${imageData.location}${imageData.description ? ` - ${imageData.description}` : ''}`;        anchor.setAttribute('data-caption', caption);        anchor.setAttribute('data-slug', imageData.location);        const imgContainer = document.createElement('div');        imgContainer.classList.add('image-container');        const img = document.createElement('img');        // 添加原生懒加载和异步解码        img.setAttribute('loading', 'lazy');        img.setAttribute('decoding', 'async');        // 使用较小的缩略图作为预览        const thumbnailUrl = imageData.url.replace('/JapanManholeCoverCompressed/', '/JapanManholeCoverCompressed/thumbnails/');        img.setAttribute('data-src', thumbnailUrl);        img.style.cssText = 'position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover;';        // 添加渐进式加载效果        const fullImg = new Image();        fullImg.src = imageData.url;        fullImg.onload = () => {          img.src = imageData.url;          img.style.transition = 'filter 0.3s ease';          img.style.filter = 'none';        };        img.style.filter = 'blur(10px)';        const locationLabel = document.createElement('div');        locationLabel.classList.add('location-label');        locationLabel.textContent = imageData.location;        imgContainer.appendChild(img);        imgContainer.appendChild(locationLabel);        anchor.appendChild(imgContainer);        groupInner.appendChild(anchor);      });      groupContainer.appendChild(groupInner);      groupSection.appendChild(groupTitle);      groupSection.appendChild(groupContainer);      container.appendChild(groupSection);    }    // 懒加载实现    const lazyImages = document.querySelectorAll('img.lazy');    const imageObserver = new IntersectionObserver((entries, observer) => {      entries.forEach(entry => {        if (entry.isIntersecting) {          const img = entry.target;          img.src = img.getAttribute('data-src');          img.addEventListener('load', () => {            img.classList.add('loaded');          });          img.classList.remove('lazy');          observer.unobserve(img);        }      });    }, {      rootMargin: '50px 0px',      threshold: 0.1    });    lazyImages.forEach(img => {      imageObserver.observe(img);    });  });</script><p>这里图片的布局相关都是使用cursor实现的, 强大啊!</p>]]></content>
    
    
    <summary type="html">这里记录了我在日本时拍到的一些漂亮的井盖</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="日本" scheme="https://corvo.myseu.cn/tags/%E6%97%A5%E6%9C%AC/"/>
    
    <category term="旅游" scheme="https://corvo.myseu.cn/tags/%E6%97%85%E6%B8%B8/"/>
    
  </entry>
  
  <entry>
    <title>大型项目的云原生迁移方案整理</title>
    <link href="https://corvo.myseu.cn/2024/10/16/2024-10-16-%E5%A4%A7%E5%9E%8B%E9%A1%B9%E7%9B%AE%E7%9A%84%E4%BA%91%E5%8E%9F%E7%94%9F%E6%96%B9%E6%A1%88%E8%BF%81%E7%A7%BB/"/>
    <id>https://corvo.myseu.cn/2024/10/16/2024-10-16-%E5%A4%A7%E5%9E%8B%E9%A1%B9%E7%9B%AE%E7%9A%84%E4%BA%91%E5%8E%9F%E7%94%9F%E6%96%B9%E6%A1%88%E8%BF%81%E7%A7%BB/</id>
    <published>2024-10-16T12:14:31.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<p>项目前期的迁移工作是我在负责, 后续因为合规问题没有办法处理美国的环境, 就由其他同事继续操作完成,这篇博客就记录下我们迁移时遇到的问题以及一些解决方案. 希望能帮助读者在多云环境下的云原生方案的提供一个思路.我默认读者有过Docker以及Kubernetes使用经验, 以及使用它们部署过一些应用.</p><p><img src="https://rawforcorvofeng.cn/blog/2024/10/16/1729009079600.png" alt="1729009079600.png"></p><h2 id="项目时间线"><a href="#项目时间线" class="headerlink" title="项目时间线"></a>项目时间线</h2><ul><li>22年09月: 我入职时 老板告诉我有一项工作是将我们的项目从Mesos集群迁移到Kubernetes集群</li><li>23年04月: 开始梳理所有的报警规则, 整理日志以及其他数据上报的链路</li><li>23年06月: 迁移前的计划与筹备, 并且尝试从零搭建服务</li><li>23年10月: 全球第一个区域迁移成功, 后续并行迁移多个区域</li><li>24年01月: 海外地区除美国外全部迁移成功, 我休了很久的年假, 直到春节假期结束, 非常开心</li><li>24年03月: 迁移工作由其他同事接手, 开始美国区域的迁移</li><li>24年07月: 美国部分完成迁移, 海外的所有环境均迁移至Kubernetes集群</li></ul><h2 id="前置工作"><a href="#前置工作" class="headerlink" title="前置工作"></a>前置工作</h2><p><img src="https://rawforcorvofeng.cn/blog/2024/10/16/6613681.jpg" alt="6613681.jpg"></p><p>下面这些内容其实很虚, 但又十分必要.必要性在于, 你要告诉老板, 告诉同事, 告诉合作部门. 整个迁移的成功率在90%以上, 而且遇到了问题能够有拖底的解决方案.</p><h3 id="梳理现有环境"><a href="#梳理现有环境" class="headerlink" title="梳理现有环境"></a>梳理现有环境</h3><p>要梳理的内容主要包括: 监控报警, 迁移范围</p><p>我们一般将报警按照是否有Player Impact进行区分, 为了整个迁移过程要保证用户无感.报警梳理这部分工作我做了挺久的, 主要是确认数据源, 数据上报链路, 有些时候直接去看后端代码, 确认下具体的报警逻辑.</p><h3 id="Demo环境搭建以及验证"><a href="#Demo环境搭建以及验证" class="headerlink" title="Demo环境搭建以及验证"></a>Demo环境搭建以及验证</h3><p>这部分直接决定着我们迁移方案的选择. 虽然合作方提供了Helm Chart, 但是在具体落地时, 需要事先将可能的坑踩一遍, 才能有把握去做好方案以及应对措施.</p><h3 id="部门协调"><a href="#部门协调" class="headerlink" title="部门协调"></a>部门协调</h3><p>这部分的工作不止是为了给老板做汇报, 也是为了让合作方伙伴更加信任我们, 要让对方也觉得这个工作是有把握的.</p><p>需要给出迁移的大致时间线, 并且做好风险评估以及回滚方案.</p><p>比如, 我们的系统有区分大版本和热更, 3个月一个大版本. 那么我们在规划时间线的时候, 就要考虑大版本的时间线, 最好在两个大版本之间完成, 避免在发大版本的时候出现事故.</p><h2 id="问题与解决方案"><a href="#问题与解决方案" class="headerlink" title="问题与解决方案"></a>问题与解决方案</h2><p>这里记录一些我们曾经遇到的问题, 时间过去很久, 我就凭借记忆讲讲.</p><h3 id="流水线改造"><a href="#流水线改造" class="headerlink" title="流水线改造"></a>流水线改造</h3><p><img src="https://rawforcorvofeng.cn/blog/2024/10/16/6613630.jpg" alt="6613630.jpg"></p><p>我们原有的流水线是基于BK GUI搭建的, 每次修改都需要在页面上点点点, 而且版本控制也不好用.基于此, 我们整套流水线改用Jenkins来实现了.</p><p>我之前写了一篇<a href="https://corvo.myseu.cn/2024/03/28/2024-03-28-Groovy%E4%B8%AD%E7%9A%84%E5%87%A0%E7%A7%8D%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6%E6%96%B9%E6%A1%88/">使用Groovy进行编程: 执行流程控制技巧与心得</a>, 里面用到的并发以及重试技术基本就是整个流水线的核心了.</p><p>到目前为止, 流水线稳定运行了一年, 运行基本十分稳定且未出现重构功能这样的大改动.</p><p>我应该会再写一篇在Jenkins中如何做好流水线的单元测试以及项目规划的博客.</p><h3 id="有状态的节点"><a href="#有状态的节点" class="headerlink" title="有状态的节点"></a>有状态的节点</h3><p><img src="https://rawforcorvofeng.cn/blog/2024/10/16/1729008870068.png" alt="1729008870068.png"></p><p>虽然我们的业务在迁移前就已经使用了Mesos将其跑在了容器里, 但是在机器上还有几个目录是当前机器的容器都要共享的.为此, 我们使用了两个<code>DaemonSet</code>来同步机器上的这些目录文件, 但是依然存在着风险.</p><p>后来, 同事提出了一个解决方案, 新创建的<code>Node</code>会带有<code>taint</code>记号, 假如我们没有手动操作过这个<code>Node</code>,它就不会被投入使用. 这个问题我们至今也未完全解决, 带来的问题就是自动扩缩容迟迟没法落地.</p><p>给我带来了足够的教训, 业务一开始就不能有对有状态节点的依赖. 说人话就是, 自己把云硬盘或是volume挂进去,别用机器上的文件夹.</p><h3 id="AWS-CNI与多网卡问题"><a href="#AWS-CNI与多网卡问题" class="headerlink" title="AWS CNI与多网卡问题"></a>AWS CNI与多网卡问题</h3><p><img src="https://rawforcorvofeng.cn/blog/2024/10/16/1729009020265.png" alt="1729009020265.png"></p><p>在美国的一些服务器, 会绑定一个单独的加速IP来降低玩家的游戏延迟, 本意是为了提升用户体验.但是同事发现在EKS集群中我们自己添加的网卡会被vpc-cni自动删掉. 他们当时没什么思路, 我说那我去读读看vpc-cni的代码吧,</p><p>被删掉的原因我找ChatGPT分析了一下代码</p><p><a href="https://chatgpt.com/share/8e96aedc-b297-4f97-b765-267d108229f9">https://chatgpt.com/share/8e96aedc-b297-4f97-b765-267d108229f9</a></p><p>然后又看到了这个字段, 可以令<code>vpc-cni</code>忽略我们的网卡.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// eniNoManageTagKey is the tag that may be set on an ENI to indicate ipamd</span></span><br><span class="line"><span class="comment">// should not manage it in any form.</span></span><br><span class="line">eniNoManageTagKey = <span class="string">&quot;node.k8s.amazonaws.com/no_manage&quot;</span></span><br></pre></td></tr></table></figure><p><a href="https://docs.aws.amazon.com/eks/latest/userguide/pod-multiple-network-interfaces.html">https://docs.aws.amazon.com/eks/latest/userguide/pod-multiple-network-interfaces.html</a><a href="https://docs.aws.amazon.com/whitepapers/latest/ec2-networking-for-telecom/multus-container-network-interface-cni.html">https://docs.aws.amazon.com/whitepapers/latest/ec2-networking-for-telecom/multus-container-network-interface-cni.html</a> </p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// https://github.com/aws/amazon-vpc-cni-k8s/blob/06828cee09446fd9e501984727ed807254385cb8/pkg/ipamd/ipamd.go#L1348</span></span><br><span class="line">attachedENIs := c.filterUnmanagedENIs(allENIs)</span><br></pre></td></tr></table></figure><p>当然可以说是我们文档读的还不够多, 不过, 能有机会简单看看基础组件的代码, 把问题解决掉, 还是很开心的.</p><h3 id="混合云服务"><a href="#混合云服务" class="headerlink" title="混合云服务"></a>混合云服务</h3><p>我们使用的云服务业务中, 由于政策原因, 有一部分是非AWS以及腾讯云的, 我们仅仅租赁了几台物理机, 并通过专线进行组网.针对这部分机器, 也需要添加到腾讯云的TKE中, 才能完成整体K8S的升级. 这里借助了腾讯云的注册节点.只是网络方面稍稍不同, 我们直接用hostNetwork的方式规避了问题.</p><p><a href="https://www.tencentcloud.com/zh/document/product/457/60282">https://www.tencentcloud.com/zh/document/product/457/60282</a></p><h2 id="一些思考"><a href="#一些思考" class="headerlink" title="一些思考"></a>一些思考</h2><p><img src="https://rawforcorvofeng.cn/blog/2024/10/16/1729009211783.png" alt="1729009211783.png"></p><h3 id="Terraform与IaC"><a href="#Terraform与IaC" class="headerlink" title="Terraform与IaC"></a>Terraform与IaC</h3><p>我们使用Terraform是为了什么, 我觉得在使用它之前就要想清楚.</p><p>有个概念叫<code>SSoT</code>(<code>Single Source of Truth</code>), 对应在我们系统架构中, 它的含义是,我们们的当前的机器是什么功能, 他们分别有什么样的任务.在没有Terraform之前, 这部分数据可能会存储在<code>CMDB</code>中, 这也是一种<code>SSoT</code>, 但是<code>CMDB</code>的维护是需要人工的,也就是说, 从我们修改了一个机器的属性, 到它最后反映到<code>CMDB</code>中是有一个流程的.Terraform的存在简化了这一流程, 当我们对基建作出了改动的时候, Terraform的state就是一个<code>SSoT</code>,原有的<code>CMDB</code>就可以退变成仅仅是一个展示平台.</p><p>这里我推荐使用 Teragrunt+Atlantis 的方式, 真正的将基建的修改与审批流程相结合. 从技术人员的角度讲, 这个流程太美了.</p><p><a href="https://medium.com/@unruly_mood/terragrunt-terraform-with-atlantis-to-automate-your-infrastructure-pull-requests-9832dd24e5bf">https://medium.com/@unruly_mood/terragrunt-terraform-with-atlantis-to-automate-your-infrastructure-pull-requests-9832dd24e5bf</a></p><h3 id="云原生问题的一些思考"><a href="#云原生问题的一些思考" class="headerlink" title="云原生问题的一些思考"></a>云原生问题的一些思考</h3><p>Cloud Native 还是 Cloud Provider Native</p><p>在迁移结束之后, 我收到了一个任务是将原有的一部分逻辑迁移到Jenkins流水线中, 这个逻辑是到某台机器中执行一些脚本.不知道读者能想到有哪些方案, 我直接列出来这几种, 相信肯定有你想过的:</p><ol><li>使用ssh登录到机器, 执行对应的脚本, 最简单, 但是扩展性低, 而且我们机器上基本都取消ssh的服务了</li><li>使用AWS或是腾讯云提供的SSM&#x2F;TAT服务, 调用云厂商提供的脚本执行API</li><li>我已经有了Kubernetes集群, 那么我可以新建一个pod, 在Jenkins执行<code>kubectl exec -ti  xxxx run.sh</code>exec中时, 会保留stdoud和stderr的日志, 相当于使用Jenkins来做执行日志的保留</li></ol><p>最后我选择了第三种, 也说服了老板, 现在它也还在这么跑着. 这是我的考虑:</p><ol><li>需要区分好什么是云原生以及云厂商原生, 当我们使用了厂商提供的特有API的时候, 我们就应该问自己, 这是必要的吗?</li><li>需要区分业务的需求, 比如, 什么需求是来自业务的, 什么需求是来自基建的, 我们值不值得为这个需求写一层多云厂商的兼容?</li></ol><h3 id="全球化协作"><a href="#全球化协作" class="headerlink" title="全球化协作"></a>全球化协作</h3><p>在一个全球化的团队里其实是很幸福的. 我能想到2点,</p><ol><li>你可以不太需要担心PageDuty(oncall)的问题, 美国的同事可以在我们凌晨的时候来处理问题.</li><li>对于美东的同事, 我们和他们正好相差12小时, 相当于CN的白天我来处理, 工作结果留好言.CN的夜晚由他们继续来做, 工作效率非常高</li></ol><p>凌晨喊人oncall是不人道的, 运维全球化一定是趋势.</p><!-- ![Data_Programming1.jpg](https://rawforcorvofeng.cn/blog/2024/10/16/Data_Programming1.jpg) --><h2 id="整理和总结"><a href="#整理和总结" class="headerlink" title="整理和总结"></a>整理和总结</h2><p>其实7月份我就想写这个博客了, 近期终于有时间来整理下思路. 实际的问题解决起来还是很有成就感的, 但是一定要做好记录哈哈.不然就真的只能在写博客的时候苦苦搜寻记忆了.</p><p>Image by <a href="https://www.freepik.com/free-vector/isometric-quantum-illustration_22379497.htm#query=cloud%20native&position=13&from_view=keyword&track=ais_hybrid&uuid=88d382ac-b0be-4c67-9d29-55ac3ec80e70">Freepik</a></p>]]></content>
    
    
    <summary type="html">项目前期的迁移是我在负责, 后续因为合规问题由其他同事继续操作完成, 这篇博客就记录下我们迁移时遇到的问题以及一些解决方案. 希望能帮助读者在多云环境下的云原生方案的提供一个思路</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Kubernetes" scheme="https://corvo.myseu.cn/tags/Kubernetes/"/>
    
    <category term="Jenkins" scheme="https://corvo.myseu.cn/tags/Jenkins/"/>
    
    <category term="kubemux" scheme="https://corvo.myseu.cn/tags/kubemux/"/>
    
    <category term="全球化" scheme="https://corvo.myseu.cn/tags/%E5%85%A8%E7%90%83%E5%8C%96/"/>
    
    <category term="AWS" scheme="https://corvo.myseu.cn/tags/AWS/"/>
    
    <category term="Tencent Cloud" scheme="https://corvo.myseu.cn/tags/Tencent-Cloud/"/>
    
    <category term="Zenlayer" scheme="https://corvo.myseu.cn/tags/Zenlayer/"/>
    
    <category term="Blueking" scheme="https://corvo.myseu.cn/tags/Blueking/"/>
    
    <category term="Apache Mesos" scheme="https://corvo.myseu.cn/tags/Apache-Mesos/"/>
    
    <category term="Terraform" scheme="https://corvo.myseu.cn/tags/Terraform/"/>
    
    <category term="Terragrunt" scheme="https://corvo.myseu.cn/tags/Terragrunt/"/>
    
  </entry>
  
  <entry>
    <title>我自制的一些NFC冰箱贴</title>
    <link href="https://corvo.myseu.cn/2024/10/14/2024-10-14-%E6%88%91%E8%87%AA%E5%88%B6%E7%9A%84%E4%B8%80%E4%BA%9BNFC%E5%86%B0%E7%AE%B1%E8%B4%B4/"/>
    <id>https://corvo.myseu.cn/2024/10/14/2024-10-14-%E6%88%91%E8%87%AA%E5%88%B6%E7%9A%84%E4%B8%80%E4%BA%9BNFC%E5%86%B0%E7%AE%B1%E8%B4%B4/</id>
    <published>2024-10-14T19:24:40.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>创意来自之前同期做的小卡纸卡片，她做的太精美了。但她和我说有点遗憾是没有加NFC跳转音乐的功能。我就想花时间探索一下，现在已经可以成功写入并且正常唤醒网易云音乐和bilibili了。</p><p>AI生成图片的能力着实给不会画图的我提供了很多可能哈哈哈.</p><h2 id="图片生成"><a href="#图片生成" class="headerlink" title="图片生成"></a>图片生成</h2><h3 id="准备提示词"><a href="#准备提示词" class="headerlink" title="准备提示词"></a>准备提示词</h3><p>我是用ChatGPT先准备好了提示词</p><p><img src="https://rawforcorvofeng.cn/blog/2024/10/14/lyrics.png" alt="lyrics.png"></p><h3 id="生成素材"><a href="#生成素材" class="headerlink" title="生成素材"></a>生成素材</h3><blockquote><p>初始化图片</p></blockquote><p>之前玩的时候自己建过Stable Diffusion, 我就直接用自己的尝试了下, 反正我是觉得够了</p><p><img src="https://rawforcorvofeng.cn/blog/2024/10/14/1728920119784.png" alt="1728920119784.png"></p><blockquote><p>制作NFC贴图</p></blockquote><p>我本身不会用PS, 所以简单的图片编辑是借助这个网站</p><p><a href="https://fabritor.surge.sh/">https://fabritor.surge.sh/</a><a href="https://github.com/sleepy-zone/fabritor-web">https://github.com/sleepy-zone/fabritor-web</a></p><p>简单的加下文字, 合成下图片真的很好用</p><p><img src="https://rawforcorvofeng.cn/blog/2024/10/14/1728920998586.png" alt="1728920998586.png"></p><h3 id="传给店家"><a href="#传给店家" class="headerlink" title="传给店家"></a>传给店家</h3><p>素材准备好之后, 直接传给店家就可以, 就是你心里要有底它大概长什么样子, 以下是我的经验</p><ol><li>图片是很亮的, 但是传给店家做出来的成品是有色差的</li><li>边缘一定要有一点留白, 避免边缘的内容没有完全反映到图片中</li></ol><p>你看这张, 是不是亮度完全不一样:</p><p><img src="https://rawforcorvofeng.cn/blog/2024/10/14/1728921297710.png" alt="1728921297710.png"></p><h2 id="NFC写入"><a href="#NFC写入" class="headerlink" title="NFC写入"></a>NFC写入</h2><p>这个部分我先前分享在了小红书上, 详细可以看这里.</p><p><img src="https://rawforcorvofeng.cn/blog/2024/10/14/1728914659360.png" alt="1728914659360.png"></p><p>【动手制作自己的 NFC 冰箱贴 - 小米粥分你一半 | 小红书 - 你的生活指南】 😆 liPjLOZocun3BUZ 😆 <a href="https://www.xiaohongshu.com/discovery/item/66eeef7000000000260326a6?source=webshare&xhsshare=pc_web&xsec_token=AB5UGv9LJKqQ3S8DKtTLRyyl7RAylzkovtWDS34-7prU4=&xsec_source=pc_share">https://www.xiaohongshu.com/discovery/item/66eeef7000000000260326a6?source=webshare&amp;xhsshare=pc_web&amp;xsec_token=AB5UGv9LJKqQ3S8DKtTLRyyl7RAylzkovtWDS34-7prU4=&amp;xsec_source=pc_share</a></p><h2 id="一些NFC-URI-的分享"><a href="#一些NFC-URI-的分享" class="headerlink" title="一些NFC URI 的分享"></a>一些NFC URI 的分享</h2><table><thead><tr><th>内容</th><th>URI</th><th>来源</th><th></th><th></th></tr></thead><tbody><tr><td>钟无艳</td><td>bilibili:&#x2F;&#x2F;video&#x2F;BV147411s7EB</td><td><a href="https://www.bilibili.com/video/BV147411s7EB/">https://www.bilibili.com/video/BV147411s7EB/</a></td><td></td><td></td></tr><tr><td>喜帖街</td><td>bilibili:&#x2F;&#x2F;video&#x2F;BV1PE411P7Qu</td><td><a href="https://www.bilibili.com/video/BV1PE411P7Qu">https://www.bilibili.com/video/BV1PE411P7Qu</a></td><td></td><td></td></tr><tr><td></td><td>orpheus:&#x2F;&#x2F;song&#x2F;308299</td><td></td><td></td><td></td></tr><tr><td>你们的幸福</td><td>orpheus:&#x2F;&#x2F;song&#x2F;307935</td><td></td><td></td><td></td></tr><tr><td>独家村</td><td>orpheus:&#x2F;&#x2F;song&#x2F;29460213</td><td></td><td></td><td></td></tr><tr><td>载我走</td><td>orpheus:&#x2F;&#x2F;song&#x2F;308020</td><td>308020</td><td></td><td></td></tr><tr><td>年度之歌</td><td>orpheus:&#x2F;&#x2F;song&#x2F;308169</td><td>308169</td><td></td><td></td></tr><tr><td>The Unforgiven 3</td><td>orpheus:&#x2F;&#x2F;song&#x2F;21162394?play&#x3D;1</td><td></td><td></td><td></td></tr><tr><td>你们的幸福</td><td>orpheus:&#x2F;&#x2F;song&#x2F;307935</td><td></td><td></td><td></td></tr><tr><td>剑魔深情诗朗诵</td><td>bilibili:&#x2F;&#x2F;video&#x2F;BV1kq4y1G7U2</td><td><a href="https://www.bilibili.com/video/BV1kq4y1G7U2">https://www.bilibili.com/video/BV1kq4y1G7U2</a></td><td></td><td></td></tr></tbody></table>]]></content>
    
    
    <summary type="html">今年的前半段时间周末在学习调酒, 终于十一之前举办了自己的第一场客座. 打算送给朋友们的礼物是带NFC的冰箱贴.</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="ChatGPT" scheme="https://corvo.myseu.cn/tags/ChatGPT/"/>
    
    <category term="NFC" scheme="https://corvo.myseu.cn/tags/NFC/"/>
    
    <category term="冰箱贴" scheme="https://corvo.myseu.cn/tags/%E5%86%B0%E7%AE%B1%E8%B4%B4/"/>
    
    <category term="谢安琪" scheme="https://corvo.myseu.cn/tags/%E8%B0%A2%E5%AE%89%E7%90%AA/"/>
    
    <category term="调酒" scheme="https://corvo.myseu.cn/tags/%E8%B0%83%E9%85%92/"/>
    
    <category term="fabritor-web" scheme="https://corvo.myseu.cn/tags/fabritor-web/"/>
    
    <category term="Stable Diffusion" scheme="https://corvo.myseu.cn/tags/Stable-Diffusion/"/>
    
  </entry>
  
  <entry>
    <title>VR峡谷预览以及Unity的入门使用</title>
    <link href="https://corvo.myseu.cn/2024/09/16/2024-09-16-Unity%E4%BD%BF%E7%94%A8%E7%9A%84%E4%B8%80%E4%BA%9B%E5%85%A5%E9%97%A8/"/>
    <id>https://corvo.myseu.cn/2024/09/16/2024-09-16-Unity%E4%BD%BF%E7%94%A8%E7%9A%84%E4%B8%80%E4%BA%9B%E5%85%A5%E9%97%A8/</id>
    <published>2024-09-16T21:28:50.000Z</published>
    <updated>2026-05-06T13:29:31.723Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>去年买了<a href="https://www.youtube.com/watch?v=Exu7r2vZpcw">Meta Quest 3</a>, 玩了几次之后就一直在吃灰. 每次录制五杀视频的时候,总想用VR第一人称的方式去观察峡谷中的战斗, 可惜没法hack到游戏客户端.</p><p><img src="https://rawforcorvofeng.cn/blog/vrrift-fps.gif"></p><p>所以我想着直接写个VR版的游戏, 把召唤师峡谷放进去. 这次<a href="https://leagueoflegends.fandom.com/wiki/Thunderdome">Thunderdome</a>正好就有机会去实现了.我之前没做过任何游戏开发, 这次选<a href="https://unity.com/">Unity</a>单纯是因为它的VR demo比较好. 在整个三天中,我实际做的工作有限, 基本是根据VR Demo来改改实现自己的逻辑, 这里抛砖引玉, 希望大佬们不要嘲笑哈哈.</p><p>最后的游玩视频我放在B站了, 可以直接查看:</p><iframe src="//player.bilibili.com/player.html?isOutside=true&aid=113152842860552&bvid=BV1ojtYeEEPa&cid=25898715525&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"  width="100%" height="400" f></iframe><h2 id="Unity学习"><a href="#Unity学习" class="headerlink" title="Unity学习"></a>Unity学习</h2><p>我对Unity一点不认识的时候, 先去youtube上面找了一些视频来看, 确保自己有个还算是正常的认知,其实主要是学习一下C#以及模型的使用.</p><p>这是我看过的一些视频, 主要是</p><blockquote><p>摄像头, 物体移动, 以及键盘鼠标交互</p></blockquote><ul><li><a href="https://www.youtube.com/watch?v=xCxSjgYTw9c">https://www.youtube.com/watch?v=xCxSjgYTw9c</a></li><li><a href="https://www.youtube.com/watch?v=f473C43s8nE">https://www.youtube.com/watch?v=f473C43s8nE</a></li></ul><blockquote><p>刚体碰撞</p></blockquote><ul><li><a href="https://www.youtube.com/watch?v=mkErt53EEFY">https://www.youtube.com/watch?v=mkErt53EEFY</a></li><li><a href="https://www.youtube.com/watch?v=GTvqhLJKzDo">https://www.youtube.com/watch?v=GTvqhLJKzDo</a></li></ul><p>我自己是在Thunderdome前, 动手做了一个3D版简易的打地鼠. 到正式开始时才开始用VR demo重写.类似这样:</p><p><img src="https://rawforcorvofeng.cn/blog/vrrift-3d.gif"></p><h3 id="模型与动作"><a href="#模型与动作" class="headerlink" title="模型与动作"></a>模型与动作</h3><p>我的模型都来源于这里</p><p><a href="https://modelviewer.lol/model-viewer?id=142001">https://modelviewer.lol/model-viewer?id=142001</a></p><p>上次也用这些模型做了一个<a href="https://corvo.myseu.cn/2024/07/01/2024-07-01-%E6%9C%80%E8%BF%91%E5%9C%A8%E7%8E%A9%E7%9A%84%E4%B8%80%E4%BA%9B%E4%BA%8B%E6%83%85/#Heartsteel">网页的Zoe</a></p><p>而且下载的glb格式其实是有动作的, 我在Unity中可以导入模型之后直接加动作效果</p><p><img src="https://rawforcorvofeng.cn/blog/2024/09/17/1726576122927.png" alt="1726576122927.png"></p><p>以剑魔为例, 直接将模型拖拽到场景之后, 添加Animator绑定到模型中就可以了.</p><p><img src="https://rawforcorvofeng.cn/blog/2024/09/17/1726583523512.png" alt="1726583523512.png"></p><h3 id="碰撞与刚体"><a href="#碰撞与刚体" class="headerlink" title="碰撞与刚体"></a>碰撞与刚体</h3><p>说来惭愧, 我现在只搞懂了刚体的概念, 以及碰撞的原理, 对于在Unity中怎么使用它还是完全懵逼,这把亚托克斯的剑, 我是将它固定在demo中原有的一个枪上面, 而后增加了<code>Mesh collider</code>使其能够与其他模型发生交互.</p><p><img src="https://rawforcorvofeng.cn/blog/2024/09/17/1726584573687.png" alt="1726584573687.png"></p><h3 id="VR调试与双项目编译"><a href="#VR调试与双项目编译" class="headerlink" title="VR调试与双项目编译"></a>VR调试与双项目编译</h3><blockquote><p>VR调试</p></blockquote><p>VR项目的开发中, 我不可能每改一点代码就烧到机器中去调试.所以, 开发过程中, 大部分的调试操作发生在开发过程中, 我使用<a href="https://www.youtube.com/watch?v=iE5daijT-sg">XR Device Simulator</a>来实现.虽然不那么好用, 但是已经能够省很多时间了, 其实我觉得最优的方案是可以直接使用真的控制器.</p><p><img src="https://rawforcorvofeng.cn/blog/2024/09/17/1726583897573.png" alt="1726583897573.png"></p><p>在编译生成apk的时候, 手动去掉这个类的勾选即可, 或者我使用了另一种方案<code>git pull --autostash</code>能够直接将这个类关闭.</p><blockquote><p>双项目编译</p></blockquote><p>Unity中编译项目会block掉整个项目的开发, 我原本打算用命令行来做, 后来想了想没心情再去研究.所以我就开了另一个项目, 这个项目只进行代码pull.</p><p><img src="https://rawforcorvofeng.cn/blog/2024/09/17/1726583582235.png" alt="1726583582235.png"></p><p>在pull之后, 我手动触发编译按钮, 最后我得到了这么多的apk包, 其中能稳定运行的我打了stable.</p><p><img src="https://rawforcorvofeng.cn/blog/2024/09/17/1726583897573.png" alt="1726583897573.png"></p><h3 id="C-学习"><a href="#C-学习" class="headerlink" title="C# 学习"></a>C# 学习</h3><p>我之前从没写过C#代码, 不过有ChatGPT的加持, 我能像编写Python代码一样让它帮我生成一部分内容.自己组织的部分其实只有场景概念这些内容.</p><p><img src="https://rawforcorvofeng.cn/blog/2024/09/17/1726584937545.png" alt="1726584937545.png"></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>不管是Thunderdome还是黑客马拉松, 我觉得都非常好玩.但是参加的时候要考虑下, 规定时间之内能做哪些内容, 需要做什么样的提前准备.我觉得前提是保证自己在有限时间内可以做点东西出来, 如果我一开始没做那个简单的3D项目甚至没有对Unity有了个初步的认识, 可能TD的这两天完全都在入门, 根本不可能做的出来.</p>]]></content>
    
    
    <summary type="html">近期公司重新举办了Thunderdome, 终于有机会把自己一直以来的峡谷VR梦想实现了一下了!</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="ChatGPT" scheme="https://corvo.myseu.cn/tags/ChatGPT/"/>
    
    <category term="Unity" scheme="https://corvo.myseu.cn/tags/Unity/"/>
    
    <category term="VR" scheme="https://corvo.myseu.cn/tags/VR/"/>
    
    <category term="Thunderdome" scheme="https://corvo.myseu.cn/tags/Thunderdome/"/>
    
    <category term="Meta Quest 3" scheme="https://corvo.myseu.cn/tags/Meta-Quest-3/"/>
    
    <category term="Riot Games" scheme="https://corvo.myseu.cn/tags/Riot-Games/"/>
    
  </entry>
  
</feed>
