
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
最近读到一篇来自 Sentient Trading Society 的文章,作者从 70 多张图表中精选出 10 张最具教学价值的交易图表,涵盖了策略工程、执行心理、市场微观结构和概率统计等核心主题。
这篇文章的精华不在于"怎么赚钱",而在于用结构化思维拆解交易中的认知陷阱。对于学习 Python 的同学来说,这些概念背后的统计模拟、数据可视化、概率建模,恰恰是绝佳的练手素材。
本文将带你梳理原文的核心观点,并用 Python 代码复现其中最有价值的几个图表和模型。
原文提出了一个"演绎推理模型",强调策略设计应遵循三个步骤:
核心思想是:先有逻辑和证据,再有规则,而不是从过拟合的回测中反推信念。这对 Python 量化开发者的启示是——在写回测代码之前,先想清楚你的交易假设是什么。
原文用一个漏斗图描述了一个常见的心理陷阱:
关键洞察:在小样本上追求"一致的收益分布",往往会制造出你正试图避免的不稳定性。真正该追求的是一致的执行,而非一致的结果。
原文的"干预螺旋"(Interference Spiral)揭示了一个恶性循环:
未经验证的信任 → 不确定性 → 微调执行 → 样本失真 → 结果变差 → 信任崩塌 → 回到起点
一旦你在缺乏充分证据的情况下开始随意修改策略参数,你的回测样本就不再代表你的策略了。样本一旦被破坏,你就失去了评估策略的唯一客观依据。
原文介绍了两个市场微观结构的概念:
这是原文中最具量化价值的部分。许多自营交易公司(Prop Firm)设有"一致性规则":
关键洞察:这类规则天然不利于高风险回报比(RRR)、低胜率的策略。RRR 越高,单日大赚的概率越大,就越容易被规则卡住。
下面用 Python 来可视化这个约束:
import matplotlib.pyplot as pltimport numpy as np# 设置中文字体(如有需要可替换为系统中的中文字体)plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']plt.rcParams['axes.unicode_minus'] = False# 总利润范围total_profit = np.linspace(0, 25000, 500)# 40% 规则的边界线:最佳单日 = 总利润 * 0.4boundary_40 = total_profit * 0.4fig, ax = plt.subplots(figsize=(10, 6))# 绘制 40% 规则边界ax.plot(total_profit, boundary_40, 'k-', linewidth=2, label='40% 规则边界')# 填充被封锁的区域(最佳单日超过 40%)ax.fill_between(total_profit, boundary_40, 9000, alpha=0.2, color='gray', label='提款被封锁区域')# 标注一个被封锁的案例ax.plot(10100, 4200, 'ko', markersize=8)ax.annotate('被封锁\n总利润 $10,100\n最佳单日 $4,200\n占比 41.6%', xy=(10100, 4200), xytext=(5000, 6000), arrowprops=dict(arrowstyle='->', color='red'), fontsize=9, color='red')# 标注一个合规的案例ax.plot(10100, 4000, 's', color='green', markersize=8)ax.annotate('合规\n总利润 $10,100\n最佳单日 $4,000\n占比 39.6%', xy=(10100, 4000), xytext=(2000, 2000), arrowprops=dict(arrowstyle='->', color='green'), fontsize=9, color='green')ax.set_xlabel('总利润(美元)')ax.set_ylabel('最佳单日利润(美元)')ax.set_title('Prop Firm 40% 一致性规则的约束效果')ax.legend()ax.set_xlim(0, 25000)ax.set_ylim(0, 9000)plt.tight_layout()plt.show()这段代码会生成一张散点 + 区域图,直观展示 40% 规则如何在你已经达到目标利润时,仍然封锁你的提款请求。
原文基于英国 FCA 的 DP25/3 数据模拟了零售交易者的收益分布,结论是:
下面用 Python 复现这个分布图:
import numpy as npimport matplotlib.pyplot as pltfrom scipy.stats import norm# 生成标准化年度收益的 z 分数x = np.linspace(-4, 4, 1000)y = norm.pdf(x)fig, ax = plt.subplots(figsize=(12, 6))# 亏损区域(z < 0.8,对应约 80%)mask_losing = x < 0.84ax.fill_between(x[mask_losing], y[mask_losing], alpha=0.4, color='steelblue', label='亏损(约 80%)')# 盈亏平衡区域mask_breakeven = (x >= 0.84) & (x < 1.28)ax.fill_between(x[mask_breakeven], y[mask_breakeven], alpha=0.4, color='orange', label='盈亏平衡(约 10%)')# 盈利但不稳定mask_profit_inconsistent = (x >= 1.28) & (x < 1.65)ax.fill_between(x[mask_profit_inconsistent], y[mask_profit_inconsistent], alpha=0.4, color='green', label='盈利但不稳定(约 5%)')# 持续盈利mask_consistent = x >= 1.65ax.fill_between(x[mask_consistent], y[mask_consistent], alpha=0.5, color='crimson', label='持续盈利(约 5%)')ax.plot(x, y, 'k-', linewidth=1.5)ax.set_xlabel('标准化年度收益(z 分数)')ax.set_ylabel('密度')ax.set_title('零售交易者收益分布模拟(基于 FCA DP25/3 数据)')ax.legend(loc='upper left')plt.tight_layout()plt.show()关键洞察:盈利的右尾极其稀薄。要进入那 5% 的持续盈利区域,流程质量必须极其优秀,策略中不能有明显的薄弱环节。
原文展示了一张非常震撼的图:在 200 笔交易的样本中,不同胜率对应的最长连败次数(中位数 vs 第 90 百分位数)。
例如,一个 40% 胜率的策略,中位数最长连败约为 9 笔,而在 10% 的极端情况下,连败可能长达 12 笔。而这完全是统计特征,与策略本身是否有效无关。
下面用蒙特卡洛方法来模拟:
import numpy as npimport matplotlib.pyplot as pltdef simulate_max_losing_streak(win_rate, n_trades=200, n_simulations=10000): """ 蒙特卡洛模拟:给定胜率,计算 n_trades 笔交易中最长连败的分布。 参数: win_rate: 胜率(0 到 1 之间) n_trades: 每次模拟的交易笔数 n_simulations: 模拟次数 返回: 中位数最长连败、第 90 百分位最长连败 """ max_streaks = [] for _ in range(n_simulations): # 生成交易结果:1 = 盈利,0 = 亏损 trades = np.random.binomial(1, win_rate, n_trades) # 计算最长连败 max_streak = 0 current_streak = 0 for trade in trades: if trade == 0: # 亏损 current_streak += 1 max_streak = max(max_streak, current_streak) else: current_streak = 0 max_streaks.append(max_streak) return np.median(max_streaks), np.percentile(max_streaks, 90)# 测试不同胜率win_rates = [0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65]medians = []p90s = []for wr in win_rates: med, p90 = simulate_max_losing_streak(wr) medians.append(med) p90s.append(p90) print(f"胜率 {wr*100:.0f}%:中位数连败 = {med:.1f},P90 连败 = {p90:.1f}")# 绘图fig, ax = plt.subplots(figsize=(10, 6))ax.plot([wr * 100 for wr in win_rates], medians, 'o-', color='steelblue', linewidth=2, label='中位数')ax.plot([wr * 100 for wr in win_rates], p90s, 'o-', color='darkorange', linewidth=2, label='第 90 百分位')ax.set_xlabel('胜率(%)')ax.set_ylabel('最长连败笔数')ax.set_title('200 笔交易中最长连败 vs 胜率(蒙特卡洛模拟)')ax.legend()ax.grid(True, alpha=0.3)plt.tight_layout()plt.show()运行结果示例:
胜率 25%:中位数连败 = 14.0,P90 连败 = 21.0胜率 30%:中位数连败 = 11.0,P90 连败 = 17.0胜率 35%:中位数连败 = 10.0,P90 连败 = 14.0胜率 40%:中位数连败 = 9.0,P90 连败 = 12.0胜率 45%:中位数连败 = 8.0,P90 连败 = 12.0胜率 50%:中位数连败 = 7.0,P90 连败 = 10.0胜率 55%:中位数连败 = 6.0,P90 连败 = 8.0胜率 60%:中位数连败 = 5.0,P90 连败 = 7.0胜率 65%:中位数连败 = 4.0,P90 连败 = 6.0关键洞察:连败是胜率的统计特征,不是策略失效的信号。你需要围绕这个分布来规划心理承受力和风险管理。
原文用一个简化的 FX 聚合图解释了外汇经纪商的报价机制:多家流动性提供商(LP)分别报出买价和卖价,经纪商从中选择最优买价和最优卖价组合成你看到的报价。
这解释了为什么不同经纪商对同一货币对的报价和点差各不相同——因为它们接入的 LP 池不同。
用 Python 模拟一个简单的聚合过程:
import randomdef simulate_fx_aggregation(n_lps=5): """ 模拟外汇价格聚合过程。 参数: n_lps: 流动性提供商数量 """ # 基准价格 base_bid = 1.17290 base_ask = 1.17300 # 每个 LP 在基准价格附近随机报价 bids = [round(base_bid + random.uniform(-0.00005, 0.00005), 5) for _ in range(n_lps)] asks = [round(base_ask + random.uniform(-0.00005, 0.00005), 5) for _ in range(n_lps)] print("=== 流动性提供商报价 ===") for i in range(n_lps): print(f" LP{i+1}:买价 {bids[i]:.5f} | 卖价 {asks[i]:.5f}") # 经纪商选择最优价格 best_bid = max(bids) # 买价取最高 best_ask = min(asks) # 卖价取最低 spread = (best_ask - best_bid) * 10000 # 换算成点(pips) print(f"\n=== 经纪商最终报价 ===") print(f" 最优买价:{best_bid:.5f}(来自 LP{bids.index(best_bid)+1})") print(f" 最优卖价:{best_ask:.5f}(来自 LP{asks.index(best_ask)+1})") print(f" 点差:{spread:.1f} pips")simulate_fx_aggregation()这篇来自 Sentient Trading Society 的文章传递了几个对量化交易者(尤其是 Python 开发者)至关重要的理念:
关于策略开发:先有假设和证据,再有规则。不要从过拟合的回测中反推信念,这是大多数零售交易者犯的根本性错误。
关于执行心理:追求"一致的结果"会导致过度干预,进而破坏样本质量,最终摧毁你对策略的信任。正确的做法是追求一致的执行,并接受结果的自然波动。
关于概率认知:连败是胜率的统计必然产物,不是策略失效的证据。80% 的零售交易者亏损,进入持续盈利的 5% 需要极致的流程质量。
关于市场结构:你在经纪商平台上看到的价格是多家流动性提供商报价的聚合结果,理解这一点有助于你正确认识滑点和点差。
关于 Prop Firm 规则:一致性规则本质上是一个数学约束,它天然不利于高 RRR、低胜率的策略风格。在选择交易公司之前,务必用代码模拟你的策略是否能在规则内生存。
对于 Python 学习者来说,量化交易是一个将统计学、概率论、数据可视化和编程能力融为一体的绝佳练兵场。希望本文的代码示例能帮你打开一扇新的大门。
加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