摘要: 股票自动化交易依赖Python与券商API,期货CTA策略可复用相同框架。回测验证后实盘部署,重点控制滑点与风险。

股票自动化交易的核心组件

股票自动化交易系统由数据源、策略引擎、订单执行、风险控制四个模块构成。数据源获取实时行情与历史K线,策略引擎根据预设规则生成买卖信号,订单执行通过券商API发送委托,风险控制监控持仓与资金曲线。期货自动化交易复用相同架构,只需替换合约代码与保证金计算逻辑。

行情数据接入

免费数据源可选AKShare、Tushare,付费可选Wind、聚宽。股票与期货的tick数据、分钟线、日线均需标准化为DataFrame格式。以下代码获取股票日线数据并计算20日均线:

如何用Python实现股票自动化交易


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接口,通过vnpythosttraderapi封装。


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)

回测与实盘部署

股票自动化回测用backtradervectorbt。期货回测需加入滑点与手续费。回测夏普比率大于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连接状态。