给金融小白的Python量化入门:手把手教你用Supermind API跑通第一个策略
给金融小白的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)
策略优化方向建议:
- 参数调优 :用网格搜索寻找最佳均线组合
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%}") - 增加过滤条件 :如结合交易量突破、波动率过滤等
- 多标的测试 :在不同行业股票上验证策略普适性
6. 常见问题与进阶路线
新手常遇到的几个坑:
- 未来函数 :使用了尚未发生的数据(如当日的收盘价决定当日买卖)
- 过度拟合 :参数在历史数据表现完美但实盘失效
- 交易成本 :忽略手续费和滑点导致回测乐观
推荐的学习进阶路径:
- 掌握Pandas数据处理基础
- 学习常见技术指标实现(如MACD、RSI)
- 了解风险管理与仓位控制
- 尝试多因子选股策略
- 研究机器学习在量化中的应用
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
第一次看到策略产生交易信号时,那种"代码真的能赚钱"的兴奋感,就像第一次独立完成一道拿手菜的成就感。建议从小资金开始,保持每周迭代一次策略的频率,量化交易最迷人的地方在于——你的进步会直接反映在账户曲线上。
更多推荐

所有评论(0)