
搭建量化交易实验系统的核心组件
教学用量化交易实验系统需要包含数据获取、策略回测、模拟交易和风险监控四个模块。数据获取模块负责从公开API或本地数据库读取股票和期货的历史行情与实时报价。回测引擎让学员验证策略在历史数据上的表现。模拟交易模块提供虚拟资金账户,对接实时行情执行订单。风险监控模块实时计算持仓风险指标,防止教学过程中出现无限亏损。
数据源选择与处理
股票数据可选用Tushare、AkShare或Yahoo Finance接口。期货数据需关注主力连续合约与展期处理。教学系统应内置数据清洗函数,处理缺失值、停牌和涨跌停。数据存储推荐使用SQLite或Parquet文件,便于学生本地运行。
import akshare as ak
import pandas as pd
def fetch_stock_data(symbol, start, end):
df = ak.stock_zh_a_hist(symbol=symbol, period="daily", start_date=start, end_date=end)
df['date'] = pd.to_datetime(df['日期'])
df.set_index('date', inplace=True)
return df[['开盘', '最高', '最低', '收盘', '成交量']]
def fetch_futures_data(symbol, start, end):
df = ak.futures_main_sina(symbol=symbol, start_date=start, end_date=end)
df['date'] = pd.to_datetime(df['日期'])
df.set_index('date', inplace=True)
return df[['开盘价', '最高价', '最低价', '收盘价', '成交量']]
回测引擎设计要点
教学回测引擎需支持多品种、多周期和自定义手续费。股票交易考虑印花税与佣金,期货考虑保证金与逐日盯市。引擎应输出夏普比率、最大回撤、胜率等指标。避免未来函数,采用事件驱动或向量化回测。向量化回测速度快,适合教学演示;事件驱动更贴近实盘,适合进阶课程。

import numpy as np
import pandas as pd
def vectorized_backtest(prices, signals, commission=0.0003, slippage=0.0001):
returns = prices.pct_change().shift(-1)
positions = signals.shift(1).fillna(0)
strategy_returns = positions * returns - commission * positions.diff().abs() - slippage * positions.diff().abs()
cumulative = (1 + strategy_returns).cumprod()
sharpe = np.sqrt(252) * strategy_returns.mean() / strategy_returns.std()
max_drawdown = (cumulative / cumulative.cummax() - 1).min()
return {'cumulative': cumulative, 'sharpe': sharpe, 'max_drawdown': max_drawdown}
模拟交易与实时行情对接
模拟交易模块需要处理订单生命周期:提交、成交、撤单、部分成交。教学系统可对接CTP仿真或IB模拟账户。股票模拟可使用模拟撮合引擎,按当前盘口价格成交。期货模拟需计算保证金占用与强平逻辑。实时行情通过WebSocket推送,更新持仓盈亏。
class SimulatedBroker:
def __init__(self, cash=1000000):
self.cash = cash
self.positions = {}
self.orders = []
def submit_order(self, symbol, side, price, volume, order_type='limit'):
order = {'symbol': symbol, 'side': side, 'price': price, 'volume': volume, 'status': 'pending'}
self.orders.append(order)
return order
def on_tick(self, symbol, bid, ask):
for order in self.orders:
if order['status'] != 'pending':
continue
if order['side'] == 'buy' and (order['price'] >= ask or order['type'] == 'market'):
cost = order['price'] * order['volume']
if self.cash >= cost:
self.cash -= cost
self.positions[symbol] = self.positions.get(symbol, 0) + order['volume']
order['status'] = 'filled'
elif order['side'] == 'sell' and (order['price'] <= bid or order['type'] == 'market'):
if self.positions.get(symbol, 0) >= order['volume']:
self.cash += order['price'] * order['volume']
self.positions[symbol] -= order['volume']
order['status'] = 'filled'
教学场景中的风险管理
教学实验必须包含风险约束。股票策略限制单票仓位不超过10%,期货策略限制保证金占用不超过总资金30%。系统应实时计算在险价值与压力测试结果。学生需学会设置止损止盈,避免过度交易。模拟交易记录所有操作日志,用于事后复盘。
def check_risk(position_value, total_capital, max_leverage=1.0):
leverage = position_value / total_capital
if leverage > max_leverage:
return False, f"杠杆{leverage:.2f}超过限制{max_leverage}"
return True, "风险可控"
实验系统部署与教学流程
实验系统部署在Jupyter Notebook或Streamlit界面中,方便学生修改参数。教学流程分为四步。第一步数据探索,计算收益率分布与相关性。第二步策略编写,使用pandas或backtrader。第三步回测对比,分组讨论过拟合问题。第四步模拟交易竞赛,以两周为周期评估夏普比率。教师端可设置市场冲击模型,增加滑点模拟。
股票与期货的差异需在教学中强调。股票无杠杆,期货有杠杆与到期日。股票T+1,期货T+0。教学系统应提供两种资产的独立回测模板。学生通过修改参数理解保证金交易的双刃剑效应。
import streamlit as st
st.title("量化交易教学实验系统")
symbol = st.selectbox("选择标的", ["000001", "600519", "IF2406", "AU2406"])
start = st.date_input("开始日期")
end = st.date_input("结束日期")
if st.button("运行回测"):
if symbol.startswith('0') or symbol.startswith('6'):
data = fetch_stock_data(symbol, start, end)
else:
data = fetch_futures_data(symbol, start, end)
st.line_chart(data['收盘'])
实验系统评估与改进
教学效果通过学生策略的样本外表现衡量。系统记录每笔模拟交易,生成交易热力图与资金曲线。教师定期更新数据源,加入新上市期货合约。系统应支持多用户并发,每个学生独立账户。后端使用Redis存储实时持仓,Celery处理回测任务。
量化交易教学实验系统需要平衡真实性与易用性。过度复杂的系统会分散学习注意力,过度简化则无法反映市场摩擦。建议从日频股票回测开始,逐步增加期货日内模拟。学生掌握基础后,可引入机器学习因子挖掘与组合优化。系统代码应开源,鼓励学生修改引擎逻辑。通过反复实验,学生能建立对市场微观结构与策略风险的直观认知。