OTC交易所量化交易策略模板:快速上手指南(附实操步骤与代码示例)
为什么选择OTC交易所量化交易
OTC(场外)交易所作为数字资产交易的重要场景,具有
对于新手而言,通过标准化策略模板快速搭建量化交易系统,不仅能降低入门门槛,还能避免重复造轮子,聚焦策略逻辑优化,本文将以“Python+OTC API”为核心,提供从环境搭建到策略回测的全流程模板,助你1小时上手OTC量化交易。
OTC量化交易核心流程
OTC量化交易的本质是通过程序化执行预设规则,实现自动化交易盈利,核心流程可拆解为4步:
- 数据获取:从OTC交易所API获取实时报价(如BTC/USDT的买入/卖出价格、交易量);
- 策略逻辑:基于数据指标(如移动平均线、价格偏离度)生成交易信号(买入/卖出/持有);
- 风险控制:设置止盈止损、仓位管理规则,避免极端行情下的亏损;
- 交易执行:通过API向OTC交易所发送订单(限价单/市价单),并监控成交状态。
快速上手:OTC量化策略模板(Python版)
以下以“双均线交叉策略”为例(经典趋势跟踪策略,适合OTC中长线交易),提供完整代码模板和实操步骤。
环境准备
安装必要库:
pip install requests pandas numpy ccxt # ccxt:统一加密货币交易所API库
OTC交易所API配置
以某主流OTC交易所为例(需提前申请API Key,开启“交易”权限):
import ccxt
otc_exchange = ccxt.otc({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'enableRateLimit': True, # 启用频率限制,避免API被封
'options': {
'defaultType': 'spot', # OTC多为现货交易
},
})
# 测试API连接
try:
balance = otc_exchange.fetch_balance()
print("API连接成功,账户余额:", balance['USDT']['free'])
except Exception as e:
print("API连接失败:", e)
数据获取:获取OTC实时行情
OTC交易所通常提供“ticker”(最新行情)和“trades”(历史成交)数据,以下获取BTC/USDT的实时价格和K线数据(1小时周期):
import pandas as pd
# 获取实时行情(ticker)
ticker = otc_exchange.fetch_ticker('BTC/USDT')
current_price = ticker['last'] # 最新成交价
bid_price = ticker['bid'] # 买一价
ask_price = ticker['ask'] # 卖一价
print(f"当前价格:{current_price},买一:{bid_price},卖一:{ask_price}")
# 获取历史K线数据(1小时周期,最近100根)
klines = otc_exchange.fetch_ohlcv('BTC/USDT', timeframe='1h', limit=100)
df = pd.DataFrame(klines, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms') # 转换时间戳
df.set_index('timestamp', inplace=True)
print("最近3条K线:\n", df.tail(3))
策略逻辑:双均线交叉策略
规则:
- 当短期均线(MA10)上穿长期均线(MA30)时,买入信号;
- 当短期均线(MA10)下穿长期均线(MA30)时,卖出信号;
- 同时设置止盈(+5%)和止损(-3%)。
def ma_cross_strategy(df, short_window=10, long_window=30):
"""计算双均线交叉信号"""
df['ma_short'] = df['close'].rolling(window=short_window).mean() # 短期均线
df['ma_long'] = df['close'].rolling(window=long_window).mean() # 长期均线
df['signal'] = 0 # 0:持有,1:买入,-1:卖出
df.loc[df['ma_short'] > df['ma_long'], 'signal'] = 1 # 买入信号
df.loc[df['ma_short'] < df['ma_long'], 'signal'] = -1 # 卖出信号
return df
# 应用策略
df = ma_cross_strategy(df)
print("策略信号(最后5条):\n", df[['close', 'ma_short', 'ma_long', 'signal']].tail())
风险控制:止盈止损与仓位管理
def risk_management(position_size, entry_price, current_price, take_profit=0.05, stop_loss=0.03):
"""计算止盈止损价格和当前盈亏"""
tp_price = entry_price * (1 + take_profit) # 止盈价
sl_price = entry_price * (1 - stop_loss) # 止损价
current_pnl = (current_price - entry_price) / entry_price # 当前收益率
return tp_price, sl_price, current_pnl
# 示例:假设买入时价格为50000 USDT,仓位0.1 BTC
entry_price = 50000
position_size = 0.1
tp_price, sl_price, current_pnl = risk_management(position_size, entry_price, current_price)
print(f"止盈价:{tp_price},止损价:{sl_price},当前收益率:{current_pnl:.2%}")
交易执行:自动下单与订单监控
def place_order(side, amount, symbol='BTC/USDT', order_type='limit', price=None):
"""发送订单(限价单/市价单)"""
try:
if order_type == 'limit' and price is None:
raise ValueError("限价单需指定价格")
order = otc_exchange.create_order(
symbol=symbol,
type=order_type,
side=side,
amount=amount,
price=price,
)
print(f"订单发送成功:{order['id']},方向:{side},数量:{amount}")
return order
except Exception as e:
print("订单发送失败:", e)
return None
# 示例:买入0.1 BTC(市价单)
place_order(side='buy', amount=0.1, order_type='market')
# 示例:卖出0.1 BTC(限价单,价格为当前卖一价+1%)
limit_price = ask_price * 1.01
place_order(side='sell', amount=0.1, order_type='limit', price=limit_price)
回测:历史数据验证策略有效性
def backtest_strategy(df, initial_balance=10000):
"""回测策略并计算收益率"""
balance = initial_balance
position = 0 # 持仓数量
entry_price = 0
trades = []
for i in range(1, len(df)):
current_price = df['close'].iloc[i]
signal = df['signal'].iloc[i]
# 买入信号(无持仓时)
if signal == 1 and position == 0:
position = balance / current_price
balance = 0
entry_price = current_price
trades.append(('buy', current_price, position))
print(f"买入:价格={current_price},持仓={position}")
# 卖出信号(有持仓时)
elif signal == -1 and position > 0:
balance = position * current_price
trades.append(('sell', current_price, position))
print(f"卖出:价格={current_price},收益={(current_price - entry_price) / entry_price:.2%}")
position = 0
# 结束后清仓
if position > 0:
balance = position * df['close'].iloc[-1]
trades.append(('sell', df['close'].iloc[-1],