A 股选股 / 回测 / 可转债轮动 / 多市场净值 / 行为审计 / 组合风险 / 事件雷达。 PyQt6 桌面端,本地运行,默认数据源为东方财富公开接口(免费、免 token)。
不想装 Python 环境,直接用免安装版。全部挂在 Releases:
| 平台 | 文件 | 大小 |
|---|---|---|
| Windows 10/11 64 位 | QuantDesk-v1.0.2-win64.zip |
85 MB |
| macOS Apple Silicon(M1 及之后,12.0+) | QuantDesk-v1.0.2-macos-arm64.dmg |
77 MB |
| macOS Intel(12.0+) | QuantDesk-v1.0.2-macos-x86_64.dmg |
82 MB |
不确定 Mac 是哪种芯片:左上角苹果菜单 → 关于本机 → 看「芯片」一行,写着 Apple M 开头的选 arm64,写着 Intel 的选 x86_64。 系统版本在同一个界面里看,macOS 12 Monterey 及以上都能跑。
Windows:解压后双击 QuantDesk.exe。拷到另一台电脑时请带上整个 QuantDesk 文件夹
(QuantDesk.exe 与 _internal 目录),只拷 exe 起不来。能看见界面就说明文件齐了,
之后若卡在某一步,看状态栏的红字提示。
macOS:打开 DMG,把 QuantDesk 拖进「应用程序」,然后右键 → 打开(不要双击)。
两个平台都会遇到系统拦截,原因是没买代码签名证书:
- Windows:SmartScreen 提示「已保护你的电脑」,点「更多信息」→「仍要运行」
- macOS:提示「无法验证开发者」,去 系统设置 → 隐私与安全性 → 拉到底点「仍要打开」;
或终端执行一次
xattr -dr com.apple.quarantine /Applications/QuantDesk.app若报「已损坏,无法打开」,也是这条命令,不是文件坏了(ad-hoc 签名 + 联网下载带了隔离属性)
其他:
- 首次启动要拉全市场行情快照,慢十几秒属正常,需要联网
- 配置与缓存在
~/.quantdesk/(Windows 为%USERPROFILE%\.quantdesk\),删掉即恢复默认
v1.0.1 修的是换机器后的老问题:事件雷达的增减持过去走全量报表,17.3 万条、347 页, 慢网络下能卡几小时;现在按日期取,只翻 2 到 4 页。
v1.0.2 修的是「点了刷新,界面一直停在正在拉取」这件事本身。状态栏现在每秒跳一次已用
秒数并写明当前步骤(网络预检 / 公告 / 解禁 / 龙虎榜 / 增减持),跑完恢复正常;上一次
没跑完时再点按钮会提示「已 N 秒」,不再毫无反应。另外 --windowed 打包下 sys.stdout
是 None,第三方库的进度条写它就会抛异常,这个口子也堵上了。
取不到数据时,让程序自己说清楚。在这个文件夹里执行:
QuantDesk.exe --selftest-events会在桌面生成 QuantDesk_events.log,逐项列出网络预检和四类取数的耗时与行数,
哪一步失败、失败原因、总耗时都写在里面。把这个文件发出来就能定位,比截图准确。
想从源码跑、或改代码,看下面的「运行」章节。源码压缩包在仓库页 Code → Download ZIP。
macOS 版由 Actions 在真实 macOS runner 上构建,构建配置见 .github/workflows/build-macos.yml。
券商客户端已经把行情、持仓、条件单做满了,重复实现只会做出一个更难用的版本。 这个工具只做券商在结构上给不了的八件事:
| 能力 | 为什么券商做不到 |
|---|---|
| 全市场截面因子选股 | 客户端条件选股只有十几个固定字段,且不能自己检验因子有没有用 |
| 按真实规则撮合并算全指标的回测 | 券商不提供回测;自带简易回测没有涨跌停撮合、没有 MFE/回吐、没有样本外 |
| 可转债轮动回测 | 客户端能看溢价率,但不会告诉你「按双低每周换仓、扣完手续费还剩多少」 |
| 多市场统一净值 | 券商按账户分市场展示,港股通、A 股、场外基金各一条曲线,没人替你合成 |
| 交易行为审计 | 券商只给成交明细,不给行为归因;处置效应的量化需要你自己的历史成交 |
| 组合风险透视 | 券商只给权重,不给风险贡献、VaR、相关性聚类 |
| 事件雷达 | 公告、解禁、龙虎榜、增减持分散在四处,没有一个地方按「对持仓的影响」排序 |
| 机构持仓 | 券商只显示当期龙虎榜席位,不告诉你社保连续加了几季、六类机构谁在同时拿 |
全市场选股:一次拉 5900 只票的快照,十个因子百分位打分排名,剔除 ST 与次新股。 选中任一行显示得分归因(哪个因子加了多少分)。 第二步可跑因子有效性检验:从全市场随机抽 140 只,按 A 股真实口径 (T 日收盘算因子、T+1 开盘买入、收益开盘到开盘)算 IC / ICIR / t 值 / 五分组, t<2 的因子直接归零,再用检验结果校准权重。
可转债轮动:双低 / 低价 / 低溢价 / 低纯债溢价四种因子,周 / 双周 / 月三种频率, 可选评级下限(默认 AA-)。调仓日收盘成交、扣双边万七,强赎或退市的债按断档日收盘冻结。 池子含已退市品种,不做生存偏差过滤。基准是中证转债 000832。 首次拉全市场约 1000 只转债的历史(约 70 秒),之后逐只缓存,再跑 2 秒。 调仓记录和持仓表联动:点任意一次换仓,右栏换成那一期的实际持仓。
多市场净值:A 股指数、港股、美股、ETF、可转债、场外基金折算成人民币合成一条曲线。 港股按 USDCNH ÷ USDHKD 逐日推导汇率,不用只有 2025 年以后数据的 HKDCNH。 输出分市场拆解:本币涨跌、折人民币、汇率效应、组合贡献,并对照日频再平衡与买入不动。 两种模式:配置模拟(自选权重,带四套预设)与当前持仓回溯(从交割单读持仓)。 点分市场拆解里的一行,图上叠加这个市场的折人民币曲线,再点撤掉,缩放不丢。
策略回测:7 套策略(双均线 / 动量 / MACD / RSI / 布林突破 / 唐奇安通道 / 均线+ATR止损), 次日开盘成交、涨停买不进、跌停卖不出、停牌顺延、佣金最低 5 元、印花税、过户费、滑点、整手交易。 输出 24 项指标 + 16 列交易明细(含持股自然日/交易日、MFE、MAE、回吐、退出原因), 外加参数扫描与滚动样本外两个稳健性检验。点明细任一行,净值图自动聚焦到那一笔。
行为审计:导入券商交割单,产出四类偏误(处置效应 / 过度交易 / 追涨 / 锚定补仓), 每一类都带数值证据与严重度;按标的、入场星期、持有天数、入场时段分组找漏; P&L 日历;影子对账(保留你的买入,只把卖出换成规则执行,差额即纪律成本)。 分组表与日历联动:点某一格,日历只算这一格的平仓并给出笔数/净额/胜率, 再点取消;双击某一格看这一格的每一笔。
组合风险:权重 vs 风险贡献、有效分散度(HHI 倒数)、行业暴露、相关性聚类、 历史法 VaR/ES、历史最差交易日。点行业暴露的某一行,持仓表只剩这个行业并给出 合计权重与盈亏;双击相关性聚类看这一组的成员、权重与风险贡献。
事件雷达:四张表全部可排序、可拖列宽、可换列序,每一行都能双击看底稿。 · 公告雷达:按风险/机会分类打分排序,双击弹窗直接显示公告正文全文(不是只给链接) · 解禁日程:未来 30 天明细与日历,双击看这一笔全部字段 / 当天解禁的所有票 · 龙虎榜:个股逐条明细(上榜日、原因、净买额、上榜后 5 日),双击看当天买方前五 与卖方前五,营业部按「机构 / 北向 / 散户大营 / 游资」打标,附机构净额合计; 下方保留分组有效性统计,双击某组看这一组包含哪些票、哪天上的榜 · 增减持:逐笔明细(日期、变动人、与董监高关系、变动股数、变动金额、变动比例、 变动后持股、职务、原因),按方向/本人/金额/关键词筛选,双击看全部 16 个字段, 汇总表再按个股给增持额与减持额
机构持仓:社保 / QFII / 保险 / 基金 / 券商 / 信托六类机构的季度重仓。 季报口径,一年四个时点,市值按报告期末收盘价算。 · 重仓明细:代码、名称、机构数、持股万股、市值亿、变动万股、变动%、连续季、动作。 「连续季」是从最新一期往前数连续增持了几个季度,中间断一期就停,不跨缺口硬算。 可按动作(新进/增持/减持/不变)、连续增持季数、市值下限、关键词筛。 点一行看它逐季被拿了多少,社保还能拆到「全国社保基金一一四组合」这一级 · 交叉重仓:六类机构同时持有的票,被 3 类以上同时拿的 501 只,5 类 10 只。 市值加总含重复计算(社保有部分委托公募管理),只看量级 · 社保组合:十大流通股东明细里抽出 762 条,66 个组合持 609 只票, 按组合排行看持股票数、净买、增持/减持笔 · A+H 溢价:211 只两地上市公司,溢价中位数 72.5%,7 只 A 股比 H 股便宜
北向(陆股通)个股持股明细自 2024-08-18 起停止披露,任何软件都给不出日频港资数据。 追踪外资现在只有 QFII 季报(做了)和 A+H 溢价(做了)两条路。
main.py PyQt6 外壳:三个自绘图表控件 + 主窗口
ui_tabs.py 八个页签的实现(含多曲线净值控件 MultiLineChart)
selection.py 截面选股:因子面板、打分排名、IC 检验、权重校准
engine.py 事件驱动回测引擎 + 策略库 + 参数网格 + 滚动样本外
metrics.py 交易级 / 组合级 / 稳健性指标
audit.py 行为审计 + 影子账户
riskx.py 组合风险
optimizer.py 组合优化:等权 / 最小方差 / 风险平价 / 最大夏普 / Black-Litterman
events.py 事件雷达 + 公告正文 + 龙虎榜席位 + Piotroski F-score
holders.py 机构持仓(六类机构季报 / 社保组合明细 / A+H 溢价)
tablekit.py 可排序表格(数值排序 / 空值沉底 / 列宽拖动 / 行绑定)+ 行详情弹窗
rotation.py 可转债轮动:面板构建、因子排序、换仓与成本
multimkt.py 多市场净值:汇率序列、逐日折算、贡献分解
datasource.py 数据源适配(东财 / tushare 可切换)
trades_io.py 交割单解析与配对(移动加权平均成本)
data_feed.py akshare 行情封装
config.py 关注池与默认参数
默认 eastmoney:日/周/月/分钟 K 线、前复权、行业归属。拿不到历史涨跌停价、
停牌标记、财报公告日、历史成分权重,这几项用昨收×板块幅度和成交量近似,
界面右上角始终显示「数据档位:近似」。
有 tushare token(2000 积分起)后切到 tushare,可拿到 stk_limit(历史涨跌停价)、
suspend_d(停牌)、disclosure_date(披露日)、index_weight(历史成分),
回测才是对账级别。切换只改 datasource.switch(),其余代码不动。
# 安装(Python 3.10+)
git clone https://github.com/Syakukou/QuantDesk.git
cd QuantDesk
python -m venv .venv
.venv/Scripts/pip install -r requirements.txt # Linux/macOS: .venv/bin/pip
# 启动图形界面
.venv/Scripts/python main.py # Linux/macOS: .venv/bin/python main.py
# 无界面自检(真实数据,覆盖引擎/指标/审计/风险全链路)
.venv/Scripts/python main.py --selftest
# 离线自检(不联网、不开窗口,CI 用的就是这一份)
.venv/Scripts/python ci_check.py -v
# 解析一份交割单并打印结果
.venv/Scripts/python main.py --check-statement "C:\path\to\成交.xls".github/workflows/ci.yml 分两层,故意不把联网检查放进每次推送:
| 任务 | 触发 | 跑什么 | 为什么这样分 |
|---|---|---|---|
| 离线自检 | push / PR 到 main | ci_check.py:语法编译、18 个模块导入、合成数据回测内核、排序解析与财报期推算 |
不依赖外网,结果确定,红了就一定是代码问题 |
| 联网行情自检 | 手动 workflow_dispatch 并勾选 | main.py --selftest:真实行情、多周期 K 线、参数扫描、滚动样本外、交割单链路 |
依赖东财接口可用性,跑在海外 runner 上偶发超时,放自动流程里只会制造噪音 |
手动跑联网自检:仓库页 Actions → CI → Run workflow → 勾上 online_selftest → Run。
ci_check.py 本地和 CI 共用同一份判定逻辑,避免两套标准漂移;提交前跑一遍即可挡掉绝大多数低级错误。
.venv/Scripts/pyinstaller.exe --noconfirm --onedir --windowed --name QuantDesk \
--collect-all akshare --hidden-import PyQt6.sip \
--hidden-import matplotlib.backends.backend_qtagg main.pyonedir 模式,约 192MB,产物在 dist/QuantDesk/QuantDesk.exe。
- 回测是单标的、多头、满仓/空仓两态,不做多标的组合回测
- 可转债轮动的评级取当前值,开评级下限会带轻微前视偏差,默认打开是因为低价债里混入违约品种代价更大
- 多市场净值把各市场铺在日期并集上并对停市日向前填充,停市当天贡献记 0,波动率略被低估
- 多市场再平衡用日频,是理论上界,按季度实际做会少一截
- 行为审计的「持有天数比」是无逐日持仓快照时的代理指标,完整的 PGR/PLR 需要逐日持仓
- 有些券商交割单的「成交时间」是清算批次时间,这类数据会被自动禁用时段分析
- 不构成投资建议
拷到另一台电脑,事件雷达一直停在「正在拉取」
先别怀疑缺文件:能看见界面就说明 QuantDesk.exe 与 _internal 目录都在,
缺任何一个都启动不了。卡住是网络到不了东方财富。
从 v1.0.1 起,状态栏会实时显示正在拉哪一步、第几页,失败时直接变红字写明原因。 若仍是旧版,按这个顺序查:
- 浏览器打开 https://data.eastmoney.com/notices/,打不开就是网络层面的事
- 机器上开了代理或 VPN 的,关掉,或把
eastmoney.com加进直连名单 - 公司内网、境外网络常拦
datacenter-web.eastmoney.com,换网络试
数据侧的口径:公告按日取 11 到 13 页,解禁与龙虎榜各 1 到 2 页,增减持按 日期过滤后 2 到 4 页。早期版本不传日期,增减持会翻全量 17.3 万条、347 页, 慢网络下就是几小时的等待——这是 v1.0.1 修掉的主要问题。
源码公开可见,仅供阅读、学习与个人评估;未经书面许可不得再分发、公开部署或用于商业用途,详见 LICENSE。
仓库里的示例数据(默认股票池、样例交割单)均为板块代表股与虚构价位,不代表任何持仓。 代码问题、数据口径疑问欢迎开 Issue 讨论。