{"id":1070,"date":"2026-05-05T20:54:40","date_gmt":"2026-05-05T12:54:40","guid":{"rendered":"https:\/\/khsci.com\/khQuant\/?page_id=1070"},"modified":"2026-05-05T21:25:05","modified_gmt":"2026-05-05T13:25:05","slug":"linux","status":"publish","type":"page","link":"https:\/\/khsci.com\/khQuant\/linux\/","title":{"rendered":"Linux\u90e8\u7f72\u6559\u7a0b"},"content":{"rendered":"<blockquote><p>\n  \u9002\u7528\u7248\u672c\uff1a<strong>v3.3.1 \u53ca\u4ee5\u4e0a<\/strong><\/p>\n<p>  \u76ee\u6807\uff1a\u5728 Linux \u670d\u52a1\u5668\u3001Docker \u5bb9\u5668\u6216 WSL2 \u4e2d\u5b8c\u6574\u90e8\u7f72 khQuant CLI\uff0c\u5e76\u4e0e Windows GUI \u7aef\u5171\u7528\u540c\u4e00\u4efd\u7b56\u7565\u4ee3\u7801\u3001\u540c\u4e00\u4efd <code>.kh<\/code> \u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<p>  \u672c\u6587\u662f\u5b98\u7f51\u6b63\u5f0f\u6559\u7a0b\uff0c\u914d\u5957\u9605\u8bfb\uff1a<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/khsci.com\/khQuant\/cli\/\">khQuant CLI \u547d\u4ee4\u884c\u5de5\u5177\u5b8c\u6574\u6307\u5357<\/a>\u3002\n<\/p><\/blockquote>\n<hr \/>\n<h2>\u76ee\u5f55<\/h2>\n<ul>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u4e00\u4e3a\u4ec0\u4e48\u8981\u5728-linux-\u4e0a\u90e8\u7f72-khquant\">\u4e00\u3001\u4e3a\u4ec0\u4e48\u8981\u5728 Linux \u4e0a\u90e8\u7f72 khQuant<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u4e8clinux-\u7aef\u80fd\u529b\u77e9\u9635\">\u4e8c\u3001Linux \u7aef\u80fd\u529b\u77e9\u9635<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u4e09\u73af\u5883\u51c6\u5907\">\u4e09\u3001\u73af\u5883\u51c6\u5907<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u56dbgithub-\u79c1\u6709\u5e93\u8ba4\u8bc1\u5173\u952e\u4e00\u6b65\">\u56db\u3001GitHub \u79c1\u6709\u5e93\u8ba4\u8bc1\uff08\u5173\u952e\u4e00\u6b65\uff09<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u4e94\u65b9\u5f0f-apipx-\u5b89\u88c5\u63a8\u8350\">\u4e94\u3001\u65b9\u5f0f A\uff1apipx \u5b89\u88c5\uff08\u63a8\u8350\uff09<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u516d\u65b9\u5f0f-bdocker-\u90e8\u7f72\">\u516d\u3001\u65b9\u5f0f B\uff1aDocker \u90e8\u7f72<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u4e03\u9996\u6b21\u4f7f\u7528\u4e09\u8fdeinit--data--run\">\u4e03\u3001\u9996\u6b21\u4f7f\u7528\u4e09\u8fde\uff1ainit \u2192 data \u2192 run<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u516b\u5347\u7ea7\u4e0e\u5378\u8f7d\">\u516b\u3001\u5347\u7ea7\u4e0e\u5378\u8f7d<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u4e5d\u6545\u969c\u6392\u67e5-faq\">\u4e5d\u3001\u6545\u969c\u6392\u67e5 FAQ<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"#\u5341\u9644\u5f55\u547d\u4ee4\u901f\u67e5\u4e0e\u8d44\u6e90\">\u5341\u3001\u9644\u5f55\uff1a\u547d\u4ee4\u901f\u67e5\u4e0e\u8d44\u6e90<\/a><\/li>\n<\/ul>\n<hr \/>\n<h2>\u4e00\u3001\u4e3a\u4ec0\u4e48\u8981\u5728 Linux \u4e0a\u90e8\u7f72 khQuant<\/h2>\n<p>khQuant \u7684\u56fe\u5f62\u754c\u9762 (GUI) \u7248\u672c\u4e00\u76f4\u662f Windows \u7aef\u7684\u4e3b\u529b\u4ea4\u4ed8\u5f62\u6001\u3002<strong>v3.3.1 \u8d77\u65b0\u589e\u7684 Linux CLI \u90e8\u7f72\uff0c\u5e76\u975e\u66ff\u4ee3 Windows \u7248<\/strong>\uff0c\u800c\u662f\u628a khQuant \u7684\u5e94\u7528\u8fb9\u754c\u5411\u4ee5\u4e0b\u573a\u666f\u6269\u5c55\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u573a\u666f<\/th>\n<th>Linux \u90e8\u7f72\u7684\u4ef7\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u4e91\u670d\u52a1\u5668\u8dd1\u6279<\/strong><\/td>\n<td>Linux \u4e91\u4e3b\u673a\u4fbf\u5b9c\u3001\u7a33\u5b9a\u3001\u4e0d\u5f39\u66f4\u65b0\u7a97\u53e3\uff1b\u9002\u5408\u957f\u65f6\u95f4\u6302\u673a\u505a\u53c2\u6570\u5bfb\u4f18<\/td>\n<\/tr>\n<tr>\n<td><strong>Docker \/ \u5bb9\u5668\u5316<\/strong><\/td>\n<td>\u955c\u50cf\u5206\u53d1\u3001\u4e25\u683c\u9694\u79bb\u3001\u4e00\u4efd\u955c\u50cf\u591a\u673a\u90e8\u7f72\uff0cCI\/CD \u53cb\u597d<\/td>\n<\/tr>\n<tr>\n<td><strong>\u63a5\u5165\u7b2c\u4e09\u65b9\u91cf\u5316\u57fa\u7840\u8bbe\u65bd<\/strong><\/td>\n<td>\u591a\u6570 Linux \u90e8\u7f72\u7684\u5f00\u6e90\u91cf\u5316\u5de5\u5177\uff08\u6570\u636e\u670d\u52a1\u3001\u8c03\u5ea6\u6846\u67b6\u7b49\uff09\u53ef\u540c\u73af\u5883\u90e8\u7f72\u3001\u4e92\u76f8\u8c03\u7528<\/td>\n<\/tr>\n<tr>\n<td><strong>Mac \/ Linux \u4e3b\u529b\u5f00\u53d1\u8005<\/strong><\/td>\n<td>\u901a\u8fc7 SSH \u8fdc\u7a0b\u64cd\u4f5c\u4e91\u4e0a khQuant\uff0c\u672c\u5730\u53ef\u4f7f\u7528\u4efb\u610f\u64cd\u4f5c\u7cfb\u7edf<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote><p>\n  \u2705 Windows \u7aef\u7684\u6240\u6709\u7528\u6237\u4f53\u9a8c\u4fdd\u6301\u4e0d\u53d8\uff0c\u672c\u6587\u4e0d\u5f71\u54cd Windows \u7528\u6237\u7684\u4f7f\u7528\u65b9\u5f0f\u3002\n<\/p><\/blockquote>\n<hr \/>\n<h2>\u4e8c\u3001Linux \u7aef\u80fd\u529b\u77e9\u9635<\/h2>\n<h3>2.1 \u6574\u4f53\u5dee\u5f02<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u7ef4\u5ea6<\/th>\n<th>Windows GUI \u7248<\/th>\n<th>Linux CLI \u7248<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u56fe\u5f62\u754c\u9762 (PyQt5)<\/td>\n<td>\u2705 \u5b8c\u6574 GUI<\/td>\n<td>\u274c \u4e0d\u652f\u6301\uff0c\u4ec5\u547d\u4ee4\u884c<\/td>\n<\/tr>\n<tr>\n<td>\u5185\u5d4c VSCode \u8c03\u8bd5<\/td>\n<td>\u2705 \u652f\u6301<\/td>\n<td>\u274c \u4f7f\u7528\u672c\u673a\u4efb\u610f\u7f16\u8f91\u5668<\/td>\n<\/tr>\n<tr>\n<td>xtdata \u6570\u636e\u6e90<\/td>\n<td>\u2705 \u652f\u6301<\/td>\n<td>\u274c \u4e0d\u652f\u6301\uff08xtdata \u4ec5 Windows \u53ef\u7528\uff09<\/td>\n<\/tr>\n<tr>\n<td>BaoStock \u6570\u636e\u6e90<\/td>\n<td>\u2705 \u652f\u6301<\/td>\n<td>\u2705 \u63a8\u8350\u4f7f\u7528<\/td>\n<\/tr>\n<tr>\n<td>Tushare \u6570\u636e\u6e90<\/td>\n<td>\u2705 \u652f\u6301<\/td>\n<td>\u2705 \u652f\u6301<\/td>\n<\/tr>\n<tr>\n<td>\u672c\u5730 DuckDB \u6570\u636e<\/td>\n<td>\u2705 \u652f\u6301<\/td>\n<td>\u2705 \u652f\u6301\uff08\u53ef\u4ece Windows \u540c\u6b65\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u56de\u6d4b\u3001\u53c2\u6570\u5bfb\u4f18<\/td>\n<td>\u2705 \u652f\u6301<\/td>\n<td>\u2705 \u652f\u6301<\/td>\n<\/tr>\n<tr>\n<td>HTML \u56de\u6d4b\u62a5\u544a<\/td>\n<td>\u2705 \u81ea\u52a8\u6d4f\u89c8\u5668\u6253\u5f00<\/td>\n<td>\u2705 \u8f93\u51fa\u6587\u4ef6\uff0c\u9700 scp\/\u9759\u6001\u670d\u52a1\u67e5\u770b<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>2.2 \u4e00\u53e5\u8bdd\u603b\u7ed3<\/h3>\n<blockquote><p>\n  <strong>\u5728 Linux \u7aef\uff0c\u9664\u4e86\u65e0\u6cd5\u4f7f\u7528 xtdata \u6570\u636e\u6e90\u3001\u6ca1\u6709 GUI \u4e4b\u5916\uff0c\u5176\u4f59\u529f\u80fd\u901a\u8fc7 CLI \u6a21\u5f0f\u4f7f\u7528\u8d77\u6765\u4e0e Windows \u7aef\u6ca1\u6709\u533a\u522b\u3002<\/strong> \u4e24\u7aef\u5171\u7528\u540c\u4e00\u4efd <code>.kh<\/code> \u914d\u7f6e\u6587\u4ef6\u65e0\u7f1d\u5207\u6362\uff0c\u7b56\u7565\u4ee3\u7801\u4e0d\u9700\u8981\u4fee\u6539\u3002\n<\/p><\/blockquote>\n<hr \/>\n<h2>\u4e09\u3001\u73af\u5883\u51c6\u5907<\/h2>\n<blockquote><p>\n  \u4ee5\u4e0b\u547d\u4ee4\u4ee5 <strong>Ubuntu 22.04 LTS<\/strong> \u4e3a\u4f8b\u3002\u5176\u4ed6\u4e3b\u6d41\u53d1\u884c\u7248\uff08Debian\u3001CentOS \/ RHEL\u3001Fedora\u3001Arch\uff09\u5c06 <code>apt<\/code> \u66ff\u6362\u4e3a\u5bf9\u5e94\u5305\u7ba1\u7406\u5668\u5373\u53ef\u3002\n<\/p><\/blockquote>\n<h3>3.1 Python 3.10+<\/h3>\n<pre><code class=\"language-bash line-numbers\">python3 --version\n# \u82e5\u7248\u672c &lt; 3.10 \u6216\u672a\u5b89\u88c5\uff1a\nsudo apt update\nsudo apt install -y python3 python3-pip\n<\/code><\/pre>\n<h3>3.2 pipx\uff08\u5f3a\u70c8\u63a8\u8350\u7528\u4e8e\u5b89\u88c5 kh \u547d\u4ee4\uff09<\/h3>\n<p><code>pipx<\/code> \u4f1a\u4e3a\u6bcf\u4e2a Python \u5e94\u7528\u5efa\u7acb\u72ec\u7acb\u865a\u62df\u73af\u5883\uff0c\u4e0e\u7cfb\u7edf Python \u5b8c\u5168\u9694\u79bb\uff0c\u5b89\u88c5\u3001\u5347\u7ea7\u3001\u5378\u8f7d\u90fd\u5f88\u5e72\u51c0\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">sudo apt install -y pipx\npipx ensurepath        # \u5173\u952e\uff1a\u628a ~\/.local\/bin \u52a0\u5165 PATH\nsource ~\/.bashrc       # \u7acb\u5373\u751f\u6548\uff08zsh \u7528\u6237\u6539\u4e3a source ~\/.zshrc\uff09\n<\/code><\/pre>\n<blockquote><p>\n  \u26a0\ufe0f <strong><code>pipx ensurepath<\/code> \u662f\u65b0\u88c5 pipx \u7528\u6237\u6700\u5bb9\u6613\u6f0f\u7684\u4e00\u6b65<\/strong>\u3002\u6f0f\u6389\u5b83\u4f1a\u51fa\u73b0 <code>kh: command not found<\/code>\uff0c\u56e0\u4e3a <code>~\/.local\/bin<\/code> \u8fd8\u6ca1\u52a0\u5165 PATH\u3002\n<\/p><\/blockquote>\n<h3>3.3 git + GitHub CLI\uff08\u79c1\u6709\u5e93\u4e0b\u8f7d\u5fc5\u5907\uff09<\/h3>\n<p>\u7531\u4e8e <code>khscience\/CSkhQuant<\/code> \u662f\u79c1\u6709\u4ed3\u5e93\uff0c\u4e0b\u8f7d release \u8d44\u4ea7\u524d\u5fc5\u987b\u5b8c\u6210 GitHub \u8ba4\u8bc1\u3002\u6700\u65b9\u4fbf\u7684\u5de5\u5177\u662f\u5b98\u65b9 <code>gh<\/code> CLI\u3002<strong>\u6ce8\u610f <code>gh auth login<\/code> \u5185\u90e8\u4f1a\u8c03\u7528 git \u914d\u7f6e\u51ed\u636e\uff0c\u5fc5\u987b\u5148\u5b89\u88c5 git<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\"># 1. git\uff08gh \u767b\u5f55\u7684\u9690\u85cf\u524d\u7f6e\u4f9d\u8d56\uff09\nsudo apt install -y git\n# CentOS\/RHEL\/Fedora:  sudo dnf install -y git\n# Arch:                sudo pacman -S --noconfirm git\ngit --version\n\n# 2. gh CLI\nsudo apt install -y gh\ngh --version\n<\/code><\/pre>\n<blockquote><p>\n  \u82e5 <code>apt<\/code> \u91cc\u627e\u4e0d\u5230 <code>gh<\/code>\uff0c\u53c2\u8003 <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/cli.github.com\/\">cli.github.com<\/a> \u6dfb\u52a0 GitHub \u5b98\u65b9\u6e90\u540e\u518d\u88c5\u3002\n<\/p><\/blockquote>\n<h3>3.4 Docker\uff08\u53ef\u9009\uff0c\u4ec5\u65b9\u5f0f B \u9700\u8981\uff09<\/h3>\n<pre><code class=\"language-bash line-numbers\">sudo apt install -y docker.io\nsudo usermod -aG docker $USER     # \u628a\u5f53\u524d\u7528\u6237\u52a0\u8fdb docker \u7ec4\uff08\u907f\u514d\u6bcf\u6b21 sudo\uff09\nnewgrp docker                     # \u7acb\u5373\u751f\u6548\uff08\u6216\u91cd\u65b0\u767b\u5f55\uff09\ndocker run --rm hello-world       # \u9a8c\u8bc1\n<\/code><\/pre>\n<hr \/>\n<h2>\u56db\u3001GitHub \u79c1\u6709\u5e93\u8ba4\u8bc1\uff08\u5173\u952e\u4e00\u6b65\uff09<\/h2>\n<blockquote><p>\n  \u8fd9\u4e00\u8282\u9762\u5411 v3.3 \u5185\u6d4b\u7fa4\u7684\u670b\u53cb\uff1a\u4f60\u4eec\u90fd\u5df2\u7ecf\u88ab\u62c9\u8fdb\u9879\u76ee\u7684 GitHub \u79c1\u6709\u5e93 <code>khscience\/CSkhQuant<\/code>\uff0c\u6240\u6709\u4e0b\u8f7d\u548c\u5b89\u88c5\u6b65\u9aa4\u90fd\u4f9d\u8d56\u4e00\u6b21\u6027\u7684 GitHub \u8ba4\u8bc1\u3002\n<\/p><\/blockquote>\n<h3>4.1 \u4e3a\u4ec0\u4e48\u76f4\u63a5\u4e0b\u8f7d\u4f1a 404\uff1f<\/h3>\n<p>\u5982\u679c\u76f4\u63a5\u6267\u884c\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">pipx install https:\/\/github.com\/khscience\/CSkhQuant\/releases\/download\/v3.3.1\/khquant-3.3.1-py3-none-any.whl\n<\/code><\/pre>\n<p>\u901a\u5e38\u4f1a\u5f97\u5230\uff1a<\/p>\n<pre><code class=\"line-numbers\">ERROR: HTTP error 404 while getting ...\n<\/code><\/pre>\n<p><strong>\u8fd9\u4e0d\u662f\u6587\u4ef6\u4e22\u5931\uff0c\u800c\u662f GitHub \u5bf9\u672a\u8ba4\u8bc1\u8bf7\u6c42\u79c1\u6709\u5e93\u8d44\u6e90\u7684\u5b89\u5168\u884c\u4e3a\uff1a\u7edf\u4e00\u8fd4\u56de <code>404 Not Found<\/code> \u800c\u4e0d\u662f <code>401 Unauthorized<\/code><\/strong>\uff0c\u907f\u514d\u66b4\u9732\u4ed3\u5e93\u7684\u5b58\u5728\u6027\u3002\u6240\u6709\u4e0b\u8f7d\u64cd\u4f5c\u4e4b\u524d\uff0c\u672c\u673a\u5fc5\u987b\u5148\u8ba4\u8bc1 GitHub\u3002<\/p>\n<h3>4.2 \u65b9\u5f0f\u4e00\uff1a<code>gh auth login<\/code>\uff08\u6700\u7b80\u5355\uff0c\u5f3a\u70c8\u63a8\u8350\uff09<\/h3>\n<p>\u9002\u5408\uff1a\u672c\u673a\u6216\u53ef\u8bbf\u95ee\u6d4f\u89c8\u5668\u7684\u4efb\u610f\u8bbe\u5907\uff08\u624b\u673a\u3001\u53e6\u4e00\u53f0\u7535\u8111\u5747\u53ef\uff09\u3002<\/p>\n<pre><code class=\"language-bash line-numbers\">gh auth login\n<\/code><\/pre>\n<p>\u6309\u4ee5\u4e0b\u63d0\u793a\u4e00\u8def\u9009\uff1a<\/p>\n<pre><code class=\"line-numbers\">? What account do you want to log into?              GitHub.com\n? What is your preferred protocol for Git operations? HTTPS\n? Authenticate Git with your GitHub credentials?     Yes\n? How would you like to authenticate?                Login with a web browser\n<\/code><\/pre>\n<p>\u7ec8\u7aef\u4f1a\u6253\u5370\u4e00\u4e2a 8 \u4f4d one-time code\uff08\u5f62\u5982 <code>XXXX-XXXX<\/code>\uff09\uff0c\u5e76\u63d0\u793a\u6253\u5f00 <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/login\/device\">github.com\/login\/device<\/a>\u3002<strong>\u5173\u952e\u70b9<\/strong>\uff1a<\/p>\n<ul>\n<li>\u5982\u679c\u5f53\u524d\u673a\u5668\u6709\u6d4f\u89c8\u5668\uff0c\u76f4\u63a5\u5728\u672c\u673a\u6d4f\u89c8\u5668\u767b\u5f55\uff1b<\/li>\n<li>\u5982\u679c\u662f\u7eaf\u547d\u4ee4\u884c\u7684\u4e91\u670d\u52a1\u5668\uff08SSH \u767b\u5f55\uff09\uff0c<strong>\u53ef\u5728\u4efb\u610f\u8bbe\u5907<\/strong>\uff08\u624b\u673a \/ \u53e6\u4e00\u53f0\u7535\u8111\uff09\u6253\u5f00 <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/login\/device\">github.com\/login\/device<\/a>\uff0c\u8f93\u5165 code \u5b8c\u6210\u6388\u6743\u3002<\/li>\n<\/ul>\n<p>\u6388\u6743\u5b8c\u6210\u540e\uff0c\u7ec8\u7aef\u4f1a\u663e\u793a\u7c7b\u4f3c\uff1a<\/p>\n<pre><code class=\"line-numbers\">\u2713 Configured git protocol\n! Authentication credentials saved in plain text\n\u2713 Logged in as khscience\n! You were already logged in to this account\n<\/code><\/pre>\n<p>\u53ea\u8981\u770b\u5230 <code>\u2713 Logged in as &lt;\u4f60\u7684\u8d26\u53f7&gt;<\/code>\uff0c\u5c31\u8bf4\u660e\u8ba4\u8bc1\u6210\u529f\u3002<strong>\u4e00\u6b21\u914d\u597d\uff0c\u540e\u7eed\u6240\u6709 <code>gh<\/code> \u547d\u4ee4\u3001<code>git clone<\/code> \u79c1\u6709\u5e93\u90fd\u4e0d\u9700\u8981\u518d\u8f93\u5bc6\u7801\u3002<\/strong><\/p>\n<h3>4.3 \u65b9\u5f0f\u4e8c\uff1aPersonal Access Token (PAT)<\/h3>\n<p>\u9002\u5408\uff1aCI\/CD\u3001Docker \u5bb9\u5668\u5185\u3001\u7eaf headless \u670d\u52a1\u5668\u3001\u9700\u7cbe\u786e\u63a7\u5236\u6743\u9650\u8303\u56f4\u3002<\/p>\n<h4>Step 1\uff1a\u751f\u6210 token<\/h4>\n<p>\u6253\u5f00 <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/settings\/tokens\">github.com\/settings\/tokens<\/a> \u2192 \u70b9\u51fb <code>Generate new token (classic)<\/code>\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u5b57\u6bb5<\/th>\n<th>\u63a8\u8350\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Note<\/td>\n<td><code>khquant-linux-deploy<\/code><\/td>\n<\/tr>\n<tr>\n<td>Expiration<\/td>\n<td>90 days\uff08\u53ef\u6309\u9700\u8c03\u6574\uff09<\/td>\n<\/tr>\n<tr>\n<td>Select scopes<\/td>\n<td><strong>\u5fc5\u987b\u52fe\u9009 <code>repo<\/code><\/strong>\uff08\u79c1\u6709\u5e93\u8bfb\u53d6\u6743\u9650\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u70b9\u51fb <code>Generate token<\/code>\uff0c\u590d\u5236\u751f\u6210\u7684 <code>ghp_xxxxxxxxxxxxxxxxxxxx<\/code> \u5b57\u7b26\u4e32 \u2014\u2014 <strong>\u8be5\u5b57\u7b26\u4e32\u53ea\u663e\u793a\u4e00\u6b21\uff0c\u8bf7\u59a5\u5584\u4fdd\u5b58<\/strong>\u3002<\/p>\n<h4>Step 2\uff1a\u8ba9\u672c\u673a\u4f7f\u7528\u6b64 token<\/h4>\n<pre><code class=\"language-bash line-numbers\"># \u4e34\u65f6\u4f7f\u7528\uff08\u4ec5\u5f53\u524d shell\uff09\nexport GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx\n\n# \u6c38\u4e45\u4f7f\u7528\uff08\u5199\u5165 ~\/.bashrc\uff09\necho 'export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx' &gt;&gt; ~\/.bashrc\nchmod 600 ~\/.bashrc\nsource ~\/.bashrc\n<\/code><\/pre>\n<p><code>gh<\/code> \u547d\u4ee4\u4f1a\u81ea\u52a8\u8bfb\u53d6 <code>GITHUB_TOKEN<\/code> \u73af\u5883\u53d8\u91cf\u3002<\/p>\n<h3>4.4 \u65b9\u5f0f\u4e09\uff1aSSH \u5bc6\u94a5\uff08\u4ec5\u9002\u5408 git clone \u6e90\u7801\uff09<\/h3>\n<p>\u5982\u679c\u8ba1\u5212\u76f4\u63a5\u514b\u9686\u6e90\u7801\uff08\u53c2\u8003 5.4 \u5c0f\u8282\uff09\uff0cSSH \u5bc6\u94a5\u6700\u7a33\u5b9a\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">ssh-keygen -t ed25519 -C \"your-email@example.com\"\ncat ~\/.ssh\/id_ed25519.pub                    # \u590d\u5236\u516c\u94a5\n# \u5230 https:\/\/github.com\/settings\/keys \u6dfb\u52a0 SSH key\nssh -T git@github.com                        # \u9a8c\u8bc1\uff1a\"successfully authenticated\" \u5373\u53ef\n<\/code><\/pre>\n<h3>4.5 \u9a8c\u8bc1\u8ba4\u8bc1\u72b6\u6001<\/h3>\n<pre><code class=\"language-bash line-numbers\">gh auth status\n<\/code><\/pre>\n<p>\u671f\u671b\u8f93\u51fa\uff1a<\/p>\n<pre><code class=\"line-numbers\">github.com\n  \u2713 Logged in to github.com account your-username\n  - Active account: true\n  - Token scopes: 'repo', 'read:org', ...\n<\/code><\/pre>\n<p>\u53ea\u8981\u770b\u5230 <code>\u2713 Logged in<\/code>\uff0c\u8ba4\u8bc1\u5c31 OK \u4e86\u3002<\/p>\n<hr \/>\n<h2>\u4e94\u3001\u65b9\u5f0f A\uff1apipx \u5b89\u88c5\uff08\u63a8\u8350\uff09<\/h2>\n<blockquote><p>\n  <strong>\u9002\u7528\u573a\u666f<\/strong>\uff1a\u4e2a\u4eba\u5f00\u53d1\u673a\u3001\u5355\u53f0\u4e91\u4e3b\u673a\u3001\u4e0d\u9700\u8981\u4e25\u683c\u5bb9\u5668\u9694\u79bb\u3002\n<\/p><\/blockquote>\n<h3>5.1 \u4e0b\u8f7d release \u8d44\u4ea7<\/h3>\n<pre><code class=\"language-bash line-numbers\">gh release download v3.3.1 --repo khscience\/CSkhQuant\nls -lh\n<\/code><\/pre>\n<p>\u9884\u671f\u8f93\u51fa\uff1a<\/p>\n<pre><code class=\"line-numbers\">khquant-3.3.1-py3-none-any.whl       420K\nkhquant-3.3.1.tar.gz                 480K\nkhquant-docker-3.3.1.tar.gz          254M\nchecksums.txt                        284B\n<\/code><\/pre>\n<h3>5.2 \u5b89\u88c5 wheel<\/h3>\n<pre><code class=\"language-bash line-numbers\"># \u82e5 3.2 \u8282\u5df2\u8dd1\u8fc7 pipx ensurepath\uff0c\u53ef\u8df3\u8fc7\u8fd9\u4e00\u6b65\npipx ensurepath\n\npipx install .\/khquant-3.3.1-py3-none-any.whl\n\n# \u8ba9 PATH \u7acb\u5373\u5728\u5f53\u524d\u7ec8\u7aef\u751f\u6548\uff08\u4e09\u9009\u4e00\uff09\uff1a\nexec $SHELL -l         # \u2460 \u63a8\u8350\uff1a\u91cd\u542f\u5f53\u524d shell \u5e76\u52a0\u8f7d\u914d\u7f6e\n# source ~\/.bashrc     # \u2461 bash \u7528\u6237\u624b\u52a8 source\n# \uff08\u6216\u76f4\u63a5\u5173\u95ed\u7ec8\u7aef\u91cd\u5f00\uff09 \u2462 \u6700\u7a33\uff0c\u65e0\u9700\u4efb\u4f55\u547d\u4ee4\n<\/code><\/pre>\n<p><code>pipx<\/code> \u4f1a\u81ea\u52a8\u5efa\u7acb\u72ec\u7acb\u865a\u62df\u73af\u5883\uff0c\u5b89\u88c5\u6240\u6709\u4f9d\u8d56\uff08pandas\u3001numpy\u3001duckdb\u3001baostock\u3001tushare \u7b49\uff09\uff0c\u5e76\u628a <code>kh<\/code> \u547d\u4ee4\u94fe\u63a5\u5230 <code>~\/.local\/bin\/<\/code>\u3002<\/p>\n<h3>5.3 \u9a8c\u8bc1<\/h3>\n<pre><code class=\"language-bash line-numbers\">kh version              # \u67e5\u770b\u7248\u672c\uff0c\u5e94\u8f93\u51fa 3.3.1\nkh --help               # \u67e5\u770b\u5b50\u547d\u4ee4\u4e00\u89c8\nkh doctor               # \u4f53\u68c0\uff1aPython \u7248\u672c\u3001\u4f9d\u8d56\u3001\u914d\u7f6e\u3001\u76ee\u5f55\n<\/code><\/pre>\n<p><code>kh doctor<\/code> \u7b2c\u4e00\u6b21\u8fd0\u884c\u53ef\u80fd\u6709\u51e0\u4e2a\u7ea2\/\u9ec4\u8b66\u544a\uff08\u5982&#8221;\u672a\u914d\u7f6e\u6570\u636e\u76ee\u5f55&#8221;\uff09\uff0c\u5c5e\u6b63\u5e38\u73b0\u8c61 \u2014\u2014 \u4e0b\u4e00\u8282 <code>kh init<\/code> \u4f1a\u5904\u7406\u6389\u5927\u90e8\u5206\u3002<\/p>\n<h3>5.4 \u5907\u9009\uff1a\u4ece\u6e90\u7801\u5b89\u88c5<\/h3>\n<p>\u9002\u5408\u9700\u8981\u4fee\u6539\u6e90\u7801\u3001\u53c2\u4e0e\u5f00\u53d1\u7684\u540c\u5b66\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">gh repo clone khscience\/CSkhQuant\ncd CSkhQuant\npipx install .\nkh version\n<\/code><\/pre>\n<hr \/>\n<h2>\u516d\u3001\u65b9\u5f0f B\uff1aDocker \u90e8\u7f72<\/h2>\n<blockquote><p>\n  <strong>\u9002\u7528\u573a\u666f<\/strong>\uff1a\u591a\u673a\u90e8\u7f72\u3001CI\/CD\u3001\u9700\u8981\u4e25\u683c\u73af\u5883\u9694\u79bb\u3001\u4e0d\u613f\u6c61\u67d3\u5bbf\u4e3b\u673a\u3002\n<\/p><\/blockquote>\n<h3>6.1 \u52a0\u8f7d\u955c\u50cf<\/h3>\n<pre><code class=\"language-bash line-numbers\">gh release download v3.3.1 --repo khscience\/CSkhQuant -p 'khquant-docker-*.tar.gz'\ndocker load -i khquant-docker-3.3.1.tar.gz\ndocker images | grep khquant         # \u9a8c\u8bc1\uff1a\u80fd\u770b\u5230 khquant:3.3.1\n<\/code><\/pre>\n<p>\u955c\u50cf\u57fa\u4e8e <code>python:3.11-slim<\/code>\uff0c\u5305\u542b\u5168\u90e8 Python \u4f9d\u8d56\uff1a<strong>\u672a\u538b\u7f29\u7ea6 980 MB\uff0c\u538b\u7f29\u540e\u7ea6 254 MB<\/strong>\u3002<\/p>\n<h3>6.2 \u9a8c\u8bc1<\/h3>\n<pre><code class=\"language-bash line-numbers\">docker run --rm khquant:3.3.1 version\n<\/code><\/pre>\n<h3>6.3 \u6301\u4e45\u5316\u8fd0\u884c\uff08\u63a8\u8350\uff09<\/h3>\n<p>\u5bb9\u5668\u662f\u65e0\u72b6\u6001\u7684\uff0c<strong>\u914d\u7f6e\u548c\u6570\u636e\u5fc5\u987b\u6302\u5377\u51fa\u6765<\/strong>\u624d\u4e0d\u4f1a\u968f\u5bb9\u5668\u9500\u6bc1\u3002\u4e24\u4e2a\u63a8\u8350\u6302\u8f7d\u70b9\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u5bb9\u5668\u5185\u8def\u5f84<\/th>\n<th>\u5bbf\u4e3b\u673a\u6620\u5c04<\/th>\n<th>\u7528\u9014<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>\/root\/.khquant<\/code><\/td>\n<td><code>~\/.khquant<\/code><\/td>\n<td>\u914d\u7f6e\u6587\u4ef6\uff08<code>settings.json<\/code>\u3001tushare token\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>\/root\/khquant<\/code><\/td>\n<td><code>~\/khquant<\/code><\/td>\n<td>\u6570\u636e \/ \u7b56\u7565 \/ \u56de\u6d4b\u7ed3\u679c\uff08DuckDB\u3001<code>.kh<\/code>\u3001\u62a5\u544a\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre><code class=\"language-bash line-numbers\"># \u9996\u6b21\u521d\u59cb\u5316\ndocker run -it --rm \\\n  -v ~\/khquant:\/root\/khquant \\\n  -v ~\/.khquant:\/root\/.khquant \\\n  khquant:3.3.1 init\n\n# \u8dd1\u56de\u6d4b\ndocker run -it --rm \\\n  -v ~\/khquant:\/root\/khquant \\\n  -v ~\/.khquant:\/root\/.khquant \\\n  khquant:3.3.1 run rsi.kh --report\n<\/code><\/pre>\n<h3>6.4 \u7528 alias \u7b80\u5316\u547d\u4ee4\uff08\u63a8\u8350\uff09<\/h3>\n<p>\u6bcf\u6b21\u90fd\u6253\u957f\u547d\u4ee4\u592a\u7d2f\uff0c\u5199\u8fdb <code>~\/.bashrc<\/code>\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">alias kh='docker run -it --rm -v ~\/khquant:\/root\/khquant -v ~\/.khquant:\/root\/.khquant khquant:3.3.1'\n<\/code><\/pre>\n<p>\u4e4b\u540e\u7528\u6cd5\u548c pipx \u5b89\u88c5\u5b8c\u5168\u4e00\u81f4\uff1a<code>kh init<\/code>\u3001<code>kh run xxx.kh<\/code>\u3002<\/p>\n<h3>6.5 \u7528 docker compose \u7ba1\u7406\uff08\u56e2\u961f \/ \u591a\u670d\u52a1\u63a8\u8350\uff09<\/h3>\n<p>\u4e3a\u591a\u4eba\u5171\u4eab\u6216\u957f\u671f\u7ef4\u62a4\uff0c\u53ef\u5199\u4e00\u4e2a <code>docker-compose.yml<\/code>\uff1a<\/p>\n<pre><code class=\"language-yaml line-numbers\"># docker-compose.yml\nservices:\n  khquant:\n    image: khquant:3.3.1\n    volumes:\n      - .\/khquant:\/root\/khquant\n      - .\/.khquant:\/root\/.khquant\n    stdin_open: true\n    tty: true\n<\/code><\/pre>\n<p>\u4f7f\u7528\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">docker compose run --rm khquant init\ndocker compose run --rm khquant run rsi.kh --report\n<\/code><\/pre>\n<hr \/>\n<h2>\u4e03\u3001\u9996\u6b21\u4f7f\u7528\u4e09\u8fde\uff1ainit \u2192 data \u2192 run<\/h2>\n<p>\u65e0\u8bba\u4f7f\u7528 pipx \u8fd8\u662f Docker\uff0c\u8dd1\u901a\u7b2c\u4e00\u4e2a\u56de\u6d4b\u7684\u6d41\u7a0b\u90fd\u662f\u56fa\u5b9a\u4e09\u6b65\u3002<\/p>\n<h3>7.1 <code>kh init<\/code> \u2014\u2014 5 \u6b65\u4ea4\u4e92\u5f0f\u5411\u5bfc<\/h3>\n<pre><code class=\"language-bash line-numbers\">kh init\n<\/code><\/pre>\n<p>\u4f9d\u6b21\u56de\u7b54 5 \u4e2a\u95ee\u9898\uff08<strong>\u5168\u90e8\u76f4\u63a5\u56de\u8f66\u8d70\u9ed8\u8ba4\u503c\u5373\u53ef<\/strong>\uff09\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u6b65\u9aa4<\/th>\n<th>\u95ee\u9898<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>\u9009\u62e9\u6570\u636e\u6e90<\/td>\n<td><code>baostock<\/code><\/td>\n<td>\u514d\u8d39\u3001\u65e0\u9700 token\uff0c\u63a8\u8350\u9996\u6b21\u4f7f\u7528<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>\u6570\u636e\u76ee\u5f55<\/td>\n<td><code>~\/khquant\/data<\/code><\/td>\n<td>\u81ea\u52a8\u5efa\u597d <code>SH\/SZ\/BJ<\/code> \u4e09\u4e2a\u5e02\u573a\u5b50\u76ee\u5f55<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>\u7b56\u7565\u76ee\u5f55<\/td>\n<td><code>~\/khquant\/strategies<\/code><\/td>\n<td>\u81ea\u52a8\u540c\u6b65\u5185\u7f6e\u793a\u4f8b\u7b56\u7565\uff08ma\u3001rsi \u7b49\uff09<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>\u56de\u6d4b\u7ed3\u679c\u76ee\u5f55<\/td>\n<td><code>~\/khquant\/backtest_results<\/code><\/td>\n<td>\u5355\u6b21\u56de\u6d4b\u4e00\u4efd\u5b50\u76ee\u5f55<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>\u65e5\u5fd7\u76ee\u5f55<\/td>\n<td><code>~\/khquant\/logs<\/code><\/td>\n<td>\u542b\u8fd0\u884c\u65e5\u5fd7\u3001\u9519\u8bef\u65e5\u5fd7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote><p>\n  \ud83d\udca1 <strong>v3.3.1 \u6539\u8fdb<\/strong>\uff1a\u4ee5\u524d\u8981\u7b49\u5230\u7b2c\u4e00\u6b21 <code>kh run<\/code> \u65f6\u6846\u67b6\u624d\u4f1a\u53d1\u73b0\u6570\u636e\u76ee\u5f55\u4e0d\u5b58\u5728\uff0c\u7136\u540e\u8bef fallback \u5230 xtdata\uff08\u5728 Linux \u4e0a\u5fc5\u7136\u5931\u8d25\uff09\u3002\u65b0\u7248\u5728 init \u65f6\u5c31\u628a\u76ee\u5f55\u5efa\u597d\uff0c\u675c\u7edd\u8fd9\u4e2a\u5751\u3002\n<\/p><\/blockquote>\n<h3>7.2 <code>kh data download<\/code> \u2014\u2014 \u51c6\u5907\u5386\u53f2\u6570\u636e<\/h3>\n<p>Linux \u4e0a\u6ca1\u6709 xtdata\uff0c\u7b2c\u4e00\u6b65\u5fc5\u987b\u7528 BaoStock \u6216 Tushare \u628a\u6570\u636e\u4e0b\u8f7d\u5230\u672c\u5730 DuckDB\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\"># \u6700\u5feb\u9a8c\u8bc1\uff1a\u5e73\u5b89\u94f6\u884c\u8fd1\u4e00\u5e74\u65e5\u7ebf\nkh data download --source baostock --stocks 000001.SZ --period 1d --start 20240101\n\n# \u4e00\u6b21\u4e0b\u8f7d\u6caa\u6df1 300 \u65e5\u7ebf\u5168\u91cf\uff08\u8017\u65f6\u51e0\u5206\u949f\uff09\nkh data download --source baostock --pool hs300 --period 1d --start 20240101\n\n# \u53ea\u589e\u91cf\u66f4\u65b0\u5df2\u6709\u80a1\u7968\u6c60\nkh data download --source baostock --pool hs300 --period 1d --update\n<\/code><\/pre>\n<p>\u4e0b\u8f7d\u5b8c\u6210\u540e\u67e5\u770b\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">kh data list                    # \u5217\u51fa\u6240\u6709\u5df2\u5165\u5e93\u80a1\u7968\nkh data info 000001.SZ          # \u67e5\u770b\u67d0\u53ea\u80a1\u7968\u7684\u6570\u636e\u8303\u56f4\n<\/code><\/pre>\n<blockquote><p>\n  \u5b8c\u6574\u53c2\u6570\u5217\u8868\u53c2\u89c1 <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/khsci.com\/khQuant\/cli\/#kh-data\">\u5b98\u7f51 CLI \u6307\u5357 \u00b7 <code>kh data<\/code> \u7ae0\u8282<\/a>\u3002\n<\/p><\/blockquote>\n<h3>7.3 <code>kh run<\/code> \u2014\u2014 \u8dd1\u901a\u7b2c\u4e00\u4e2a\u56de\u6d4b<\/h3>\n<p>\u73af\u5883\u5c31\u7eea\u540e\uff0c<strong>\u7b2c\u4e00\u4e2a\u56de\u6d4b\u600e\u4e48\u8dd1\u3001\u62a5\u544a\u600e\u4e48\u770b\uff0c\u8bf7\u8ddf\u968f\u5b98\u7f51 CLI \u6307\u5357\u7684\u300c5 \u5206\u949f\u4e0a\u624b\u6d41\u7a0b\u300d\u64cd\u4f5c<\/strong>\uff1a<\/p>\n<blockquote><p>\n  \ud83d\udc49 <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/khsci.com\/khQuant\/cli\/#5-%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%E6%B5%81%E7%A8%8B\">khQuant CLI \u5b8c\u6574\u6307\u5357 \u00b7 \u00a7 5 \u5206\u949f\u4e0a\u624b\u6d41\u7a0b<\/a>\n<\/p><\/blockquote>\n<p>\u6db5\u76d6\u5185\u7f6e\u793a\u4f8b\u7b56\u7565\u9009\u62e9\u3001\u6240\u9700\u6570\u636e\u51c6\u5907\u3001<code>kh run<\/code> \u53c2\u6570\u3001<code>--report<\/code> \u5728\u65e0 GUI \u73af\u5883\u4e0b\u7684\u67e5\u770b\u65b9\u5f0f\u7b49\u5168\u90e8\u7ec6\u8282\uff0cWindows \u4e0e Linux \u901a\u7528\u3002<\/p>\n<h4>\u5173\u4e8e HTML \u62a5\u544a\u5728\u65e0 GUI \u73af\u5883\u4e0b\u7684\u67e5\u770b<\/h4>\n<p>\u670d\u52a1\u5668\u4e00\u822c\u6ca1\u6709\u6d4f\u89c8\u5668\uff0c\u4e24\u79cd\u63a8\u8350\u65b9\u6848\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\"># \u65b9\u6848 A\uff1ascp \u62c9\u56de\u672c\u5730\u7528\u6d4f\u89c8\u5668\u6253\u5f00\nscp user@server:~\/khquant\/backtest_results\/xxx\/report.html .\n\n# \u65b9\u6848 B\uff1a\u5728\u670d\u52a1\u5668\u8d77\u4e00\u4e2a\u4e34\u65f6\u9759\u6001 HTTP \u670d\u52a1\ncd ~\/khquant\/backtest_results\npython3 -m http.server 8080\n# \u7136\u540e\u672c\u673a\u6d4f\u89c8\u5668\u8bbf\u95ee http:\/\/your-server:8080\n<\/code><\/pre>\n<p>\u8dd1\u901a\u540e\u6574\u4e2a\u6d41\u7a0b\u4ece <code>kh init<\/code> \u5230\u7b2c\u4e00\u4efd\u62a5\u544a\u751f\u6210\uff0c<strong>5 \u5206\u949f\u4ee5\u5185\u53ef\u8d70\u5b8c<\/strong>\u3002<\/p>\n<hr \/>\n<h2>\u516b\u3001\u5347\u7ea7\u4e0e\u5378\u8f7d<\/h2>\n<h3>8.1 \u5347\u7ea7\u5230\u65b0\u7248\u672c<\/h3>\n<pre><code class=\"language-bash line-numbers\"># pipx \u7528\u6237\ngh release download vX.Y.Z --repo khscience\/CSkhQuant\npipx install --force .\/khquant-X.Y.Z-py3-none-any.whl\nexec $SHELL -l                 # \u8ba9 PATH \u66f4\u65b0\n\n# Docker \u7528\u6237\ngh release download vX.Y.Z --repo khscience\/CSkhQuant -p 'khquant-docker-*.tar.gz'\ndocker load -i khquant-docker-X.Y.Z.tar.gz\n# \u4fee\u6539 alias \u6216 docker-compose.yml \u91cc\u7684\u7248\u672c\u53f7\u5373\u53ef\n<\/code><\/pre>\n<p><code>pipx install --force<\/code> \u4f1a\u4fdd\u7559\u865a\u62df\u73af\u5883\uff0c\u4ec5\u66ff\u6362\u5305\u5185\u5bb9\uff1b<code>~\/khquant<\/code> \u4e0e <code>~\/.khquant<\/code> \u4e0b\u7684\u6570\u636e\u3001\u914d\u7f6e\u3001\u7b56\u7565\u4e0d\u53d7\u5f71\u54cd\u3002<\/p>\n<h3>8.2 \u5b8c\u6574\u5378\u8f7d<\/h3>\n<pre><code class=\"language-bash line-numbers\"># pipx\npipx uninstall khquant\nrm -rf ~\/khquant ~\/.khquant     # \u6570\u636e\u548c\u914d\u7f6e\uff08\u6309\u9700\uff0c\u8c28\u614e\u6267\u884c\uff09\n\n# Docker\ndocker rmi khquant:3.3.1\nrm -rf ~\/khquant ~\/.khquant     # \u540c\u4e0a\n<\/code><\/pre>\n<hr \/>\n<h2>\u4e5d\u3001\u6545\u969c\u6392\u67e5 FAQ<\/h2>\n<h3>Q1\uff1a<code>pipx install<\/code> \u6210\u529f\u4e86\uff0c\u4f46 <code>kh: command not found<\/code><\/h3>\n<p><strong>\u539f\u56e0<\/strong>\uff1a<code>~\/.local\/bin<\/code> \u8fd8\u6ca1\u52a0\u8fdb PATH\u3002<\/p>\n<p><strong>\u4fee\u590d<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">pipx ensurepath\nsource ~\/.bashrc       # zsh \u7528\u6237\u6539 ~\/.zshrc\nkh version             # \u9a8c\u8bc1\n<\/code><\/pre>\n<p>\u6216\u76f4\u63a5\u5173\u95ed\u7ec8\u7aef\u91cd\u5f00\u3002<\/p>\n<h3>Q2\uff1a<code>pipx install &lt;release-url&gt;<\/code> \u62a5 404<\/h3>\n<p><strong>\u539f\u56e0<\/strong>\uff1a\u79c1\u6709\u5e93\u672a\u8ba4\u8bc1\uff0cGitHub \u5bf9\u672a\u8ba4\u8bc1\u8bf7\u6c42\u8fd4\u56de 404 \u800c\u975e 401\u3002<\/p>\n<p><strong>\u4fee\u590d<\/strong>\uff1a\u56de\u5230 <a class=\"wp-editor-md-post-content-link\" href=\"#\u56dbgithub-\u79c1\u6709\u5e93\u8ba4\u8bc1\u5173\u952e\u4e00\u6b65\">\u7b2c\u56db\u7ae0<\/a> \u5b8c\u6210 <code>gh auth login<\/code>\uff0c\u7136\u540e\u7528 <code>gh release download<\/code> \u62ff wheel \u6587\u4ef6\uff0c<strong>\u4e0d\u8981\u76f4\u63a5\u7528 URL<\/strong> \u5b89\u88c5\u3002<\/p>\n<h3>Q3\uff1a<code>kh doctor<\/code> \u663e\u793a &#8220;xtdata \u4e0d\u53ef\u7528&#8221;<\/h3>\n<p><strong>\u8fd9\u662f Linux \u4e0a\u7684\u6b63\u5e38\u73b0\u8c61\uff0c\u4e0d\u662f bug<\/strong>\u3002Linux \u4e0a xtdata \u6c38\u8fdc\u4e0d\u53ef\u7528\uff0c\u53ea\u8981\u786e\u8ba4 <code>.kh<\/code> \u914d\u7f6e\u548c <code>kh data download<\/code> \u90fd\u4f7f\u7528 <code>baostock<\/code> \/ <code>tushare<\/code> \/ \u672c\u5730 DuckDB \u5373\u53ef\u3002<\/p>\n<h3>Q4\uff1a<code>kh run xxx.kh<\/code> \u63d0\u793a &#8220;\u914d\u7f6e\u6587\u4ef6\u4e0d\u5b58\u5728&#8221;<\/h3>\n<p>\u5148\u786e\u8ba4\u7b56\u7565\u76ee\u5f55\u662f\u5426\u5305\u542b\u8be5\u6587\u4ef6\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">kh strategy list\n<\/code><\/pre>\n<p>\u5982\u679c\u5217\u8868\u4e2d\u5b58\u5728\u8be5\u6587\u4ef6\uff0c\u8bf4\u660e v3.3.1 \u7684\u8def\u5f84\u89e3\u6790\u6b63\u5e38\u5de5\u4f5c\u3002\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u53ef\u80fd\u662f <code>kh init<\/code> \u65f6\u9009\u9519\u7b56\u7565\u76ee\u5f55\uff0c\u91cd\u65b0\u6267\u884c <code>kh init<\/code> \u5373\u53ef\u3002<\/p>\n<blockquote><p>\n  v3.3.1 \u6539\u8fdb\uff1a<code>kh run xxx.kh<\/code> \u4e0d\u518d\u8981\u6c42 <code>cd<\/code> \u5230\u7b56\u7565\u76ee\u5f55\uff0c\u4f1a\u81ea\u52a8\u6309\u4ee5\u4e0b\u987a\u5e8f\u67e5\u627e\uff1a\u2460 \u5f53\u524d\u76ee\u5f55 \u2461 \u914d\u7f6e\u7684\u7b56\u7565\u76ee\u5f55 \u2462 \u81ea\u52a8\u8865 <code>.kh<\/code> \u540e\u7f00\u3002Windows \/ Linux \u884c\u4e3a\u5b8c\u5168\u4e00\u81f4\u3002\n<\/p><\/blockquote>\n<h3>Q5\uff1aDocker \u955c\u50cf\u592a\u5927\uff08~980 MB\uff09\uff0c\u60f3\u7626\u8eab<\/h3>\n<p><code>khquant-docker-3.3.1.tar.gz<\/code> \u5df2\u538b\u7f29\u5230 254 MB\uff0c<code>docker load<\/code> \u540e\u5c55\u5f00 ~980 MB \u2014\u2014 \u8fd9\u662f\u56e0\u4e3a pandas\u3001numpy\u3001scipy\u3001matplotlib\u3001duckdb \u8fd9\u4e9b\u79d1\u5b66\u8ba1\u7b97\u5e93\u672c\u8eab\u4f53\u79ef\u8f83\u5927\u3002<\/p>\n<p>\u5982\u679c\u4e0d\u9700\u8981 HTML \u62a5\u544a\uff08matplotlib\uff09\uff0c\u53ef\u5728\u5bb9\u5668\u5185\u6267\u884c\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">docker run -it --name khquant-slim khquant:3.3.1 bash\n# \u5728\u5bb9\u5668\u5185\uff1a\npip uninstall -y matplotlib\nexit\ndocker commit khquant-slim khquant:3.3.1-slim\ndocker rm khquant-slim\n<\/code><\/pre>\n<h3>Q6\uff1a<code>gh auth login<\/code> \u8d70\u5230\u4e00\u534a\u62a5\u9519 &#8220;git not found&#8221;<\/h3>\n<p><strong>\u539f\u56e0<\/strong>\uff1a<code>gh auth login<\/code> \u5185\u90e8\u4f1a\u8c03\u7528 git \u914d\u7f6e\u51ed\u636e\uff0c\u5fc5\u987b\u5148\u5b89\u88c5 git\u3002<\/p>\n<p><strong>\u4fee\u590d<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">sudo apt install -y git       # \u6216 dnf \/ pacman\ngh auth login                 # \u91cd\u8bd5\n<\/code><\/pre>\n<h3>Q7\uff1a<code>gh release download<\/code> \u63d0\u793a 404<\/h3>\n<p><strong>\u539f\u56e0<\/strong>\uff1atoken \u7f3a\u5c11 <code>repo<\/code> scope\uff0c\u65e0\u6cd5\u8bfb\u53d6\u79c1\u6709\u5e93 release \u8d44\u4ea7\u3002<\/p>\n<p><strong>\u8bca\u65ad<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">gh auth status                # \u67e5\u770b Token scopes \u662f\u5426\u542b 'repo'\n<\/code><\/pre>\n<p><strong>\u4fee\u590d<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">gh auth refresh -h github.com -s repo\ngh release download v3.3.1 --repo khscience\/CSkhQuant\n<\/code><\/pre>\n<h3>Q8\uff1a\u4e2d\u6587\u6587\u4ef6\u540d\uff08\u5982 <code>\u30101-MA\u7b56\u7565\u6848\u4f8b\u3011\u53cc\u5747\u7ebf.kh<\/code>\uff09\u80fd\u8dd1\u5417\uff1f<\/h3>\n<p>\u53ef\u4ee5\u3002Linux \u4e0e Docker \u4e0b\u4e2d\u6587\u6587\u4ef6\u540d\u5408\u6cd5\u3001\u80fd\u6b63\u5e38\u52a0\u8f7d\u3002\u5982\u679c\u7ec8\u7aef\u6ca1\u88c5\u4e2d\u6587\u5b57\u4f53\uff08\u7eaf\u547d\u4ee4\u884c SSH\uff09\uff0c\u8f93\u51fa\u53ef\u80fd\u663e\u793a\u4e71\u7801 \u2014\u2014 \u90a3\u662f\u663e\u793a\u95ee\u9898\uff0c\u4e0d\u5f71\u54cd\u5b9e\u9645\u6267\u884c\u3002<\/p>\n<hr \/>\n<h2>\u5341\u3001\u9644\u5f55\uff1a\u547d\u4ee4\u901f\u67e5\u4e0e\u8d44\u6e90<\/h2>\n<h3>10.1 \u5b89\u88c5 \/ \u5347\u7ea7\u901f\u67e5<\/h3>\n<pre><code class=\"language-bash line-numbers\"># \u4e00\u6b21\u6027\u914d\u7f6e\nsudo apt install -y git gh pipx\npipx ensurepath\ngh auth login\n\n# \u9996\u6b21\u5b89\u88c5 v3.3.1\ngh release download v3.3.1 --repo khscience\/CSkhQuant\npipx install .\/khquant-3.3.1-py3-none-any.whl\nexec $SHELL -l\n\n# \u5347\u7ea7\ngh release download vX.Y.Z --repo khscience\/CSkhQuant\npipx install --force .\/khquant-X.Y.Z-py3-none-any.whl\n\n# \u5378\u8f7d\npipx uninstall khquant\n<\/code><\/pre>\n<h3>10.2 \u65e5\u5e38\u4f7f\u7528\u901f\u67e5<\/h3>\n<pre><code class=\"language-bash line-numbers\">kh version                      # \u67e5\u7248\u672c\nkh doctor                       # \u4f53\u68c0\nkh init                         # \u521d\u59cb\u5316\u914d\u7f6e\nkh data download --source baostock --stocks 000001.SZ --period 1d --start 20240101\nkh data list                    # \u5df2\u5165\u5e93\u80a1\u7968\u5217\u8868\nkh data info 000001.SZ          # \u5355\u53ea\u80a1\u7968\u6570\u636e\u8303\u56f4\nkh strategy list                # \u7b56\u7565\u5217\u8868\nkh run rsi.kh --report          # \u8dd1\u56de\u6d4b + HTML \u62a5\u544a\nkh result list                  # \u5386\u53f2\u56de\u6d4b\u7ed3\u679c\n<\/code><\/pre>\n<h3>10.3 \u6587\u4ef6 \/ \u76ee\u5f55\u901f\u67e5<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u8def\u5f84<\/th>\n<th>\u4f5c\u7528<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>~\/.khquant\/settings.json<\/code><\/td>\n<td>\u5168\u5c40\u914d\u7f6e\uff08\u6570\u636e\u6e90\u3001\u76ee\u5f55\u3001token\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>~\/khquant\/data\/{SH,SZ,BJ}\/<\/code><\/td>\n<td>DuckDB \u6570\u636e\u5e93\uff08\u6bcf\u53ea\u80a1\u7968\u4e00\u4e2a <code>.db<\/code>\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>~\/khquant\/strategies\/<\/code><\/td>\n<td>\u7b56\u7565\u6587\u4ef6\uff08<code>.py<\/code> + <code>.kh<\/code>\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>~\/khquant\/backtest_results\/<\/code><\/td>\n<td>\u56de\u6d4b\u7ed3\u679c\uff08\u6309\u8fd0\u884c\u65f6\u95f4\u547d\u540d\u5b50\u76ee\u5f55\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>~\/khquant\/logs\/<\/code><\/td>\n<td>\u8fd0\u884c\u65e5\u5fd7<\/td>\n<\/tr>\n<tr>\n<td><code>~\/.local\/bin\/kh<\/code><\/td>\n<td>pipx \u5b89\u88c5\u7684 <code>kh<\/code> \u547d\u4ee4\uff08\u7edd\u5bf9\u8def\u5f84\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>10.4 \u76f8\u5173\u94fe\u63a5<\/h3>\n<ul>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/khsci.com\/khQuant\/\">khQuant \u5b98\u7f51\u9996\u9875<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/khsci.com\/khQuant\/cli\/\">CLI \u547d\u4ee4\u884c\u5de5\u5177\u5b8c\u6574\u6307\u5357<\/a> \u2190 \u547d\u4ee4\u53c2\u6570\u4e0e\u793a\u4f8b\u6700\u5168<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/khsci.com\/khQuant\/framework\/\">\u7b56\u7565\u6846\u67b6\u4ecb\u7ecd<\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/khsci.com\/khQuant\/tools\/\">\u7b56\u7565\u5de5\u5177\u7bb1 <code>khQTTools<\/code><\/a><\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/khscience\/CSkhQuant\/releases\/tag\/v3.3.1\">GitHub Release v3.3.1\uff08\u5185\u6d4b\uff09<\/a><\/li>\n<li>\u5fae\u4fe1\u516c\u4f17\u53f7\uff1a<strong>\u770b\u6d77\u7684\u57ce\u5821<\/strong><\/li>\n<\/ul>\n<hr \/>\n<p><strong>\u7248\u672c<\/strong>\uff1a\u672c\u6587\u57fa\u4e8e khQuant <strong>v3.3.1<\/strong><br \/>\n<strong>\u6700\u540e\u66f4\u65b0<\/strong>\uff1a2026-04-29<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9002\u7528\u7248\u672c\uff1av3.3.1 \u53ca\u4ee5\u4e0a \u76ee\u6807\uff1a\u5728 Linux \u670d\u52a1\u5668\u3001Docker \u5bb9\u5668\u6216 WSL2 \u4e2d\u5b8c\u6574\u90e8\u7f72 kh [&hellip;]<\/p>\n","protected":false},"author":38,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template\/caidan.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-1070","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/pages\/1070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/users\/38"}],"replies":[{"embeddable":true,"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/comments?post=1070"}],"version-history":[{"count":3,"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/pages\/1070\/revisions"}],"predecessor-version":[{"id":1073,"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/pages\/1070\/revisions\/1073"}],"wp:attachment":[{"href":"https:\/\/khsci.com\/khQuant\/wp-json\/wp\/v2\/media?parent=1070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}