免责声明本文基于个人使用体验与任何厂商无商业关系。内容仅供技术交流参考不构成投资建议。一、前言回测框架是量化策略开发的核心工具。虽然市面上有很多现成的回测框架但了解如何从零搭建一个回测系统能帮助我们更好地理解回测原理。今天分享一些从零搭建Python期货量化策略回测框架的方法和实践。二、回测框架核心组件1. 数据管理classDataManager:数据管理器def__init__(self,data_source):self.data_sourcedata_source self.data_cache{}defget_klines(self,symbol,interval,start_date,end_date):获取K线数据cache_keyf{symbol}_{interval}_{start_date}_{end_date}ifcache_keynotinself.data_cache:# 从数据源获取数据self.data_cache[cache_key]self.data_source.get_klines(symbol,interval,start_date,end_date)returnself.data_cache[cache_key]2. 账户管理classAccount:账户管理def__init__(self,initial_balance100000):self.initial_balanceinitial_balance self.balanceinitial_balance self.availableinitial_balance self.positions{}# {symbol: position}self.orders[]self.trades[]defupdate_position(self,symbol,quantity,price):更新持仓ifsymbolnotinself.positions:self.positions[symbol]0self.positions[symbol]quantity# 更新资金costquantity*price*10# 假设每手10吨margincost*0.10# 假设保证金率10%self.available-margindefclose_position(self,symbol,quantity,price):平仓ifsymbolinself.positions:self.positions[symbol]-quantity# 更新资金costquantity*price*10margincost*0.10self.availablemargin# 计算盈亏pnlself.calculate_pnl(symbol,quantity,price)self.balancepnldefcalculate_pnl(self,symbol,quantity,price):计算盈亏简化版# 实际需要记录开仓价格return0# 简化处理3. 订单管理classOrder:订单def__init__(self,symbol,direction,offset,quantity,price):self.symbolsymbol self.directiondirection# BUY or SELLself.offsetoffset# OPEN or CLOSEself.quantityquantity self.priceprice self.statusPENDING# PENDING, FILLED, CANCELLED4. 回测引擎classBacktestEngine:回测引擎def__init__(self,data_manager,account,strategy):self.data_managerdata_manager self.accountaccount self.strategystrategy self.current_timeNoneself.current_data{}defrun(self,symbol,start_date,end_date,interval300):运行回测# 获取数据klinesself.data_manager.get_klines(symbol,interval,start_date,end_date)# 遍历每个时间点foriinrange(len(klines)):self.current_timeklines.index[i]self.current_data[symbol]klines.iloc[:i1]# 更新策略signalself.strategy.on_bar(self.current_data[symbol])# 执行信号ifsignal:self.execute_signal(symbol,signal,klines.iloc[i][close])# 更新账户self.update_account(symbol,klines.iloc[i][close])defexecute_signal(self,symbol,signal,price):执行信号ifsignalBUY:ifsymbolnotinself.account.positionsorself.account.positions[symbol]0:orderOrder(symbol,BUY,OPEN,1,price)self.account.update_position(symbol,1,price)self.account.orders.append(order)elifsignalSELL:ifsymbolinself.account.positionsandself.account.positions[symbol]0:orderOrder(symbol,SELL,CLOSE,1,price)self.account.close_position(symbol,1,price)self.account.orders.append(order)defupdate_account(self,symbol,price):更新账户计算浮动盈亏# 简化处理pass5. 策略接口classStrategy:策略基类defon_bar(self,klines):K线更新回调raiseNotImplementedError三、使用TqSdk数据搭建回测框架fromtqsdkimportTqApi,TqAuthfromdatetimeimportdateclassTqSdkDataManager(DataManager):使用TqSdk的数据管理器def__init__(self):self.apiTqApi(authTqAuth(账户,密码))super().__init__(self)defget_klines(self,symbol,interval,start_date,end_date):获取K线数据klinesself.api.get_kline_serial(symbol,interval,5000)returnklines# 使用示例defsimple_strategy(klines):简单策略fromtqsdk.taimportMA ma5MA(klines,5)ma20MA(klines,20)iflen(ma5.ma)2orlen(ma20.ma)2:returnNoneifma5.ma.iloc[-2]ma20.ma.iloc[-2]andma5.ma.iloc[-1]ma20.ma.iloc[-1]:returnSELLelifma5.ma.iloc[-2]ma20.ma.iloc[-2]andma5.ma.iloc[-1]ma20.ma.iloc[-1]:returnBUYreturnNone# 运行回测data_managerTqSdkDataManager()accountAccount(initial_balance100000)strategyStrategy()strategy.on_barsimple_strategy engineBacktestEngine(data_manager,account,strategy)engine.run(SHFE.rb2510,date(2024,1,1),date(2025,12,31))四、总结从零搭建回测框架虽然复杂但能帮助我们更好地理解回测原理。核心组件数据管理获取和管理历史数据账户管理管理资金和持仓订单管理处理订单和成交回测引擎执行回测逻辑我目前主要使用TqSdk的回测功能因为已经封装得很好不需要自己搭建。但如果需要深度定制了解原理还是很有帮助的。这只是我个人的回测框架搭建思路每个人可以根据自己的需求调整。量化交易有风险回测只是验证手段不能保证实盘盈利。声明本文基于个人学习经验整理仅供技术交流参考不构成任何投资建议。文中提及的工具和方法请自行评估是否适合自己的需求。