算法交易(Algorithmic Trading),简单说就是用计算机程序代替人来做交易决策。你定好规则,机器自动执行。它不神秘,也不高深——本质上就是把你的交易思路写成代码,让电脑帮你盯盘、下单。
很多散户觉得算法交易是机构才用的东西,其实不然。今天任何一个普通投资者,只要有台电脑、能上网,就能写出自己的交易策略。股老师这门课,就是帮零基础的你迈出这一步。
机器毫秒级响应,捕捉转瞬即逝的机会,人类手动操作至少需要几秒钟
严格按照规则执行,不会被恐惧、贪婪影响,克服人性的弱点
用历史数据验证策略效果,亏钱在回测里亏,不在实盘里亏
策略可以同时监控多个市场、多只股票,人不睡觉它也不睡
不断迭代升级,数据驱动决策,越用越聪明
严格执行止损止盈,避免犹豫不决导致的亏损扩大
💡 股老师的话: 别怕编程。你不需要成为程序员,只需要学会把"如果……就……"这样的逻辑写成代码。就像学开车,你不需要懂发动机原理,会踩油门刹车就行。
| 策略类型 | 核心逻辑 | 适合人群 |
|---|---|---|
| 趋势跟踪 | 价格突破均线或通道时买入,趋势反转时卖出 | 初学者、趋势投资者 |
| 均值回归 | 价格偏离均值过多时反向操作,博取价格回归 | 震荡市中的交易者 |
| 套利策略 | 利用不同市场或品种之间的价差获利 | 有一定经验的交易者 |
| 统计套利 | 基于统计模型发现定价偏差,配对交易 | 进阶量化交易者 |
| 做市策略 | 同时挂买卖单,赚取买卖价差 | 机构为主,个人较难 |
对个人投资者来说,趋势跟踪和均值回归是最容易上手的两类策略。后面的章节我们会实际写出这两种策略的代码。
写算法交易不需要昂贵的设备,一台普通的笔记本电脑就够了。我们只需要安装三个东西:Python编程环境、一个代码编辑器、以及一些免费的Python库。
python --version,看到版本号就是成功了打开命令行,依次输入以下命令(每输完一行按回车):
# 安装核心库
pip install pandas numpy matplotlib
# 安装金融数据获取库
pip install yfinance akshare
# 安装回测框架(二选一即可)
pip install backtrader
# 或者
pip install zipline-reloaded
📌 说明: pandas 和 numpy 是数据处理的基础库,matplotlib 用来画图,yfinance 可以获取美股数据,akshare 可以获取A股数据。回测框架 backtrader 最易上手,我们后面就用它。
推荐使用 VS Code(Visual Studio Code),免费且功能强大。
新建一个文件,命名为 test.py,输入以下代码并运行:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 生成一些示例数据
dates = pd.date_range('2025-01-01', periods=100)
prices = np.random.randn(100).cumsum() + 100
# 画个折线图
plt.plot(dates, prices)
plt.title('测试:随机价格走势')
plt.xlabel('日期')
plt.ylabel('价格')
plt.show()
print('环境搭建成功!股老师为你骄傲 🎉')
如果看到一张折线图和打印出来的成功消息,说明你的量化开发环境已经搭好了!
现在我们来写一个最简单的策略——双均线交叉策略(Golden Cross / Death Cross)。这是最经典的交易策略之一:当短期均线上穿长期均线时买入(金叉),下穿时卖出(死叉)。
我们先手动写一个简单的版本,不使用回测框架,这样更容易理解背后的逻辑:
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
# 1. 获取数据——以贵州茅台为例
ticker = yf.Ticker("600519.SS")
data = ticker.history(period="1y") # 最近1年数据
# 2. 计算均线
data['MA5'] = data['Close'].rolling(window=5).mean()
data['MA20'] = data['Close'].rolling(window=20).mean()
# 3. 生成信号
data['Signal'] = 0
data.loc[data['MA5'] > data['MA20'], 'Signal'] = 1 # 金叉信号
data['Position'] = data['Signal'].diff() # 1表示买入,-1表示卖出
# 4. 画出结果
plt.figure(figsize=(14, 7))
plt.plot(data.index, data['Close'], label='收盘价', color='#94a3b8', alpha=0.7)
plt.plot(data.index, data['MA5'], label='MA5', color='#6366f1', linewidth=1.5)
plt.plot(data.index, data['MA20'], label='MA20', color='#f59e0b', linewidth=1.5)
# 标记买入点(绿色箭头)
buy_signals = data[data['Position'] == 1]
plt.scatter(buy_signals.index, buy_signals['Close'],
color='#22c55e', marker='^', s=120, label='买入信号', zorder=5)
# 标记卖出点(红色箭头)
sell_signals = data[data['Position'] == -1]
plt.scatter(sell_signals.index, sell_signals['Close'],
color='#ef4444', marker='v', s=120, label='卖出信号', zorder=5)
plt.title('双均线交叉策略信号 (贵州茅台)', fontsize=16, fontweight='bold')
plt.legend()
plt.grid(alpha=0.1)
plt.show()
print(f"买入信号次数: {len(buy_signals)}")
print(f"卖出信号次数: {len(sell_signals)}")
运行这段代码,你会看到一张标注了买入和卖出信号的走势图。是不是很直观?这就是算法交易的魅力——你定好规则,电脑帮你执行。
⚠️ 重要提醒: 这个策略只是教学演示,不代表实盘能赚钱。双均线策略在趋势行情中表现不错,但在震荡市中会反复被"打脸"。后面我们会教你如何评估策略的好坏。
写好了策略,不能直接拿到实盘去试。我们需要用历史数据来回测,看看这个策略在过去的表现如何。回测的目的不是预测未来,而是排除那些明显有问题的策略。
上面我们手写了策略逻辑,但要做专业的回测,推荐使用 backtrader 框架。它帮我们处理了资金管理、订单执行、滑点等细节。
import backtrader as bt
import yfinance as yf
import pandas as pd
# 1. 定义策略类
class GoldenCrossStrategy(bt.Strategy):
params = (
('fast', 5), # 短期均线周期
('slow', 20), # 长期均线周期
)
def __init__(self):
self.fast_ma = bt.indicators.SMA(self.data.close, period=self.params.fast)
self.slow_ma = bt.indicators.SMA(self.data.close, period=self.params.slow)
self.crossover = bt.indicators.CrossOver(self.fast_ma, self.slow_ma)
def next(self):
if self.crossover > 0: # 金叉
self.buy()
elif self.crossover < 0: # 死叉
self.sell()
# 2. 获取数据
ticker = yf.Ticker("600519.SS")
data = ticker.history(period="2y")
data_feed = bt.feeds.PandasData(dataname=data)
# 3. 配置回测引擎
cerebro = bt.Cerebro()
cerebro.addstrategy(GoldenCrossStrategy)
cerebro.adddata(data_feed)
cerebro.broker.setcash(100000.0) # 初始资金10万
cerebro.broker.setcommission(commission=0.0003) # 佣金万分之三
# 4. 添加分析器
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
# 5. 运行回测
print('初始资金: %.2f' % cerebro.broker.getvalue())
results = cerebro.run()
print('最终资金: %.2f' % cerebro.broker.getvalue())
# 6. 输出评估指标
strat = results[0]
sharpe = strat.analyzers.sharpe.get_analysis()
returns = strat.analyzers.returns.get_analysis()
drawdown = strat.analyzers.drawdown.get_analysis()
print(f"\n=== 回测评估报告 ===")
print(f"夏普比率: {sharpe.get('sharperatio', 0):.2f}")
print(f"年化收益率: {returns.get('rnorm100', 0):.2f}%")
print(f"最大回撤: {drawdown.get('max', {}).get('drawdown', 0):.2f}%")
# 7. 画图
cerebro.plot()
| 指标 | 含义 | 参考标准 |
|---|---|---|
| 年化收益率 | 策略每年平均赚多少 | 一般 >15% 算不错 |
| 夏普比率 | 每承担一单位风险能获得多少超额收益 | >1 可接受,>2 很好,>3 优秀 |
| 最大回撤 | 策略从最高点到最低点最多亏了多少 | 最好 <20% |
| 胜率 | 盈利交易占总交易的比例 | 40%-60% 都正常 |
| 盈亏比 | 平均盈利 / 平均亏损 | >1.5 较好 |
| 交易次数 | 策略总共交易了多少次 | 太少可能欠拟合,太多可能过拟合 |
✅ 核心原则: 不要只看收益率!一个年化50%但最大回撤40%的策略,可能比年化15%但最大回撤8%的策略更糟糕。记住:活得久比赚得快更重要。
避免这些坑的最好方法:用样本外数据验证。比如用2024年的数据来优化策略,然后用2025年的数据来验证。
理论学再多,不如动手写一个。下面给你三个从简单到进阶的实战策略,每个都可以直接运行和修改。
当价格突破布林带上轨时买入(强势突破),跌破下轨时卖出(恐慌抛售)。适合趋势明显的行情。
import backtrader as bt
class BollingerBreakout(bt.Strategy):
params = (
('period', 20),
('devfactor', 2),
)
def __init__(self):
self.boll = bt.indicators.BollingerBands(
self.data.close, period=self.params.period,
devfactor=self.params.devfactor
)
def next(self):
# 价格突破上轨,买入
if self.data.close[0] > self.boll.lines.top[0] and not self.position:
self.buy()
# 价格跌破中轨,卖出
if self.data.close[0] < self.boll.lines.mid[0] and self.position:
self.sell()
RSI指标低于30时买入(超卖),高于70时卖出(超买)。适合震荡行情。
class RSIStrategy(bt.Strategy):
params = (
('rsi_period', 14),
('oversold', 30),
('overbought', 70),
)
def __init__(self):
self.rsi = bt.indicators.RSI(self.data.close, period=self.params.rsi_period)
def next(self):
# RSI低于超卖线,买入
if self.rsi[0] < self.params.oversold and not self.position:
self.buy()
# RSI高于超买线,卖出
if self.rsi[0] > self.params.overbought and self.position:
self.sell()
这是著名的趋势跟踪策略。突破过去20日最高价买入,跌破过去10日最低价卖出。
class TurtleStrategy(bt.Strategy):
params = (
('entry_period', 20), # 突破买入周期
('exit_period', 10), # 跌破卖出周期
)
def __init__(self):
self.entry_high = bt.indicators.Highest(
self.data.high, period=self.params.entry_period
)
self.exit_low = bt.indicators.Lowest(
self.data.low, period=self.params.exit_period
)
def next(self):
if self.data.close[0] > self.entry_high[-1] and not self.position:
self.buy()
if self.data.close[0] < self.exit_low[-1] and self.position:
self.sell()
把上面任何一个策略放到之前回测的模板里,替换 GoldenCrossStrategy,就能看到它的表现。
💡 股老师的建议: 不要贪多。选一个策略,深入理解它,把它跑通,然后不断优化。一个策略做精了,比十个半吊子策略强一百倍。
算法交易最大的优势是纪律性,最大的风险是你相信算法不会错。任何策略都有失效的时候,做好风险管理比策略本身更重要。
过拟合是量化交易最大的敌人。一个看起来完美的回测曲线,实盘可能一塌糊涂。避免过拟合的方法:
🚨 股老师提醒你: 算法交易不是"躺着赚钱"的魔法。它只是一种工具,帮你更高效地执行交易纪律。如果你对策略没信心,不要实盘。如果你对风险没概念,不要实盘。如果你连代码逻辑都没完全理解,绝对不要实盘。
完成了本课程的基础内容后,如果你想继续深入,可以按这个方向学习:
同时,建议你把之前学过的技术分析知识(比如MACD、KDJ、布林带)都尝试写成策略,回测一下,看看哪些指标是真的有用的。