量化交易技术简介

量化交易

  • 1. C++ 技术栈

高频交易和低延迟系统对 C++ 和 Linux 内核的要求极高,需要高效的代码执行、低延迟的通信机制、以及对操作系统底层的深入优化。以下是关键技术点:

1. C++ 技术栈

高频交易需要极致的性能优化,因此 C++ 代码需要低延迟、高吞吐,通常采用以下技术:
(1)高性能数据结构
• Lock-free 数据结构(无锁队列、环形缓冲区)
• 采用 std::atomic 和 内存屏障(memory barriers) 来避免锁竞争
• 典型库:boost::lockfree、folly::ProducerConsumerQueue
• 内存池(Memory Pool)
• 避免频繁 new/delete 造成的碎片化
• 使用 tcmalloc, jemalloc, 或 mimalloc
• 内存对齐(Cache Line Optimization)
• 避免 false sharing(伪共享):

struct alignas(64) OrderBook {
    int price;
    int volume;
};

• 确保结构体大小是 CPU Cache Line(一般 64 字节)的整数倍

(2)低延迟多线程优化
• 使用 std::atomic 代替 std::mutex
• 例如:

std::atomic<int> counter;
counter.fetch_add(1, std::memory_order_relaxed);
•	NUMA 亲和性(NUMA-aware threading)
•	使用 sched_setaffinity() 绑定线程到指定 CPU 核心:

cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(2, &cpuset);
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);

•	使用 epoll/io_uring 做事件驱动
•	低延迟 I/O 处理,而不是轮询(polling)
•	io_uring 比 epoll 更高效:
struct io_uring ring;
io_uring_queue_init(32, &ring, 0);

(3)SIMD 加速计算
• 使用 AVX, AVX-512, SSE 加速矩阵计算、数值计算:

#include 
__m256 v1 = _mm256_loadu_ps(arr1);
__m256 v2 = _mm256_loadu_ps(arr2);
__m256 result = _mm256_add_ps(v1, v2);
•	FFT(快速傅里叶变换)用于市场信号处理:
•	Intel MKL, FFTW, or CUDA FFT

(4)低延迟网络通信
• RDMA(远程直接内存访问)
• 直接绕过 CPU 访问远程服务器的内存
• 适用于 InfiniBand, RoCE (RDMA over Converged Ethernet)
• 用户态网络栈(DPDK, eBPF/XDP, VMA)
• DPDK(Data Plane Development Kit)绕过内核,直接访问网卡:

struct rte_mbuf *pkt;
pkt = rte_pktmbuf_alloc(mbuf_pool);
rte_eth_rx_burst(port_id, queue_id, &pkt, 1);
•	XDP (eXpress Data Path) 直接在网卡驱动中处理数据包:
int xdp_prog(struct xdp_md *ctx) {
    void *data = (void *)(long)ctx->data;
    return XDP_DROP;  // 丢弃数据包,减少延迟
}
•	零拷贝(Zero Copy)
•	使用 mmap() 和 sendfile() 避免不必要的 CPU 内存拷贝:
int fd = open("data.bin", O_RDONLY);
sendfile(sock_fd, fd, NULL, FILE_SIZE);
  1. Linux 内核优化

高频交易需要深入优化 Linux 内核,以降低系统抖动(jitter) 和 延迟。

(1)内核参数调优

调整 /etc/sysctl.conf:

# 禁用 Swap,防止内存交换影响延迟
vm.swappiness = 0

# 提高 TCP 处理能力
net.core.rmem_max = 26214400
net.core.wmem_max = 26214400
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216

# 关闭 Nagle 算法,降低 TCP 发送延迟
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_low_latency = 1

(2)CPU 亲和性 & 高精度定时
• 绑定进程到特定 CPU 核心

taskset -c 1 ./my_hft_app
•	提高定时器精度
echo 0 > /sys/devices/system/cpu/cpu*/cpuidle/state*/disable

(3)内核旁路
• eBPF/XDP:直接在内核态处理网络数据包
• AF_XDP:比 epoll 更快的用户态 Socket

(4)高精度时钟同步
• 使用 PTP(Precision Time Protocol)
• 确保市场数据时间戳尽可能精准

phc_ctl /dev/ptp0 get
•	使用 TSC(Time Stamp Counter)
static inline uint64_t rdtsc() {
    uint32_t lo, hi;
    asm volatile ("rdtsc" : "=a"(lo), "=d"(hi));
    return ((uint64_t)hi << 32) | lo;
}
  1. 开发高频交易系统的流程
    1. 数据采集
      • 使用 FPGA 或 DPDK 直接从交易所接收市场数据
      • 解析 FIX/ITCH/Binary 交易协议
    2. 行情处理
      • 用 无锁队列 维护订单簿
      • 计算 市场微观结构指标(order imbalance, spread)
    3. 交易策略
      • 使用 强化学习(RL)+ 统计套利
      • 用 AVX/SIMD 加速计算
    4. 低延迟订单执行
      • 采用 coalescing 方式批量下单
      • 发送数据时避免 syscall(使用 sendmmsg())
    5. 监控和优化
      • 记录 TSC 计算时延
      • 调优 Linux 内核,实现实时日志分析

总结

量化交易(特别是高频交易)要求极致的 C++ 性能优化 和 深入的 Linux 内核调优。涉及:
1. C++:无锁数据结构、SIMD、NUMA、RDMA、用户态网络栈
2. Linux:内核参数调优、eBPF/XDP、PTP 时间同步、CPU 亲和性
3. 网络:AF_XDP、RDMA、零拷贝、用户态协议栈

如果你想深入开发高频交易系统,建议你学习:
• 《Modern C++ Design》(高性能 C++ 设计)
• 《Linux Performance》(深入 Linux 调优)
• 《Financial Signal Processing》(量化金融信号处理)

你可能感兴趣的:(linux)