📊 什么是双均线策略?
双均线策略是最经典的量化策略之一,用两条均线的交叉来决定买卖。
- 📈 金叉:短期均线从下往上穿过长期均线 → 买入
- 📉 死叉:短期均线从上往下穿过长期均线 → 卖出
🎯 策略逻辑
# 假设用 5日均线 和 20日均线
if MA5 > MA20 and MA5_prev = MA20_prev:
卖出() # 死叉
👨💻 完整代码
import akshare as ak
import pandas as pd
# 1. 获取数据
df = ak.stock_zh_a_hist(symbol="600519", adjust="qfq")
df = df.tail(250) # 最近250天
# 2. 计算均线
df["MA5"] = df["收盘"].rolling(5).mean()
df["MA20"] = df["收盘"].rolling(20).mean()
# 3. 生成交易信号
df["信号"] = "持有"
for i in range(1, len(df)):
ma5 = df["MA5"].iloc[i]
ma20 = df["MA20"].iloc[i]
ma5_prev = df["MA5"].iloc[i-1]
ma20_prev = df["MA20"].iloc[i-1]
if ma5 > ma20 and ma5_prev = ma20_prev:
df.loc[df.index[i], "信号"] = "卖出"
# 4. 显示信号
signals = df[df["信号"].isin(["买入", "卖出"])]
print(signals[["日期", "收盘", "MA5", "MA20", "信号"]])
📊 运行结果示例
日期 收盘 MA5 MA20 信号 2024-03-15 1650.0 1640.0 1630.0 买入 2024-04-20 1700.0 1690.0 1700.0 卖出 2024-05-10 1680.0 1670.0 1665.0 买入 ...💰 模拟回测
# 简单的模拟回测 initial_money = 100000 # 初始资金10万 money = initial_money shares = 0 hold = False for i in range(1, len(df)): signal = df["信号"].iloc[i] price = df["收盘"].iloc[i] if signal == "买入" and not hold: shares = money // price money = money - shares * price hold = True print(f"买入 {shares} 股,价格 {price}") elif signal == "卖出" and hold: money = money + shares * price print(f"卖出 {shares} 股,价格 {price}") shares = 0 hold = False # 最终资产 if hold: final_value = money + shares * df["收盘"].iloc[-1] else: final_value = money profit = (final_value - initial_money) / initial_money * 100 print(f"\n最终资产: {final_value:.2f}") print(f"收益率: {profit:.2f}%")📈 优化方向