首页 > 帮助中心 > 技术支持

技术支持

量化交易策略模板:Python/JavaScript示例

流量次数: 作者:小编 发布时间:2025-03-20 18:20:33

一、Python策略模板(均值回归策略)

1. 策略逻辑

信号生成:当价格偏离20日均线超过2倍标准差时反向开仓


止盈止损:固定比例止盈(3%)、动态跟踪止损(1.5倍ATR)


python

复制

import pandas as pd

import numpy as np

from bitget_api import BitgetAPIClient  # 自定义API封装类


class MeanReversionStrategy:

    def __init__(self, api_key, secret_key):

        self.api = BitgetAPIClient(api_key, secret_key)

        self.symbol = "BTCUSDT"

        self.timeframe = "1d"

        

    def get_historical_data(self):

        """获取历史K线数据"""

        klines = self.api.get_klines(

            symbol=self.symbol, 

            timeframe=self.timeframe, 

            limit=100

        )

        df = pd.DataFrame(klines, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])

        df['close'] = df['close'].astype(float)

        return df


    def calculate_indicators(self, df):

        """计算技术指标"""

        df['ma20'] = df['close'].rolling(20).mean()

        df['std20'] = df['close'].rolling(20).std()

        df['upper_band'] = df['ma20'] + 2 * df['std20']

        df['lower_band'] = df['ma20'] - 2 * df['std20']

        return df


    def generate_signal(self, df):

        """生成交易信号"""

        latest = df.iloc[-1]

        # 做空信号:价格突破上轨

        if latest['close'] > latest['upper_band']:

            return 'sell'

        # 做多信号:价格跌破下轨

        elif latest['close'] < latest['lower_band']:

            return 'buy'

        else:

            return 'hold'


    def execute_trade(self, signal):

        """执行交易逻辑"""

        position = self.api.get_position(self.symbol)

        if signal == 'buy' and position <= 0:

            # 开多单,风险控制:仓位不超过总资金20%

            self.api.place_order(

                symbol=self.symbol,

                side='buy',

                amount=self.calculate_position_size(0.2),

                stop_loss=self.calculate_stop_loss('buy')

            )

        elif signal == 'sell' and position >= 0:

            # 开空单

            self.api.place_order(...)


    def run_strategy(self):

        """策略主循环"""

        while True:

            df = self.get_historical_data()

            df = self.calculate_indicators(df)

            signal = self.generate_signal(df)

            self.execute_trade(signal)

            time.sleep(60 * 60)  # 每小时运行一次


if __name__ == "__main__":

    strategy = MeanReversionStrategy(API_KEY, SECRET_KEY)

    strategy.run_strategy()

二、JavaScript策略模板(动量突破策略)

1. 策略逻辑

信号生成:当价格突破过去N日最高价时做多,跌破最低价做空


仓位管理:凯利公式动态计算仓位比例


javascript

复制

const BitgetAPI = require('bitget-api-nodejs');

const { KellyCriterion } = require('./risk-management');


class MomentumStrategy {

    constructor(apiKey, secretKey) {

        this.api = new BitgetAPI(apiKey, secretKey);

        this.symbol = 'ETHUSDT';

        this.lookbackPeriod = 14;

    }


    async getHistoricalHighLow() {

        const klines = await this.api.getKlines({

            symbol: this.symbol,

            timeframe: '1d',

            limit: this.lookbackPeriod

        });

        const highs = klines.map(k => parseFloat(k[2]));

        const lows = klines.map(k => parseFloat(k[3]));

        return {

            highestHigh: Math.max(...highs),

            lowestLow: Math.min(...lows)

        };

    }


    async checkBreakout() {

        const currentPrice = await this.api.getTicker(this.symbol);

        const { highestHigh, lowestLow } = await this.getHistoricalHighLow();

        

        if (currentPrice > highestHigh) {

            return 'long';

        } else if (currentPrice < lowestLow) {

            return 'short';

        }

        return 'no_signal';

    }


    async executeStrategy() {

        const signal = await this.checkBreakout();

        if (signal !== 'no_signal') {

            const accountBalance = await this.api.getBalance();

            const positionSize = KellyCriterion.calculate(

                winRate: 0.55,  // 历史胜率

                payoffRatio: 1.5 // 盈亏比

            ) * accountBalance;

            

            await this.api.placeOrder({

                symbol: this.symbol,

                side: signal,

                amount: positionSize,

                leverage: 3,  // 3倍杠杆

                stopLoss: signal === 'long' ? lowestLow : highestHigh

            });

        }

    }


    start() {

        setInterval(() => this.executeStrategy(), 3600000); // 每小时执行

    }

}

image.png

// 启动策略

const strategy = new MomentumStrategy(process.env.API_KEY, process.env.SECRET_KEY);

strategy.start();

三、策略核心模块分解

1. 数据获取层

python

复制

# Python示例:WebSocket实时数据订阅

import websockets


async def market_data_listener():

    async with websockets.connect(BITGET_WS_URL) as ws:

        await ws.send(subscribe_message)

        while True:

            data = await ws.recv()

            process_market_data(data)

2. 风险控制模块

javascript

复制

// JavaScript凯利公式计算

class KellyCriterion {

    static calculate(winRate, payoffRatio) {

        const b = payoffRatio;

        const p = winRate;

        const q = 1 - p;

        return (b * p - q) / b; // f* = (bp - q)/b

    }

}

3. 订单执行优化

智能路由:根据深度选择Maker/Taker订单类型


冰山委托:大额订单拆分隐藏


防抖机制:防止信号频繁触发


四、策略回测与实盘切换

1. 回测框架结构(Python)

python

复制

class BacktestEngine:

    def __init__(self, historical_data):

        self.data = historical_data

        self.equity_curve = []

        

    def run_backtest(self, strategy):

        for index, row in self.data.iterrows():

            signal = strategy.generate_signal(row)

            self.execute_signal(signal, row['close'])

            

    def calculate_metrics(self):

        # 计算夏普比率、最大回撤等

        ...

2. 实盘部署注意事项

使用独立服务器部署(推荐AWS/GCP)


启用日志监控(ELK Stack)


设置熔断机制(单日亏损>5%停止交易)


五、策略模板扩展方向

策略类型 特征 适用市场

套利策略 跨交易所价差捕捉 高流动性市场

做市策略 双边挂单赚取价差 低波动性市场

机器学习策略 LSTM/Transformer预测价格 大样本量市场

代码安全提示:


永远不要在代码中明文存储API密钥(使用环境变量或Vault服务)


对交易指令进行本地模拟测试后再接入实盘


定期审计策略逻辑防止参数过拟合


tags标签: