本文面向零基础量化爱好者,手把手教你用纯Python+免费数据源搭建量化分析系统。无需付费API,无需金融背景,跟着做就能跑通。## 为什么要学量化交易?传统炒股靠"感觉",量化交易靠"数据"。**感觉 vs 数据:**- ❌ "我觉得这只股要涨" → 主观情绪,容易追涨杀跌- ✅ "RSI指标超卖+成交量放大" → 客观信号,有据可依量化不是"必胜秘籍",而是**把你的交易逻辑固化成代码**,避免情绪化决策。---## 准备工作:安装环境### 1. 安装Python(已完成可跳过)推荐Python 3.8+,下载地址:https://www.python.org/downloads/### 2. 安装AKShare(免费数据源)```bashpip install akshare```**AKShare是什么?**- 免费、开源的财经数据接口库- 支持A股、港股、美股、基金、期货、外汇等- 无需API Key,即装即用- GitHub:https://github.com/akfamily/akshare---## 实战1:获取股票历史数据### 目标:下载茅台(600519)最近1年的日线数据```pythonimport akshare as akimport pandas as pd# 获取茅台日线数据(2022-01-01 至今)df = ak.stock_zh_a_hist( symbol="600519", # 股票代码 period="daily", # 日线 start_date="20220101", end_date="20251231", adjust="qfq" # 前复权)# 查看数据print(df.head())print(f"共获取 {len(df)} 条数据")```**输出示例:**``` 日期 开盘 收盘 最高 最低 成交量 成交额0 2022-01-04 2050.0 2070.0 2088.0 2045.0 3456789 71234567891 2022-01-05 2070.0 2065.0 2085.0 2055.0 3234567 6890123456...```**关键字段解释:**- `收盘`:每天最后一笔成交价(最重要!)- `成交量`:当天成交了多少股- `成交额`:当天成交了多少钱(成交量×均价)---## 实战2:计算技术指标(RSI)### 什么是RSI?**RSI(相对强弱指数)**:衡量股票"超买"或"超卖"的程度。- RSI > 70:超买区(可能要跌,考虑卖出)- RSI < 30:超卖区(可能要涨,考虑买入)### 代码实现```pythondef calculate_rsi(df, period=14): """ 计算RSI指标 :param df: 包含'收盘'列的DataFrame :param period: RSI周期,默认14天 :return: 添加了RSI列的DataFrame """ # 计算价格变化 delta = df['收盘'].diff() # 分别计算上涨和下跌 gain = delta.where(delta > 0, 0) loss = -delta.where(delta < 0, 0) # 计算平均上涨和平均下跌 avg_gain = gain.rolling(window=period).mean() avg_loss = loss.rolling(window=period).mean() # 计算RSI rs = avg_gain / avg_loss rsi = 100 - (100 / (1 + rs)) df['RSI'] = rsi return df# 使用函数df = calculate_rsi(df)# 查看最近的RSI值print(df[['日期', '收盘', 'RSI']].tail(10))```---## 实战3:绘制K线图+RSI指标### 使用mplfinance库可视化```pythonpip install mplfinance``````pythonimport mplfinance as mpf# 准备数据(mplfinance要求列名为特定格式)df_plot = df.copy()df_plot = df_plot.set_index('日期')df_plot.columns = ['Open', 'Close', 'High', 'Low', 'Volume', 'Amount', 'RSI']# 创建RSI子图rsi_plot = mpf.make_addplot(df_plot['RSI'], panel='lower', color='purple', width=1.5)# 绘制K线图mpf.plot( df_plot, type='candle', volume=True, addplot=rsi_plot, title='茅台K线图 + RSI指标', style='yahoo')```**图表效果:**- 主图:K线(红色涨、绿色跌)- 副图:RSI曲线(紫色)---## 实战4:回测简单策略### 策略逻辑**买入信号**:RSI < 30(超卖)**卖出信号**:RSI > 70(超买)### 回测代码```pythondef backtest_rsi_strategy(df): """ RSI策略回测 """ df['Signal'] = 0 # 0=持仓, 1=买入, -1=卖出 df['Position'] = 0 # 持仓状态:0=空仓, 1=持仓 for i in range(1, len(df)): # 买入信号 if df.loc[i, 'RSI'] < 30 and df.loc[i-1, 'Position'] == 0: df.loc[i, 'Signal'] = 1 df.loc[i, 'Position'] = 1 # 卖出信号 elif df.loc[i, 'RSI'] > 70 and df.loc[i-1, 'Position'] == 1: df.loc[i, 'Signal'] = -1 df.loc[i, 'Position'] = 0 else: df.loc[i, 'Position'] = df.loc[i-1, 'Position'] # 计算收益 df['Returns'] = df['收盘'].pct_change() df['Strategy_Returns'] = df['Position'].shift(1) * df['Returns'] # 累计收益 cumulative_returns = (1 + df['Strategy_Returns']).cumprod() print(f"策略总收益: {cumulative_returns.iloc[-1]:.2%}") print(f"买入持有收益: {(df['收盘'].iloc[-1] / df['收盘'].iloc[0] - 1):.2%}") return df# 运行回测df = backtest_rsi_strategy(df)```---## 进阶:多因子策略单因子(如RSI)容易失效,实战中常用**多因子组合**:| 因子类型 | 示例指标 | 作用 ||---------|---------|------|| 趋势因子 | MACD、均线 | 判断大方向 || 动量因子 | RSI、KDJ | 捕捉超买超卖 || 成交量因子 | 量比、换手率 | 确认资金意图 || 情绪因子 | 北向资金、融资余额 | 跟随聪明钱 |**示例:RSI + MACD 组合策略**```python# 计算MACDdef calculate_macd(df, fast=12, slow=26, signal=9): ema_fast = df['收盘'].ewm(span=fast).mean() ema_slow = df['收盘'].ewm(span=slow).mean() df['MACD'] = ema_fast - ema_slow df['Signal_Line'] = df['MACD'].ewm(span=signal).mean() df['MACD_Hist'] = df['MACD'] - df['Signal_Line'] return dfdf = calculate_macd(df)# 组合信号:RSI < 30 且 MACD > Signal_Line(金叉)buy_signal = (df['RSI'] < 30) & (df['MACD'] > df['Signal_Line'])```---## 风险提示1. **历史不代表未来**:回测收益≠实盘收益2. **滑点和手续费**:回测通常忽略,实盘会侵蚀利润3. **过度拟合**:策略太复杂,反而容易失效4. **量化不是赌博**:严格止损,资金管理第一---## 总结本文介绍了:- ✅ 用AKShare免费获取A股数据- ✅ 计算RSI技术指标- ✅ 可视化K线图- ✅ 回测简单策略**下一步学习方向:**1. 学习更多技术指标(MACD、布林带、KDJ)2. 研究因子选股(基本面+技术面)3. 了解风险管理和资金管理4. 尝试机器学习预测(LSTM、随机森林)---## 参考资料- AKShare官方文档:https://akshare.akfamily.xyz/- Pandas官方教程:https://pandas.pydata.org/docs/getting_started/- 量化学习路线:https://www.joinquant.com/---**免责声明**:本文仅为技术分享,不构成任何投资建议。股市有风险,入市需谨慎。---**作者信息**:- CSDN:@MMlonghao- 专注领域:量化交易、Python数据分析、开源项目- 下期预告:《用Python爬取东方财富股吧舆情数据》