双均线策略:最简单的自动买卖策略

📊 什么是双均线策略?

双均线策略是最经典的量化策略之一,用两条均线的交叉来决定买卖。

  • 📈 金叉:短期均线从下往上穿过长期均线 → 买入
  • 📉 死叉:短期均线从上往下穿过长期均线 → 卖出

🎯 策略逻辑

# 假设用 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}%")

📈 优化方向

发表评论