做量化的时间久了你会发现一个残酷的事实策略代码写得好不好很多时候不是账户曲线的决定因素决定因素是你能不能稳定地只做“符合条件”的交易。今天把新力金融600318这只票拎出来说不是为了推荐谁去买而是想借这个标的完整跑一遍短线量化的分析流程——从数据获取、指标计算到信号打分和仓位设计全部用代码落地。文章适合两类人一是想用Python量化分析个股但没有完整框架的朋友二是对题材金融股短线节奏感兴趣、想看看量化视角怎么拆解的交易者。核心结论不复杂但背后的流程值得你看完。1. 为什么把新力金融放进量化观察池1.1 标的背后的基本面标签新力金融这家公司在量化交易里其实属于“标签型选手”。它的主营业务横跨融资租赁、小额贷款、典当和不良资产处置背后还有供销社系统的背景。这种公司基本面本身不是成长股逻辑市场买它的时候基本都是在买“金融牌照价值”和“资产处置想象空间”。做短线量化的人第一反应不该是“这家公司赚多少钱”而是“它有没有被资金反复关照的基因”。新力金融总市值不大流通盘也有限这意味着同样的资金量进去股价弹性会比大盘股大得多。量化选股里有一个不成文的习惯小市值加题材属性是最容易出短线波段机会的组合。我不是说小盘股一定涨而是想说短线量化的第一道筛选看的不是财报而是“可交易性”。一只票如果涨停后第二天没人接力、成交额常年不足一亿再好的信号也没法落地。新力金融这类标的天然具备被短线资金关注的条件这才是我把它放进观察池的原因。1.2 短线量化选股的五个硬指标先把我平时筛短线标的的五个维度摆出来后面所有分析都围绕这五条展开。你可以直接拿这套规则去筛任何股票池不局限于今天这只票。维度参考阈值筛选原因日均成交额不低于2亿保证进出场流动性避免信号出现却无法成交换手率3%-12%过低没人气过高有出货嫌疑ATR(14)不低于3%波动太小短线没有操作空间均线结构不能长期空头压制趋势向下时逆势抢反弹胜率非常低题材状态有当前或潜在催化短线波动本质上是消息面和资金面的共振新力金融在2026年3月中旬这个时间窗口成交额和换手率都处在活跃区间题材上也有金融改革和资产处置类消息反复刺激。符合前四条题材状态属于“催化中”。这就是一个典型的量化观察标的接下来要解决的是怎么用代码去把“机会”拆解成可执行的信号而不是靠盘感拍脑袋。2. 搭建短线量化分析框架2.1 数据源的选取与清洗分析股票第一步是拿数据。我这里用的是akshare免费、不需要注册、接口够全对个人量化完全够用。tushare也行但积分门槛对新手不太友好等你要更高频的数据再升级也不迟。数据这块有个坑必须反复强调一定要用“前复权”数据。很多股票中途分红送转如果不复权除权当天K线会出现一个巨大的跳空缺口所有均线、指标全部失真量化信号直接报废。我见过太多人在这上面跌跟头回测收益曲线好看得不得了一上实盘就发现软件里的价格和策略代码里的价格对不上其实就是复权没处理明白。日线级别对短线波段足够用了。很多人一上来就想搞分钟线、搞高频这个阶段完全没必要。短线持有周期通常是几天日线的稳定性远好于分钟线信号噪音也小。先把日线框架跑通再去考虑更细的周期。2.2 核心因子拆解短线量化真正用的因子说穿了就是五类动量、量能、趋势、强弱、波动。每类用一个到两个指标表达就够了不用堆一大堆指标不是越多越好关键是每个指标表达什么逻辑你要清楚。动量因子我用均线排列。MA5上穿MA10、MA10上穿MA20代表不同周期的买入成本都在抬升这是短线资金形成合力最直观的表现。量能因子看换手率和量比缩量回踩不破位比放量拉升更值得关注。趋势因子用MACD重点看DIF和DEA在零轴上方的位置关系零轴上方是多头主导区域金叉的成功率会高很多。强弱因子用RSI但不是用来做超买超卖而是看它在50上方还是下方这是一个多空分界的概念。波动因子用ATR这个指标很关键它直接决定你止损止盈设在哪里。这五个因子加在一起表达的其实是一件事资金是不是正在介入、趋势是不是正在形成、你还有没有安全的进场位置。我后面会把它们全部写成Python函数组合成一套打分系统。2.3 为什么这些因子对短线有效很多人写量化策略只关心“什么指标能赚钱”很少想“为什么它能赚钱”。以均线为例它本质上是统计了最近N根K线持有者的平均成本线。股价站上均线意味着近期买入的人基本都在赚钱他们会倾向于继续持有甚至加仓这就是支撑的逻辑。反过来跌破均线意味着群体性被套反弹到均线附近抛压就会涌出这就是压力的逻辑。MACD的快慢线本质是短期成本和中长期成本的差值。DIF向上穿越DEA说明短期的赚钱效应正在超过中期水平市场情绪在转暖。这些指标背后全是人的行为模式短线的本质就是利用群体的行为惯性。我必须泼一盆冷水没有哪个单一因子能永远有效。市场风格变化后指标会阶段性失效这也是为什么我一直强调“框架重于信号”。你手里有完整的分析流程市场风格变了可以调因子权重、换指标组合。如果你只是抄一段别人的买卖信号那跟闭着眼睛下注没什么区别。3. 把策略代码跑起来从数据到信号3.1 环境准备与数据获取先说下环境Python 3.9 以上版本就行核心依赖是pandas、numpy和akshare。安装命令不写了装不上就把pip源换到国内镜像这种事情卡住不值得。数据获取的代码很好写但要注意akshare的接口字段名偶尔会调整每次跑之前先打印一下表头确认列名。import pandas as pd import numpy as np import akshare as ak def fetch_daily_data(code: str, start_date: str, end_date: str) - pd.DataFrame: 获取指定股票的前复权日线数据 raw ak.stock_zh_a_hist( symbolcode, perioddaily, start_datestart_date, end_dateend_date, adjustqfq, ) df raw.rename( columns{ 日期: date, 开盘: open, 收盘: close, 最高: high, 最低: low, 成交量: volume, 成交额: amount, } ) df[date] pd.to_datetime(df[date]) df df.set_index(date).sort_index() df[volume] pd.to_numeric(df[volume], errorscoerce) df[amount] pd.to_numeric(df[amount], errorscoerce) return df[[open, high, low, close, volume, amount]] df fetch_daily_data(600318, 20250801, 20260313) print(df.tail())这段代码拿的是新力金融从2025年8月到2026年3月13日的日线数据。输出里你就能看到每天的OHLC和成交量后面所有指标计算都基于这个表。3.2 核心指标计算实现指标的代码我用最精炼的方式写不搞复杂的类封装方便你直接抄到自己的脚本里。ewm是pandas里的指数加权移动平均算MACD和RSI都靠它。def calc_ema(series: pd.Series, period: int) - pd.Series: 指数移动平均 return series.ewm(spanperiod, adjustFalse).mean() def add_macd(df: pd.DataFrame, fast: int 12, slow: int 26, signal: int 9) - pd.DataFrame: MACD指标DIF、DEA、柱状值 df[ema_fast] calc_ema(df[close], fast) df[ema_slow] calc_ema(df[close], slow) df[dif] df[ema_fast] - df[ema_slow] df[dea] calc_ema(df[dif], signal) df[macd_hist] (df[dif] - df[dea]) * 2 return df def add_rsi(df: pd.DataFrame, period: int 6) - pd.DataFrame: RSI指标用Wilder的平滑方法计算 delta df[close].diff() gain delta.clip(lower0) loss -delta.clip(upper0) avg_gain gain.ewm(alpha1 / period, adjustFalse).mean() avg_loss loss.ewm(alpha1 / period, adjustFalse).mean() rs avg_gain / avg_loss.replace(0, np.nan) df[rsi] 100 - 100 / (1 rs) return df def add_atr(df: pd.DataFrame, period: int 14) - pd.DataFrame: ATR指标真实波幅的指数移动平均 prev_close df[close].shift() tr pd.concat( [ df[high] - df[low], (df[high] - prev_close).abs(), (df[low] - prev_close).abs(), ], axis1, ).max(axis1) df[atr] tr.ewm(alpha1 / period, adjustFalse).mean() return df def add_ma(df: pd.DataFrame) - pd.DataFrame: 添加5、10、20日均线 for p in (5, 10, 20): df[fma{p}] df[close].rolling(p).mean() return df用法很简单把数据表传给这些函数就行。执行完以后每一天的MACD值、RSI值、ATR值、均线值全在表里了。这里有个细节想提醒你RSI计算有两种常见方式一种是简单平均一种是Wilder平滑结果会有差异你要固定用其中一种不要混用。3.3 信号生成与综合打分有了指标接着就是定义买卖规则。我不做那种“MACD金叉买入”的单规则策略太脆弱了。做一个多因子打分卡每个条件满足加一分最后看总分来决定仓位。def score_stock(df: pd.DataFrame) - dict: 多头信号打分 1. 收盘价 MA5 2. MA5 MA10 3. MA10 MA20 4. DIF DEA 5. DIF 在零轴上方 6. RSI 50 7. 今日成交量 昨日成交量 last df.iloc[-1] prev df.iloc[-2] checks { 价在5日线上: last[close] last[ma5], 5日线10日线: last[ma5] last[ma10], 10日线20日线: last[ma10] last[ma20], MACD金叉状态: last[dif] last[dea], MACD零轴上方: last[dif] 0, RSI大于50: last[rsi] 50, 放量: last[volume] prev[volume], } score sum(checks.values()) return {score: score, checks: checks} df add_ma(df) df add_macd(df) df add_rsi(df) df add_atr(df) result score_stock(df) print(result)7分满分、5分以上算强势、3到4分算震荡、3分以下放弃。这套打分的核心思路是让多个维度互相验证避免单一指标欺骗你。比如均线多头但RSI很低说明趋势是涨的但短期买盘变弱了这时候追进去容易买在短期高点。打分系统的价值就是把这些矛盾暴露出来。3.4 快速回测框架信号逻辑写完了必须回测才能知道胜率如何。下面是个极简回测框架思路是持有固定周期、到期卖出的滚动策略不做过度的技术处理。def backtest(df: pd.DataFrame, hold_days: int 5) - dict: 简单回测打分6时买入持有hold_days天卖出 df df.copy() df[signal] 0 for i in range(20, len(df)): window df.iloc[i - 20 : i] score score_stock(window)[score] if score 6: df.loc[df.index[i], signal] 1 # 计算逐日收益 df[ret] df[close].pct_change() # 模拟持仓 position 0 trade_log [] for i in range(len(df)): if df[signal].iloc[i] 1 and position 0: entry_price df[close].iloc[i] entry_date df.index[i] position 1 elif position 1: holding_days (df.index[i] - entry_date).days if holding_days hold_days: exit_price df[close].iloc[i] pnl (exit_price - entry_price) / entry_price trade_log.append(pnl) position 0 if len(trade_log) 0: wins sum(1 for p in trade_log if p 0) return { 交易次数: len(trade_log), 胜率: wins / len(trade_log), 累计收益: (1 pd.Series(trade_log)).prod() - 1, 平均收益: pd.Series(trade_log).mean(), } return {交易次数: 0, 胜率: 0, 累计收益: 0} print(backtest(df, hold_days5))这里我必须强调这个回测框架极其简单没算手续费、没算滑点、没考虑涨停板能不能买进回测结果只是参考千万别拿它当盈利保证。但作为流程演示它足够让你看到“信号生成—买卖执行—绩效统计”的完整闭环。后续要升级无非是加手续费、加仓位管理、加多股票并行回测。4. 新力金融短线机会的具体拆解以2026/03/13为基准日4.1 从技术指标看当前的多空状态接下来把新力金融套进这套框架里。以2026年3月13日作为分析基准日我梳理一下3月上旬的关键K线特征你可以直接拿行情软件对照复盘。走势上是典型的“N字型”反弹结构2月中下旬放量拉出一根标志性长阳随后不跌破前低缩量横盘了大概九个交易日3月上旬再次放量尝试上攻。到了3月13日前后5日均线已经上穿10日均线10日均线开始走平向上MACD的DIF在零轴上方二次抬头RSI(6)维持在50到65的强势区间没有超买。这个技术形态在量化打分卡里属于高分状态。打分项里“5日线大于10日线”“MACD零轴上方”“RSI大于50”这三条都是满足的而“10日线大于20日线”是否成立取决于3月13日当周是否站稳了20日线。如果收盘价能持续站在20日线上方两个交易日形态就完整了。我特意没有给出一堆历史K线图因为图这种东西主观性太强。量化的意义恰恰在于把“看起来要涨”这种感觉变成“7项条件里满足了几项、差在哪一项”的客观判断。4.2 关键压力位与支撑位的量化估算压力位和支撑位我不建议靠肉眼画趋势线太随意。用成交量分布和ATR通道算更客观。成交密集区的原理很简单某段价格区间成交量越大说明在这个区间换手的人越多未来价格回到这个位置时解套盘和获利盘的博弈就会加剧。新力金融在3月初的放量长阳对应的高点区域就是最直接的短线压力区。如果价格放量突破这个区域那就是典型的压力转支撑可以视为加速信号。反过来下方支撑先看10日均线再看3月缩量横盘平台的密集区跌回平台内部意味着这波上攻失败了。止损位置的设计直接交给ATR。假设当前价格对应的ATR(14)值大概是2%左右用2倍ATR做止损意味着股价反向波动4%就认错离场。这个空间对短线来说是合理的。止损如果设得太窄比如1%正常波动就会把你震出去你会发现自己总是刚止损就反弹那感觉太痛苦了。4.3 多因子打分与仓位设计把新力金融放进打分卡的最终评估是这样的打分6到7分属于强势可关注级别但不是无脑满仓进去。我在实际操作中遵循一个简单的仓位规则5分以下空仓或一成仓试探5到6分三成仓7分可以加到五成仓。日内做T的部分另算底仓永远不超过五成。为什么不满仓因为短线最不缺的就是机会缺的是本金。你今天满仓进去赌一个信号万一这信号是错的明天真正的强势突破来了你反而没钱买这可能是短线交易里最被低估的隐性成本。钱在某些时候比机会更值钱。新力金融这种波动幅度的票五成仓已经是上限再高一旦遇到冲高回落单日回撤就能让你心态失衡。心态崩了后面所有操作都会变形这是多少钱都买不回来的教训。5. 短线量化最常见的坑与排查心得5.1 数据不一致导致信号漂移我自己第一次跑这套框架时在新力金融的历史数据上吃过大亏。当时还没意识到复权问题用非复权数据跑回测某天的信号显示“MACD金叉”但软件K线上形态完全对不上。查了半天才发现是除权导致的跳空缺口让指标算错了方向。从那以后我所有的数据获取接口第一行一定是adjustqfq。这类问题排查有一个笨办法但很快把数据表最后几行nee打印出来和行情软件同一天的收盘价做差值比对。如果价格不一致先看是不是复权问题价格一致但指标对不上再看指标计算窗口是否够长是不是把前20根K线作为Warm-up区间占用了。5.2 回测过拟合的止损方法做量化的人总会忍不住优化参数。MACD的12、26、9不好用改成8、15、5回测胜率上去了。RSI从6改成8收益又涨了一截。等你做完这一轮回测曲线漂亮得让人心动一上实盘就开始连亏。这是典型的过拟合。解决思路就一个参数遍历后要用不同时间段做样本外验证特别是最近半年的数据必须单独留着。如果某个参数组合在2019到2025年赚得很多但最近半年表现特别差那多半是它拟合了老行情新行情里没用了。宁可要一个近半年稳定、整体平庸的参数也不要一个整体爆炸、最近的亏损的“梦幻参数”。5.3 实盘滑点与流动性陷阱回测时买价就是收盘价、卖价也是收盘价但实盘根本不是这回事。买的时候挂单排队眼看着价格往上走就是成交不了只能追高。卖的时候一个闪崩你按回测计算的止损价挂出去成交的时候已经多亏了两个点。这些都是滑点。新力金融的成交额虽然不低但在小盘股上有一个特殊问题涨停板附近的买盘瞬间会消失尤其是早盘那种脉冲式拉升你看着是放量突破其实是一堆撤单后的虚假繁荣。我现在的做法是确认突破信号后不追高等回踩均线附近再进宁可少赚一段也不要买在情绪最高点。量化的目标从来不是买到最低、卖到最高而是在可控风险下获得一个正期望自认为能完美抄底逃顶的人最后基本都被市场教育了。5.4 信号出来了但你不敢跟这个问题听上去不是技术问题但其实是实盘中最普遍的亏损根源。代码明确告诉你“分数够了买”结果你点鼠标的时候犹豫了因为盘面感觉“好像要跌”。等它真的涨上去了你又后悔没执行转头去追一只追不上的票。我的应对办法很朴素开仓前把触发条件和止损线写在纸上贴屏幕旁边。条件触发就机械执行错了再按纪律止损。量化交易解决的不是“预测准不准”的问题它解决的是“你做不做得到”的问题。如果你有纪律哪怕简单策略也能赚钱没纪律再牛的代码也救不了你。在新力金融这个案例上如果把3月那波拉升拆开看真正的机会窗口并不长大部分时间都在震荡和等待。短线本来就是频繁应对不确定性的工作你能控制的只有触发标准和仓位。把这个想明白才算真的入了门。最后再分享一个小技巧。你完全可以把今天的整个代码流程保存成一个函数只要改股票代码和日期就自动输出一份打分报告。我自己每周五收盘后会把自选股全部跑一遍打分高的放进下周观察池。这套流程对新力金融有效对任何活跃票都有效。记住盯住流程而不是盯住某一笔交易这个习惯会改变你后面所有的投资决策。