给金融小白的Python量化入门:手把手教你用Supermind API跑通第一个策略

想象一下,如果你能用代码编写一份"投资菜谱",让计算机自动执行买卖操作,就像设定好烤箱温度和时间就能烤出完美蛋糕——这就是量化交易最朴素的魅力。本文将带你用Python和Supermind平台,从零开始构建一个会"自动赚钱"的均线策略,整个过程就像学做第一道番茄炒蛋那样简单明了。

1. 准备你的量化厨房:Supermind环境配置

在开始烹饪前,我们需要准备好灶台和厨具。打开 Supermind官网 注册账号后,点击控制台左侧的"API管理",你会看到两把"数字钥匙":

API_KEY = "你的专属密钥"
SECRET_KEY = "你的私密钥匙"

提示:这两串字符相当于银行卡密码,建议保存在本地文件而非直接写在代码中。后续我们会用python-dotenv库管理密钥。

接下来安装必要的Python工具包,就像准备调料架:

pip install supermind-sdk pandas matplotlib python-dotenv

新建一个 .env 文件存放密钥,这是标准的密钥管理方式:

# .env文件内容
SUPERMIND_API_KEY=your_api_key_here
SUPERMIND_SECRET_KEY=your_secret_key_here

验证环境是否配置成功,可以运行以下测试代码:

from supermind import Client
import os
from dotenv import load_dotenv

load_dotenv()
client = Client(api_key=os.getenv("SUPERMIND_API_KEY"), 
                secret_key=os.getenv("SUPERMIND_SECRET_KEY"))
print(client.get_account_status())  # 应该返回账户状态信息

2. 获取食材:用API抓取股票数据

量化策略的"食材"就是历史行情数据。Supermind提供沪深A股完整的Level-1/Level-2数据,我们以贵州茅台(600519.SH)为例获取最近60天的日线数据:

import pandas as pd

def fetch_stock_data(symbol, days=60):
    params = {
        "symbol": symbol,
        "start_date": pd.Timestamp.now() - pd.Timedelta(days=days),
        "end_date": pd.Timestamp.now(),
        "frequency": "1d"  # 日线数据
    }
    data = client.get_market_data(**params)
    return pd.DataFrame(data)

maotai = fetch_stock_data("600519.SH")
print(maotai[["date", "close"]].head())

典型的数据返回格式如下表所示:

字段名 类型 说明
date datetime 交易日期
open float 开盘价
high float 最高价
low float 最低价
close float 收盘价
volume int 成交量(股)
amount float 成交额(元)

注意:首次获取数据时建议先打印数据结构和字段说明,避免后续使用时混淆开盘价/收盘价等关键指标。

3. 编写菜谱:双均线策略实现

双均线策略就像用两个不同尺寸的筛网过滤信号:当短期均线(如5日)上穿长期均线(如20日)时买入,下穿时卖出。以下是具体实现:

def calculate_ma(df, window=5):
    """计算移动平均线"""
    return df['close'].rolling(window=window).mean()

def double_ma_strategy(data, short_window=5, long_window=20):
    # 计算双均线
    data['short_ma'] = calculate_ma(data, short_window)
    data['long_ma'] = calculate_ma(data, long_window)
    
    # 生成交易信号 (1:买入, -1:卖出, 0:持有)
    data['signal'] = 0
    data.loc[data['short_ma'] > data['long_ma'], 'signal'] = 1
    data.loc[data['short_ma'] < data['long_ma'], 'signal'] = -1
    
    # 计算每日持仓 (避免未来函数)
    data['position'] = data['signal'].shift(1).fillna(0)
    return data

strategy_data = double_ma_strategy(maotai)
print(strategy_data[['date', 'close', 'short_ma', 'long_ma', 'signal']].tail(10))

关键参数说明:

  • short_window :短期均线周期,常见值为5/10日
  • long_window :长期均线周期,常见值为20/60日
  • signal :交易信号,1表示金叉(买入),-1表示死叉(卖出)
  • position :实际持仓,使用shift(1)避免使用未来数据

4. 试菜环节:策略回测与结果分析

在真金白银投入前,我们需要用历史数据"试菜"。Supermind的回测引擎可以快速验证策略表现:

