Python 量化入门用 pandas 处理 A 股 K 线数据并计算技术指标量化交易听起来很高大上但本质就是用代码处理数据、发现规律。这篇文章从最基础的 K 线数据开始教你用 pandas 完成数据获取、清洗、技术指标计算的全流程。不需要任何量化框架纯 Python pandas 就够了。一、K 线数据长什么样K 线OHLCV是量化分析的基础数据每一根 K 线包含字段含义open开盘价high最高价low最低价close收盘价volume成交量amount成交额一根日 K 线就是一天的价格摘要。把很多根日 K 线排起来就是我们常说的走势图。量化分析的核心工作就是对这些数据做计算比如算均线、判断金叉死叉、计算涨跌幅排名等。二、获取 K 线数据获取 A 股数据有很多方式。这里用 alphafeed 做示例也可以换成你习惯的数据源后面的 pandas 处理逻辑完全一样pipinstallalphafeedfromalphafeedimportAlphaFeed afAlphaFeed(api_keyyour-api-key)# 也支持环境变量 ALPHAFEED_API_KEY# 获取贵州茅台最近 500 根日 K 线dfaf.klines.get(600519.SH,period1d,count500,to_dataframeTrue)print(df.shape)print(df.columns.tolist())拿到的 DataFrame 大概长这样(500, 9) [symbol, timestamp, trade_date, open, high, low, close, volume, amount]不管用什么数据源只要最终拿到一个包含open/high/low/close/volume的 DataFrame后面的分析流程都是通用的。三、数据初步探索拿到数据后先做基本检查# 看前几行print(df.head())# 看数据类型print(df.dtypes)# 检查缺失值print(df.isnull().sum())# 基本统计print(df[[open,high,low,close,volume]].describe())常见操作把trade_date设为索引方便按时间切片df[trade_date]pd.to_datetime(df[trade_date])dfdf.set_index(trade_date).sort_index()# 取最近一年df_recentdf.loc[2025-06-01:]四、计算常用技术指标1. 涨跌幅df[change_pct]df[close].pct_change()*100print(df[[close,change_pct]].tail(10))2. 移动平均线MA均线是最基础的技术指标用rolling一行搞定df[ma5]df[close].rolling(5).mean()df[ma10]df[close].rolling(10).mean()df[ma20]df[close].rolling(20).mean()df[ma60]df[close].rolling(60).mean()print(df[[close,ma5,ma10,ma20,ma60]].tail(10))怎么看均线短期均线在长期均线上方 → 多头排列趋势向上短期均线从下往上穿过长期均线 → 金叉买入信号反之 → 死叉卖出信号3. MACDMACD 由三部分组成DIF快线-慢线、DEADIF 的均线、柱状图DIF-DEA。defcalc_macd(close,fast12,slow26,signal9):ema_fastclose.ewm(spanfast,adjustFalse).mean()ema_slowclose.ewm(spanslow,adjustFalse).mean()difema_fast-ema_slow deadif.ewm(spansignal,adjustFalse).mean()macd_bar(dif-dea)*2returndif,dea,macd_bar df[dif],df[dea],df[macd]calc_macd(df[close])print(df[[close,dif,dea,macd]].tail(10))怎么用DIF 上穿 DEA → MACD 金叉MACD 柱从负变正 → 趋势可能反转4. RSI相对强弱指标RSI 衡量最近一段时间涨了多少、跌了多少范围 0-100。defcalc_rsi(close,period14):deltaclose.diff()gaindelta.where(delta0,0)loss-delta.where(delta0,0)avg_gaingain.rolling(period).mean()avg_lossloss.rolling(period).mean()rsavg_gain/avg_lossreturn100-(100/(1rs))df[rsi_6]calc_rsi(df[close],6)df[rsi_14]calc_rsi(df[close],14)print(df[[close,rsi_6,rsi_14]].tail(10))怎么看RSI 70 → 超买可能回调RSI 30 → 超卖可能反弹不同周期的 RSI 组合使用效果更好5. 布林带Bollinger Bands布林带由中轨均线和上下轨均线 ± N 倍标准差组成period20df[boll_mid]df[close].rolling(period).mean()df[boll_std]df[close].rolling(period).std()df[boll_upper]df[boll_mid]2*df[boll_std]df[boll_lower]df[boll_mid]-2*df[boll_std]print(df[[close,boll_upper,boll_mid,boll_lower]].tail(10))怎么用价格触及上轨 → 可能超买价格触及下轨 → 可能超卖布林带收窄 → 可能即将变盘6. 成交量分析df[vol_ma5]df[volume].rolling(5).mean()df[vol_ma20]df[volume].rolling(20).mean()# 量比今日成交量 / 近 20 日平均df[vol_ratio]df[volume]/df[vol_ma20]# 筛选放量日量比 2big_vol_daysdf[df[vol_ratio]2]print(f放量交易日:{len(big_vol_days)}天)print(big_vol_days[[close,change_pct,volume,vol_ratio]].tail())五、生成交易信号有了技术指标就可以定义交易规则了。以最经典的双均线策略为例MA5 上穿 MA20 → 买入MA5 下穿 MA20 → 卖出# 判断金叉死叉df[signal]0# 金叉今天 ma5 ma20昨天 ma5 ma20buy_mask(df[ma5]df[ma20])(df[ma5].shift(1)df[ma20].shift(1))df.loc[buy_mask,signal]1# 死叉sell_mask(df[ma5]df[ma20])(df[ma5].shift(1)df[ma20].shift(1))df.loc[sell_mask,signal]-1signalsdf[df[signal]!0]print(f共产生{len(signals)}个信号)print(signals[[close,ma5,ma20,signal]].tail(10))你可以把这个逻辑换成任何其他指标组合比如# MACD 金叉 RSI 未超买buy_macd(df[dif]df[dea])(df[dif].shift(1)df[dea].shift(1))buy_rsidf[rsi_14]70combined_buybuy_macdbuy_rsi六、批量处理多只股票实际做量化需要对多只股票批量计算指标fromalphafeedimportAlphaFeed afAlphaFeed(api_keyyour-api-key)symbols[600519.SH,000858.SZ,601318.SH,000001.SZ,600036.SH]dfsaf.klines.batch(symbols,period1d,count200,to_dataframeTrue,show_progressTrue)results[]forsymbol,dfindfs.items():iflen(df)60:continuedf[ma5]df[close].rolling(5).mean()df[ma20]df[close].rolling(20).mean()df[rsi_14]calc_rsi(df[close],14)latestdf.iloc[-1]results.append({symbol:symbol,close:latest[close],ma5ma20:latest[ma5]latest[ma20],rsi_14:round(latest[rsi_14],1),})importpandasaspdprint(pd.DataFrame(results).to_string(indexFalse))七、关于复权如果你发现 K 线数据里有异常的大跳空比如价格突然减半大概率是因为除权除息。做技术分析前需要用复权数据前复权以最新价格为基准向前调整适合回测后复权以上市价格为基准向后调整适合看长期收益不复权原始价格大多数数据源都支持指定复权方式。用前复权数据来算均线和回测是最常见的做法。八、总结这篇文章覆盖了量化分析最基础的工作流获取 K 线数据DataFrame 格式用rolling计算均线用ewm计算 MACD手写 RSI、布林带生成交易信号金叉死叉批量处理多只股票这些全部是 pandas 的基本操作不需要任何量化框架。掌握了这些再去学 backtrader、vnpy 之类的框架就会轻松很多——因为底层逻辑都是一样的。量化没有想象中那么难难的是坚持用数据验证每一个想法。
Python 量化入门:用 pandas 处理 A 股 K 线数据并计算技术指标
Python 量化入门用 pandas 处理 A 股 K 线数据并计算技术指标量化交易听起来很高大上但本质就是用代码处理数据、发现规律。这篇文章从最基础的 K 线数据开始教你用 pandas 完成数据获取、清洗、技术指标计算的全流程。不需要任何量化框架纯 Python pandas 就够了。一、K 线数据长什么样K 线OHLCV是量化分析的基础数据每一根 K 线包含字段含义open开盘价high最高价low最低价close收盘价volume成交量amount成交额一根日 K 线就是一天的价格摘要。把很多根日 K 线排起来就是我们常说的走势图。量化分析的核心工作就是对这些数据做计算比如算均线、判断金叉死叉、计算涨跌幅排名等。二、获取 K 线数据获取 A 股数据有很多方式。这里用 alphafeed 做示例也可以换成你习惯的数据源后面的 pandas 处理逻辑完全一样pipinstallalphafeedfromalphafeedimportAlphaFeed afAlphaFeed(api_keyyour-api-key)# 也支持环境变量 ALPHAFEED_API_KEY# 获取贵州茅台最近 500 根日 K 线dfaf.klines.get(600519.SH,period1d,count500,to_dataframeTrue)print(df.shape)print(df.columns.tolist())拿到的 DataFrame 大概长这样(500, 9) [symbol, timestamp, trade_date, open, high, low, close, volume, amount]不管用什么数据源只要最终拿到一个包含open/high/low/close/volume的 DataFrame后面的分析流程都是通用的。三、数据初步探索拿到数据后先做基本检查# 看前几行print(df.head())# 看数据类型print(df.dtypes)# 检查缺失值print(df.isnull().sum())# 基本统计print(df[[open,high,low,close,volume]].describe())常见操作把trade_date设为索引方便按时间切片df[trade_date]pd.to_datetime(df[trade_date])dfdf.set_index(trade_date).sort_index()# 取最近一年df_recentdf.loc[2025-06-01:]四、计算常用技术指标1. 涨跌幅df[change_pct]df[close].pct_change()*100print(df[[close,change_pct]].tail(10))2. 移动平均线MA均线是最基础的技术指标用rolling一行搞定df[ma5]df[close].rolling(5).mean()df[ma10]df[close].rolling(10).mean()df[ma20]df[close].rolling(20).mean()df[ma60]df[close].rolling(60).mean()print(df[[close,ma5,ma10,ma20,ma60]].tail(10))怎么看均线短期均线在长期均线上方 → 多头排列趋势向上短期均线从下往上穿过长期均线 → 金叉买入信号反之 → 死叉卖出信号3. MACDMACD 由三部分组成DIF快线-慢线、DEADIF 的均线、柱状图DIF-DEA。defcalc_macd(close,fast12,slow26,signal9):ema_fastclose.ewm(spanfast,adjustFalse).mean()ema_slowclose.ewm(spanslow,adjustFalse).mean()difema_fast-ema_slow deadif.ewm(spansignal,adjustFalse).mean()macd_bar(dif-dea)*2returndif,dea,macd_bar df[dif],df[dea],df[macd]calc_macd(df[close])print(df[[close,dif,dea,macd]].tail(10))怎么用DIF 上穿 DEA → MACD 金叉MACD 柱从负变正 → 趋势可能反转4. RSI相对强弱指标RSI 衡量最近一段时间涨了多少、跌了多少范围 0-100。defcalc_rsi(close,period14):deltaclose.diff()gaindelta.where(delta0,0)loss-delta.where(delta0,0)avg_gaingain.rolling(period).mean()avg_lossloss.rolling(period).mean()rsavg_gain/avg_lossreturn100-(100/(1rs))df[rsi_6]calc_rsi(df[close],6)df[rsi_14]calc_rsi(df[close],14)print(df[[close,rsi_6,rsi_14]].tail(10))怎么看RSI 70 → 超买可能回调RSI 30 → 超卖可能反弹不同周期的 RSI 组合使用效果更好5. 布林带Bollinger Bands布林带由中轨均线和上下轨均线 ± N 倍标准差组成period20df[boll_mid]df[close].rolling(period).mean()df[boll_std]df[close].rolling(period).std()df[boll_upper]df[boll_mid]2*df[boll_std]df[boll_lower]df[boll_mid]-2*df[boll_std]print(df[[close,boll_upper,boll_mid,boll_lower]].tail(10))怎么用价格触及上轨 → 可能超买价格触及下轨 → 可能超卖布林带收窄 → 可能即将变盘6. 成交量分析df[vol_ma5]df[volume].rolling(5).mean()df[vol_ma20]df[volume].rolling(20).mean()# 量比今日成交量 / 近 20 日平均df[vol_ratio]df[volume]/df[vol_ma20]# 筛选放量日量比 2big_vol_daysdf[df[vol_ratio]2]print(f放量交易日:{len(big_vol_days)}天)print(big_vol_days[[close,change_pct,volume,vol_ratio]].tail())五、生成交易信号有了技术指标就可以定义交易规则了。以最经典的双均线策略为例MA5 上穿 MA20 → 买入MA5 下穿 MA20 → 卖出# 判断金叉死叉df[signal]0# 金叉今天 ma5 ma20昨天 ma5 ma20buy_mask(df[ma5]df[ma20])(df[ma5].shift(1)df[ma20].shift(1))df.loc[buy_mask,signal]1# 死叉sell_mask(df[ma5]df[ma20])(df[ma5].shift(1)df[ma20].shift(1))df.loc[sell_mask,signal]-1signalsdf[df[signal]!0]print(f共产生{len(signals)}个信号)print(signals[[close,ma5,ma20,signal]].tail(10))你可以把这个逻辑换成任何其他指标组合比如# MACD 金叉 RSI 未超买buy_macd(df[dif]df[dea])(df[dif].shift(1)df[dea].shift(1))buy_rsidf[rsi_14]70combined_buybuy_macdbuy_rsi六、批量处理多只股票实际做量化需要对多只股票批量计算指标fromalphafeedimportAlphaFeed afAlphaFeed(api_keyyour-api-key)symbols[600519.SH,000858.SZ,601318.SH,000001.SZ,600036.SH]dfsaf.klines.batch(symbols,period1d,count200,to_dataframeTrue,show_progressTrue)results[]forsymbol,dfindfs.items():iflen(df)60:continuedf[ma5]df[close].rolling(5).mean()df[ma20]df[close].rolling(20).mean()df[rsi_14]calc_rsi(df[close],14)latestdf.iloc[-1]results.append({symbol:symbol,close:latest[close],ma5ma20:latest[ma5]latest[ma20],rsi_14:round(latest[rsi_14],1),})importpandasaspdprint(pd.DataFrame(results).to_string(indexFalse))七、关于复权如果你发现 K 线数据里有异常的大跳空比如价格突然减半大概率是因为除权除息。做技术分析前需要用复权数据前复权以最新价格为基准向前调整适合回测后复权以上市价格为基准向后调整适合看长期收益不复权原始价格大多数数据源都支持指定复权方式。用前复权数据来算均线和回测是最常见的做法。八、总结这篇文章覆盖了量化分析最基础的工作流获取 K 线数据DataFrame 格式用rolling计算均线用ewm计算 MACD手写 RSI、布林带生成交易信号金叉死叉批量处理多只股票这些全部是 pandas 的基本操作不需要任何量化框架。掌握了这些再去学 backtrader、vnpy 之类的框架就会轻松很多——因为底层逻辑都是一样的。量化没有想象中那么难难的是坚持用数据验证每一个想法。