求解器¶
求解器是一种高性能算法模块,专门用于在极低延迟环境下进行快速最优决策、资源分配或路径规划。这类组件通常集成在策略引擎、风险控制系统或资源分配系统中,能够在微秒级别内计算出最优解决方案。
1. 订单分配求解器 (Order Allocation Solver)
该求解器处理单笔目标仓位如何在多个交易渠道、合约品种或账户间进行最优分配的问题。
核心输入参数:
- 目标买卖数量
- 各交易渠道的市场深度数据
- 滑点成本模型
- 交易手续费结构
- 延迟和成交率数据
输出结果:
- 精确分配比例(如 "Binance 30%,OKX 50%,Bybit 20%")
常用算法实现:
- 贪心最优价格分配
- 线性规划(LP)
- 二次规划(QP)
- 基于深度预测的最优执行
应用场景:
- 多平台套利策略(三角套利、期现套利、永续合约套利)
- TWAP/VWAP执行优化
- 多头空头组合再平衡
#include
#include
#include
#include
class OrderAllocationSolver {
private:
static constexpr int MAX_EXCHANGES = 8;
static constexpr double EPSILON = 1e-9;
public:
struct ExchangeData {
double best_bid;
double best_ask;
double bid_volume;
double ask_volume;
double fee_rate;
double latency_us;
double fill_ratio;
};
struct AllocationResult {
std::array weights;
double total_cost;
int num_active_exchanges;
};
AllocationResult solve(const std::vector& exchanges, double target_quantity,
bool is_buy) {
AllocationResult result = {};
// 预计算有效交易所
std::array valid_indices;
int valid_count = 0;
for (int i = 0; i < exchanges.size() && i < MAX_EXCHANGES; ++i) {
if (exchanges[i].fill_ratio > EPSILON) {
valid_indices[valid_count++] = i;
}
}
if (valid_count == 0) {
return result;
}
// 按最优价格排序(买入按ask升序,卖出按bid降序)
std::array sorted_indices;
for (int i = 0; i < valid_count; ++i) {
sorted_indices[i] = valid_indices[i];
}
std::sort(sorted_indices, sorted_indices + valid_count, [&](int a, int b) {
if (is_buy) {
return exchanges[a].best_ask < exchanges[b].best_ask;
} else {
return exchanges[a].best_bid > exchanges[b].best_bid;
}
});
// 贪心分配算法
double remaining_quantity = target_quantity;
double total_cost = 0.0;
int active_exchanges = 0;
for (int i = 0; i < valid_count && remaining_quantity > EPSILON; ++i) {
int idx = sorted_indices[i];
const auto& exch = exchanges[idx];
double available_volume = is_buy ? exch.ask_volume : exch.bid_volume;
double price = is_buy ? exch.best_ask : exch.best_bid;
double allocation = std::min(remaining_quantity, available_volume);
double weight = allocation / target_quantity;
result.weights[idx] = weight;
total_cost += allocation * price * (1.0 + exch.fee_rate);
remaining_quantity -= allocation;
active_exchanges++;
}
result.total_cost = total_cost;
result.num_active_exchanges = active_exchanges;
return result;
}
};
2. 最优执行求解器 (Optimal Execution Solver)
该求解器专注于订单的时间维度分配策略,确定分时下单节奏和等待时机。
核心功能:
- 市场冲击成本建模
- 随机抖动风险控制
- 盘口结构预测
- 信息泄露风险评估
主要算法:
- Almgren-Chriss模型
- 动态规划方法
- 强化学习执行器(少数团队)
应用领域:
- 高频做市策略的对冲操作
- 大额订单执行(如再平衡/清仓)
- 仓位建仓/平仓的执行时序控制
#include
#include
#include
class OptimalExecutionSolver {
private:
static constexpr int MAX_SLICES = 100;
static constexpr double EPSILON = 1e-9;
public:
struct MarketState {
double current_price;
double volatility;
double bid_ask_spread;
double volume_profile;
double market_impact_factor;
};
struct ExecutionSlice {
double time_to_execute;
double quantity;
double expected_cost;
};
struct ExecutionPlan {
std::array slices;
int slice_count;
double total_cost;
};
ExecutionPlan solve(const MarketState& market_state, double total_quantity,
double execution_time, double risk_aversion) {
ExecutionPlan plan = {};
// Almgren-Chriss模型实现
double gamma = market_state.market_impact_factor;
double sigma = market_state.volatility;
double spread = market_state.bid_ask_spread;
// 计算最优时间分割
int slices = std::min(static_cast(execution_time * 1000), MAX_SLICES);
slices = std::max(slices, 1);
double dt = execution_time / slices;
double sqrt_dt = std::sqrt(dt);
// 使用动态规划计算最优执行策略
double remaining_quantity = total_quantity;
double total_cost = 0.0;
for (int i = 0; i < slices; ++i) {
// 计算当前slice的最优执行量
double time_remaining = execution_time - i * dt;
double optimal_rate = remaining_quantity / time_remaining;
// 考虑风险厌恶的调整
double adjustment = risk_aversion * sigma * sqrt_dt;
double execution_rate = optimal_rate - adjustment;
execution_rate =
std::max(execution_rate, remaining_quantity / (slices - i));
execution_rate = std::min(execution_rate, remaining_quantity);
double slice_quantity = execution_rate * dt;
// 计算执行成本(包含市场冲击)
double market_impact = gamma * std::abs(slice_quantity) / time_remaining;
double execution_cost = slice_quantity * market_state.current_price *
(1.0 + market_impact + spread / 2.0);
plan.slices[i].time_to_execute = (i + 1) * dt;
plan.slices[i].quantity = slice_quantity;
plan.slices[i].expected_cost = execution_cost;
remaining_quantity -= slice_quantity;
total_cost += execution_cost;
if (remaining_quantity < EPSILON) {
plan.slice_count = i + 1;
break;
}
}
plan.total_cost = total_cost;
if (plan.slice_count == 0) {
plan.slice_count = slices;
}
return plan;
}
};
3. 风控约束求解器 (Risk Constraint Solver)
该求解器在多重限制条件下寻找最佳可行解,处理各种风险约束。
约束类型:
- 最大头寸限制
- 交易所风控约束(如仓位增速)
- Delta/Gamma/资金使用限制
- 多策略资金共享分配
主要方法:
- 二次规划(QP)
- 内点法/障碍法
- 贪心+启发式算法(为降低延迟)
应用场景:
- 多策略投资组合管理
- 高频做市团队资金动态分配
- 期现对冲套利的实时资金约束
#include
#include
#include
#include
class RiskConstraintSolver {
private:
static constexpr int MAX_STRATEGIES = 16;
static constexpr double EPSILON = 1e-9;
public:
struct StrategyConstraints {
double min_allocation;
double max_allocation;
double risk_limit;
double correlation_with_others;
double expected_return;
};
struct PortfolioResult {
std::array allocations;
double total_risk;
double expected_return;
int active_strategies;
};
PortfolioResult solve(const std::vector& strategies, double total_capital,
double max_portfolio_risk) {
PortfolioResult result = {};
// 初始化分配
std::array temp_allocations = {};
int strategy_count =
std::min(static_cast(strategies.size()), MAX_STRATEGIES);
// 首先满足最小分配要求
double remaining_capital = total_capital;
for (int i = 0; i < strategy_count; ++i) {
temp_allocations[i] = strategies[i].min_allocation;
remaining_capital -= strategies[i].min_allocation;
}
if (remaining_capital < 0) {
// 如果最小分配超出总资本,按比例缩减
double scale_factor = total_capital / (total_capital - remaining_capital);
for (int i = 0; i < strategy_count; ++i) {
temp_allocations[i] *= scale_factor;
}
remaining_capital = 0;
}
// 按预期收益排序,优先分配给高收益策略
std::array sorted_indices;
for (int i = 0; i < strategy_count; ++i) {
sorted_indices[i] = i;
}
std::sort(
sorted_indices, sorted_indices + strategy_count, [&](int a, int b) {
return strategies[a].expected_return > strategies[b].expected_return;
});
// 分配剩余资本
for (int i = 0; i < strategy_count && remaining_capital > EPSILON; ++i) {
int idx = sorted_indices[i];
double additional_allocation =
std::min(remaining_capital,
strategies[idx].max_allocation - temp_allocations[idx]);
temp_allocations[idx] += additional_allocation;
remaining_capital -= additional_allocation;
}
// 风险约束检查和调整
double portfolio_risk =
calculate_portfolio_risk(strategies, temp_allocations, strategy_count);
if (portfolio_risk > max_portfolio_risk) {
// 按风险贡献比例缩减分配
double risk_reduction_factor = max_portfolio_risk / portfolio_risk;
for (int i = 0; i < strategy_count; ++i) {
temp_allocations[i] *= risk_reduction_factor;
}
}
// 复制结果并计算统计信息
int active_count = 0;
double total_risk = 0.0;
double total_return = 0.0;
for (int i = 0; i < strategy_count; ++i) {
result.allocations[i] = temp_allocations[i];
if (temp_allocations[i] > EPSILON) {
active_count++;
total_return += temp_allocations[i] * strategies[i].expected_return;
}
total_risk += temp_allocations[i] * strategies[i].risk_limit;
}
result.total_risk = total_risk;
result.expected_return = total_return;
result.active_strategies = active_count;
return result;
}
private:
double calculate_portfolio_risk(const std::vector& strategies,
const std::array& allocations, int count) {
double total_risk = 0.0;
for (int i = 0; i < count; ++i) {
total_risk += allocations[i] * strategies[i].risk_limit;
}
return total_risk;
}
};
4. 做市报价求解器 (Market-Making Quote Solver)
做市策略的核心组件,需要在微秒级别内计算出最优买卖报价。
输入参数:
- 基础公允价格估计
- 近期成交率
- 波动率水平
- 库存状态
- 竞争对手报价与价差
输出结果:
- 最优买卖报价
- 各档位挂单数量
主要实现方法:
- Avellaneda-Stoikov模型
- 多因子公允价格回归+优化
- QP优化(库存+价差惩罚)
- 强化学习(极少数团队,但不稳)
高频做市报价求解器核心流程:
- 计算中间价→公允价格,加入微观结构信号预测
- 添加库存惩罚项
- 添加风险惩罚项
- 求解最优报价点
#include
#include
#include
class MarketMakingQuoteSolver {
private:
static constexpr double EPSILON = 1e-9;
static constexpr double GAMMA = 0.1; // 风险厌恶系数
static constexpr double K = 1.5; // 市场流动性参数
static constexpr double SIGMA = 0.02; // 波动率
public:
struct MarketData {
double bid_price;
double ask_price;
double bid_volume;
double ask_volume;
double fair_price;
double volatility;
double inventory;
double max_inventory;
double time_to_close;
};
struct QuoteResult {
double bid_price;
double ask_price;
double bid_size;
double ask_size;
double spread;
double inventory_risk;
};
QuoteResult solve(const MarketData& market_data) {
QuoteResult result = {};
double current_price = market_data.fair_price;
double inventory = market_data.inventory;
double time_left = market_data.time_to_close;
double max_inv = market_data.max_inventory;
// Avellaneda-Stoikov模型计算
// 计算库存调整项
double inventory_factor = GAMMA * SIGMA * SIGMA * time_left * inventory;
// 计算最优价差
double optimal_spread = (2.0 / GAMMA) * std::log(1.0 + GAMMA / K);
// 应用库存惩罚调整
double inventory_adjustment = inventory_factor;
if (std::abs(inventory) > max_inv * 0.8) {
// 库存过高时增加惩罚
inventory_adjustment *= 2.0;
}
// 计算最终报价
double half_spread = optimal_spread / 2.0;
result.bid_price = current_price - half_spread - inventory_adjustment;
result.ask_price = current_price + half_spread + inventory_adjustment;
result.spread = result.ask_price - result.bid_price;
result.inventory_risk = std::abs(inventory) / max_inv;
// 计算挂单量(基于库存状态调整)
double base_size = 1.0; // 基础挂单量
double inventory_penalty = 1.0 - std::abs(inventory) / max_inv;
inventory_penalty = std::max(inventory_penalty, 0.1);
result.bid_size = base_size * inventory_penalty;
result.ask_size = base_size * inventory_penalty;
// 如果库存偏向买入,减少买挂单量,增加卖挂单量
if (inventory > 0) {
result.bid_size *= 0.8;
result.ask_size *= 1.2;
} else if (inventory < 0) {
result.bid_size *= 1.2;
result.ask_size *= 0.8;
}
return result;
}
// 实时更新公允价格估计
double update_fair_price(double current_price,
const std::array& recent_trades, int trade_count) {
if (trade_count == 0) {
return current_price;
}
// 简单的移动平均更新
double sum = 0.0;
int count = std::min(trade_count, 10);
for (int i = 0; i < count; ++i) {
sum += recent_trades[i];
}
double ma_price = sum / count;
// 结合当前价格和历史平均,使用指数平滑
return 0.3 * ma_price + 0.7 * current_price;
}
};