def run_backtest(strategy_df, initial_capital=100000):
    # 计算每日收益率
    strategy_df['daily_return'] = strategy_df['close'].pct_change()
    
    # 计算策略收益率 (考虑交易信号)
    strategy_df['strategy_return'] = strategy_df['daily_return'] * strategy_df['position']
    
    # 计算累计收益
    strategy_df['cumulative_market'] = (1 + strategy_df['daily_return']).cumprod()
    strategy_df['cumulative_strategy'] = (1 + strategy_df['strategy_return']).cumprod()
    
    # 计算最大回撤
    strategy_df['peak'] = strategy_df['cumulative_strategy'].cummax()
    strategy_df['drawdown'] = (strategy_df['peak'] - strategy_df['cumulative_strategy']) / strategy_df['peak']
    
    return strategy_df

backtest_result = run_backtest(strategy_data)

用Matplotlib可视化回测结果:

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 6))
plt.plot(backtest_result['date'], backtest_result['cumulative_market'], label='买入持有')
plt.plot(backtest_result['date'], backtest_result['cumulative_strategy'], label='双均线策略')
plt.title('策略收益对比')
plt.legend()
plt.show()

关键指标解读:

  • 年化收益率 :策略的年化收益,高于基准为优
  • 最大回撤 :资金从峰值到谷底的最大损失,越小越好
  • 夏普比率 :单位风险获得的超额收益,大于1为佳
  • 胜率 :盈利交易次数占比,通常追求50%以上

5. 上灶实操:模拟交易与策略优化

通过回测验证后,可以在模拟盘中进行实战演练。Supermind提供真实的模拟交易环境:

def execute_simulation(client, symbol, strategy_data):
    for index, row in strategy_data.iterrows():
        if row['signal'] == 1 and not has_position(symbol):
            # 金叉信号且无持仓时买入
            order = client.create_order(
                symbol=symbol,
                price=row['close'],
                volume=100,  # 假设每次交易100股
                direction="buy",
                order_type="limit"
            )
        elif row['signal'] == -1 and has_position(symbol):
            # 死叉信号且持有仓位时卖出
            order = client.create_order(
                symbol=symbol,
                price=row['close'],
                volume=100,
                direction="sell",
                order_type="limit"
            )

def has_position(symbol):
    """检查当前是否持有某股票"""
    positions = client.get_positions()
    return any(p['symbol'] == symbol for p in positions)

策略优化方向建议:

  1. 参数调优 :用网格搜索寻找最佳均线组合
    for short in [3, 5, 10]:
        for long in [20, 30, 60]:
            test_data = double_ma_strategy(maotai, short, long)
            result = run_backtest(test_data)
            print(f"短{short}长{long}组合的年化收益: {result['cumulative_strategy'][-1]:.2%}")
    
  2. 增加过滤条件 :如结合交易量突破、波动率过滤等
  3. 多标的测试 :在不同行业股票上验证策略普适性

6. 常见问题与进阶路线

新手常遇到的几个坑:

  • 未来函数 :使用了尚未发生的数据(如当日的收盘价决定当日买卖)
  • 过度拟合 :参数在历史数据表现完美但实盘失效
  • 交易成本 :忽略手续费和滑点导致回测乐观

推荐的学习进阶路径:

  1. 掌握Pandas数据处理基础
  2. 学习常见技术指标实现(如MACD、RSI)
  3. 了解风险管理与仓位控制
  4. 尝试多因子选股策略
  5. 研究机器学习在量化中的应用

Supermind社区有很多用户分享的策略源码,比如这个改进版均线策略就增加了止损机制:

def enhanced_ma_strategy(data, stop_loss=0.95):
    data = double_ma_strategy(data)
    # 增加止损逻辑
    data['peak_price'] = data['close'].cummax()
    data.loc[data['close'] < data['peak_price'] * stop_loss, 'signal'] = -1
    return data

第一次看到策略产生交易信号时,那种"代码真的能赚钱"的兴奋感,就像第一次独立完成一道拿手菜的成就感。建议从小资金开始,保持每周迭代一次策略的频率,量化交易最迷人的地方在于——你的进步会直接反映在账户曲线上。

更多推荐