股票自动化交易的核心组件
股票自动化交易系统由数据源、策略引擎、订单执行、风险控制四个模块构成。数据源获取实时行情与历史K线,策略引擎根据预设规则生成买卖信号,订单执行通过券商API发送委托,风险控制监控持仓与资金曲线。期货自动化交易复用相同架构,只需替换合约代码与保证金计算逻辑。
行情数据接入
免费数据源可选AKShare、Tushare,付费可选Wind、聚宽。股票与期货的tick数据、分钟线、日线均需标准化为DataFrame格式。以下代码获取股票日线数据并计算20日均线:

import akshare as ak
import pandas as pd
df = ak.stock_zh_a_hist(symbol="600519", period="daily", start_date="20240101", end_date="20241231")
df['ma20'] = df['收盘'].rolling(20).mean()
df['signal'] = (df['收盘'] > df['ma20']).astype(int)
期货数据可用ak.futures_zh_daily_sina(symbol="RB2410")获取螺纹钢主力合约。
策略引擎与信号生成
股票自动化常用双均线、布林带、动量策略。期货因杠杆特性,适合ATR止损与趋势跟踪。策略需输出离散信号:1做多,-1做空,0平仓。股票默认只能做多,期货可双向。
def dual_ma_signal(df, short=5, long=20):
df['short_ma'] = df['收盘'].rolling(short).mean()
df['long_ma'] = df['收盘'].rolling(long).mean()
df['signal'] = 0
df.loc[df['short_ma'] > df['long_ma'], 'signal'] = 1
df.loc[df['short_ma'] < df['long_ma'], 'signal'] = -1
return df
订单执行与券商API
国内股票自动化需通过券商官方API或第三方平台。华泰、国金、中泰提供Python接口。期货可用CTP接口,通过vnpy或thosttraderapi封装。
from vnpy_ctp import CtpGateway
from vnpy.trader.engine import MainEngine
main_engine = MainEngine()
main_engine.add_gateway(CtpGateway)
main_engine.connect({'经纪商代码':'9999','行情服务器':'tcp://...','交易服务器':'tcp://...','账号':'123456','密码':'xxxx'})
股票委托示例使用easytrader:
import easytrader
user = easytrader.use('ht_client')
user.prepare('ht.json')
user.buy('600519', price=1700, amount=100)
风险控制与资金管理
股票自动化需设置单笔最大亏损比例、总仓位上限、日内回撤熔断。期货额外监控保证金占用与强平风险。
class RiskManager:
def __init__(self, max_loss_pct=0.02, max_position=0.8):
self.max_loss_pct = max_loss_pct
self.max_position = max_position
def check(self, account, signal):
if account['drawdown'] > self.max_loss_pct:
return 0
if account['position'] / account['total'] > self.max_position:
return min(signal, 0)
return signal
期货自动化交易的差异点
期货合约有到期日、保证金、杠杆、夜盘。自动化系统需处理主力合约换月,计算动态保证金,设置涨跌停板保护。股票无到期日,无杠杆,T+1交收,期货T+0。
主力合约换月逻辑
def rollover_check(current_contract, next_contract, open_interest_ratio=0.8):
if next_contract.oi > current_contract.oi * open_interest_ratio:
return next_contract.symbol
return current_contract.symbol
保证金与强平计算
期货保证金 = 合约价值 × 保证金率 × 手数。可用资金低于维持保证金时,期货公司强平。自动化系统需预留20%缓冲。
def margin_required(price, multiplier, margin_rate, lots):
return price * multiplier * margin_rate * lots
def liquidation_price(entry, margin, multiplier, lots, is_long):
if is_long:
return entry - margin / (multiplier * lots)
else:
return entry + margin / (multiplier * lots)
回测与实盘部署
股票自动化回测用backtrader或vectorbt。期货回测需加入滑点与手续费。回测夏普比率大于1.5、最大回撤小于20%可考虑实盘。
回测示例
import backtrader as bt
class SmaCross(bt.Strategy):
params = (('fast', 10), ('slow', 30))
def __init__(self):
self.sma_fast = bt.ind.SMA(period=self.p.fast)
self.sma_slow = bt.ind.SMA(period=self.p.slow)
self.crossover = bt.ind.CrossOver(self.sma_fast, self.sma_slow)
def next(self):
if not self.position and self.crossover > 0:
self.buy(size=100)
elif self.position and self.crossover < 0:
self.close()
cerebro = bt.Cerebro()
cerebro.addstrategy(SmaCross)
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
cerebro.broker.setcash(100000)
cerebro.run()
实盘部署注意事项
股票自动化实盘需处理网络延迟、订单部分成交、涨跌停无法买入。期货需处理夜盘断线重连、CTP前置切换。建议使用Linux服务器,部署systemd守护进程,日志记录每笔委托与成交。
import logging
logging.basicConfig(filename='trade.log', level=logging.INFO,
format='%(asctime)s - %(message)s')
logging.info(f'Buy order: {symbol}, price={price}, amount={amount}')
常见陷阱与优化方向
股票自动化回测过拟合是最大陷阱。样本内夏普高,样本外失效。期货需区分主力与指数合约,避免换月跳空。
过拟合检测
参数敏感度测试:均线周期变化10%,收益波动小于30%为稳健。
滚动回测:每季度重新优化参数,观察夏普稳定性。
蒙特卡洛模拟:随机打乱交易顺序,评估最大回撤分布。
执行优化
股票自动化可用TWAP/VWAP算法拆单,降低冲击成本。期货可用限价单+市价单组合,避免滑点。
def twap_order(symbol, total_size, slices, interval_sec):
for i in range(slices):
size = total_size // slices
send_order(symbol, size)
time.sleep(interval_sec)
股票自动化与期货自动化共享核心框架,差异在于合约规则与风控参数。实盘前至少6个月模拟盘验证,每日检查持仓与API连接状态。