尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【Python量化实战入门 #02】宣传页的夏普、最大回撤,用麦蕊K线自己算一遍

【Python量化实战入门 #02】宣传页的夏普、最大回撤,用麦蕊K线自己算一遍 本系列进度#01 ✅跑通 SDK 打出实时行情 · #02 ✅本篇 · #03–#16 ⏳ 规划中系列定位面向零基础开发者的「从 0 到 1 量化工具箱」连载数据源全部锁定麦蕊行情 API。一、为什么写这篇你买基金、看策略是不是常被一串指标砸脸「年化夏普 2.3」「最大回撤仅 8%」这些数字到底是算出来的还是写出来的很多人信了一辈子却从没自己算过一遍。这一篇我们拿麦蕊的真实历史 K 线把累计收益、最大回撤、年化波动、夏普、胜率这五个「宣传页常客」亲手算一遍。算完你就明白指标不神秘神秘的是「它用哪段数据算的」。二、读完你能得到什么用stock_history拉取任意股票的历史日 K 线手写最大回撤不用任何「神器」库搞懂夏普比率到底在比什么一个可复用的main.py改个代码就能算任意标的。三、环境准备接上篇SDK 已装、证书已在环境变量MAIRUI_LICENCE。本篇只需标准库 math不额外装包。四、核心代码importos,sys,datetime sys.path.insert(0,Demo/_common)frommairui_helperimportload_licencefrommairuiimportClientimportmathdefget_close_series(mc,code,days120):enddatetime.date.today().strftime(%Y%m%d)start(datetime.date.today()-datetime.timedelta(daysdays)).strftime(%Y%m%d)rowsmc.stock_history(code,d,n,ststart,etend)# dividendn 不复权clean[rforrinrowsifr.get(c)isnotNoneandr.get(t)]clean.sort(keylambdar:r[t])return[r[c]forrinclean]defmax_drawdown(close):peakclose[0]mdd0.0forpinclose:ifppeak:peakp dd(p-peak)/peakifddmdd:mddddreturnmdddefdaily_returns(close):return[(close[i]-close[i-1])/close[i-1]foriinrange(1,len(close))]defstats(close):retsdaily_returns(close)nlen(rets)cum(close[-1]-close[0])/close[0]mddmax_drawdown(close)meansum(rets)/n stdmath.sqrt(sum((r-mean)**2forrinrets)/n)ann_volstd*math.sqrt(252)sharpe(mean*252)/(std*math.sqrt(252))ifstd0else0.0winsum(1forrinretsifr0)/nreturncum,mdd,ann_vol,sharpe,win mcClient(load_licence())closeget_close_series(mc,000001,days120)cum,mdd,ann_vol,sharpe,winstats(close)print(f累计收益率{cum*100:.2f}% 最大回撤{mdd*100:.2f}%)print(f年化波动率{ann_vol*100:.2f}% 夏普(简化){sharpe:.2f}胜率{win*100:.2f}%)五、跑出来的真实结果本机当天实跑非虚构以平安银行(000001) 近 120 日窗口 000001 近 82 个交易日 首个交易日: 2026-04-08 收盘 11.22 最后交易日: 2026-08-05 收盘 11.25 --- 手算收益风险指标 --- 累计收益率 : 0.27 % 最大回撤 : -12.76 % (从山顶到谷底最狠的一刀) 年化波动率 : 18.04 % 夏普(简化) : 0.14 胜率 : 46.91 % (38/81 个交易日上涨)六、原理拆解口语化累计收益率首尾一减一除最直白。最大回撤想象你账户净值画成一条线从任意「山顶」跌到之后「谷底」最狠的那一刀就是最大回撤。它不管你最后赚没赚只记你「最痛的一次」。代码里边走边记历史最高peak每步算(当前-peak)/peak取最小。年化波动率日收益上下乱跳的幅度 × √252一年约 252 个交易日。跳得越凶波动越大。夏普比率简化版年化收益 ÷ 年化波动。它回答一个问题——你每多冒一份险多赚了几份钱这里无风险利率取 0所以夏普偏低真实算法要减掉国债收益。胜率上涨交易日 ÷ 总交易日。46.91% 说明这只票近 4 个月「涨的日子还没跌的多」但累计却微涨 0.27%——因为涨的日子平均涨得比跌的日子狠。这就是胜率低不等于亏钱的例子。一句记忆最大回撤量「最痛」夏普量「值不值」胜率量「频率」三个维度拼起来才看懂一个策略。七、常见坑复权参数填错stock_history的dividend用n不复权或q前复权填1会直接返回{error:数据不存在}。返回是 list 不是 dict别拿hist[data]去取直接遍历。空行历史接口偶尔返回c为None的行计算前务必过滤否则除零崩。夏普别神化简化版没减无风险利率且对「用哪段窗口算」极度敏感——换段时间数字能差很远。八、小结 下篇预告今天你亲手算出了夏普和最大回撤。下次再看到「夏普 2.3」的宣传你会先问这段 K 线从哪天到哪天下一篇#03把行情落进SQLite搭一个本地行情库让历史 K 线随用随取、还能增量更新也呼应盯盘系列的落库那篇。⚠️ 本文仅为技术实现演示不构成任何投资建议。指标计算依赖历史数据不代表未来表现市场有风险投资须谨慎。代码示例仅用于学习。
返回列表