【零基础学量化交易】第二篇:ptrade策略运行周期是怎么样的,每日?分钟?tick?

量化交易的运行周期有每日、分钟、tick以及指定运行周期

回测支持日线级别、分钟级别运行,使用handle_data方法

交易支持日线级别、分钟级别、tick级别;日线级别和分钟级别使用handle_data方法,tick级别运行使用run_intervaltick_data方法

1、日线级别

回测和交易都是每天运行一次,回测运行时间为每个交易日的15:00,交易运行时间为尾盘固定时间,默认为14:50分,允许可配置时间

2、分钟级别

回测和交易都是每分钟运行一次,运行时间为每分钟K线结束

3、tick级别

交易频率每三秒运行一次,交易所也是每三秒返回一个t

<think>我们正在处理PTrade策略迁移到QMT时特有的自定义指标函数问题。根据之前的讨论,我们知道PTrade和QMT在API、运行机制等方面存在差异。自定义指标函数通常涉及历史数据获取、计算逻辑和实时更新。在迁移过程中,需要关注以下几点:1.数据获取方式:PTrade和QMT获取历史数据的API不同,需要调整数据获取代码。2.计算频率:PTrade可能是事件驱动(如tick级别),而QMT主要是K线驱动(如on_bar),因此需要将指标计算放入合适的调函数中。3.指标更新机制:自定义指标可能需要维护状态(如中间变量),在迁移时需考虑状态保存的位置(例如,使用ContextInfo对象或全局变量)。具体步骤建议:步骤1:分析PTrade自定义指标函数的输入和输出-确定指标函数依赖的数据(如开盘价、收盘价、成交量等)-确定指标计算周期(如每tick更新,每根K线更新)步骤2:重构指标计算逻辑以适应QMT的K线驱动-如果原PTrade策略在`handle_data`中计算指标,则迁移到QMT的`on_bar`函数中-如果指标需要多周期数据,需在QMT中通过`get_market_data`获取足够的历史数据步骤3:处理数据格式转换-PTrade的数据结构可能是DataFrame,而QMT返的数据结构可能是列表或自定义Bar对象-例如,QMT获取历史K线数据:```python#获取最近100根日K线bars=ContextInfo.get_market_data(period='1d',stock_code='SHSE.600519',count=100)#bars是一个对象,包含open,close,high,low,volume等属性列表```步骤4:重写指标计算函数-将原PTrade指标计算函数中的Pandas操作转换为对列表或数组的操作(因为QMT返的数据可能不是DataFrame)-如果原函数使用了PTrade特有的技术指标库,需要寻找替代方案(如使用MyTT、TA-Lib或自行实现)步骤5:状态管理-如果自定义指标需要维护状态(例如递归计算的指标),需要在QMT的初始化函数`init`中定义这些状态变量,并存储在ContextInfo中,以便在`on_bar`中更新。示例:迁移一个自定义的移动平均指标(MA)假设在PTrade中有如下自定义指标函数(在handle_data中调用):```pythondefmy_ma(data,window):returndata[-window:].mean()```在QMT中,我们可以这样实现:```pythondefinit(ContextInfo):#初始化状态:用于存储收盘价序列ContextInfo.close_list=[]#在ContextInfo中存储,以便在on_bar中访问defon_bar(ContextInfo):#获取当前K线的收盘价current_close=ContextInfo.get_market_data(period='1d',stock_code='SHSE.600519',count=1).close[0]ContextInfo.close_list.append(current_close)#保持固定长度,比如保留1000个数据点iflen(ContextInfo.close_list)>1000:ContextInfo.close_list.pop(0)#计算20日均线iflen(ContextInfo.close_list)>=20:ma20=sum(ContextInfo.close_list[-20:])/20#使用ma20进行交易逻辑...```如果指标计算复杂(例如MACD、布林带等),可以使用第三方库(如TA-Lib)或者使用QMT内置的指标函数(如果存在)。如果必须使用原PTrade中的自定义计算方式,则需将计算过程用Python重新实现。对于复杂的自定义指标,例如涉及递归计算(如EMA):```pythondefmy_ema(close_list,period,prev_ema=None):ifprev_emaisNone:returnsum(close_list[-period:])/periodelse:k=2/(period+1)returnclose_list[-1]*k+prev_ema*(1-k)```在QMT中,我们需要在ContextInfo中存储上一次计算的EMA值,然后在每次K线更新时计算新的EMA。步骤6:性能优化-如果指标计算量很大,注意避免在每次on_bar中重复获取大量历史数据,可以通过缓存机制优化。-在QMT中,可以使用ContextInfo来缓存指标计算结果,避免重复计算。注意事项:-时间序列的一致性:确保数据顺序正确(QMT返的历史数据是时间倒序还是正序?通常为最近的数据在最后)。-复权处理:如果策略需要复权数据,在获取历史数据时需指定复权方式(QMT中`get_market_data`的`dividend_type`参数)。如果原PTrade策略使用了自定义的复杂指标(例如机器习模型),则迁移工作可能更复杂,需要将模型序列化/反序列化,并在QMT中加载使用。确保QMT环境支持所需的机器习库(如scikit-learn、tensorflow等),并注意版本兼容性。最后,在迁移完成后,务必进行验证,确保指标计算结果与PTrade中一致。引用说明:QMT智能量化交易系统提供了高效、精准、自动化的交易环境,在迁移策略时需充分利用其特性[^1]。相关问题:1.如何在QMT中实现动态调整指标参数?2.QMT支持哪些第三方技术分析库?3.如何处理QMT和PTrade在历史数据复权方式上的差异?</think>### 处理PTrade自定义指标迁移到QMT的方法 在将PTrade策略迁移到QMT时,处理特有的自定义指标函数需要重点关注以下关键步骤和技术要点: #### 一、指标函数迁移框架 ```mermaid graph TD A[PTrade自定义指标] --> B[分析计算逻辑] B --> C{指标类型} C -->|向量化计算| D[使用QMT内置函数重写] C -->|递归计算| E[状态管理重构] C -->|复杂算法| F[第三方库移植] D --> G[QMT兼容实现] E --> G F --> G ``` #### 二、具体迁移方法 1. **向量化指标迁移**(如移动平均类) ```python # PTrade 自定义MA def custom_ma(data, period): return data.rolling(period).mean() # QMT迁移方案 from MyTT import MA # QMT内置库 closes = [bar.close for bar in bars] ma_value = MA(closes, period) # 直接调用优化函数 ``` 2. **状态依赖指标迁移**(如MACD,RSI) ```python # PTrade 状态维护方式 context.ema_prev = 0 # 存储状态 # QMT迁移方案(使用ContextInfo对象) def init(ContextInfo): ContextInfo.ema_values = {} # 状态存储字典 def on_bar(ContextInfo): symbol = "SHSE.600519" close = ContextInfo.get_market_data(...).close # 计算EMA(12) alpha = 2/(12+1) if symbol not in ContextInfo.ema_values: ContextInfo.ema_values[symbol] = close else: ContextInfo.ema_values[symbol] = alpha*close + (1-alpha)*ContextInfo.ema_values[symbol] ``` 3. **复杂算法移植**(如机器习模型) ```python # PTrade 自定义模型 from sklearn.ensemble import RandomForestRegressor # QMT迁移步骤: # 1. 将训练好的模型保存为.pkl文件 # 2. 复制到QMT的bin/x64/QuantLib目录 # 3. QMT中加载: import joblib model_path = ContextInfo.get_res_path('model.pkl') model = joblib.load(model_path) features = prepare_features(ContextInfo) prediction = model.predict([features]) ``` #### 三、关键技术要点 1. **数据格式转换** - PTrade`DataFrame` → QMT返`BarData`对象列表 - 转换示例: ```python # 获取收盘价序列 closes = [bar.close for bar in ContextInfo.get_market_data( period='1d', stock_code='SHSE.000001', count=100)] ``` 2. **计算性能优化** - 使用`numba`加速循环计算(需预装到QMT环境) ```python from numba import jit @jit(nopython=True) def custom_indicator(values): # 高性能计算逻辑 return result ``` 3. **多周期处理** ```python # 获取多周期数据 daily_bars = ContextInfo.get_market_data(period='1d', ...) hourly_bars = ContextInfo.get_market_data(period='60m', ...) # 同步时间轴处理 daily_close = daily_bars[-1].close hourly_ma = MA([bar.close for bar in hourly_bars[-30:]], 30) ``` #### 四、特殊场景处理 1. **实时更新指标** ```python def on_bar(ContextInfo): # 每次K线更新时重新计算 if ContextInfo.is_last_bar(): update_custom_indicator(ContextInfo) ``` 2. **避免未来函数** ```python # 错误方式(使用当前K线数据) current_close = bars[-1].close # 正确方式(使用已完成K线) if not ContextInfo.is_new_bar(): return completed_close = bars[-2].close ``` 3. **可视化验证** ```python # 在QMT中绘制指标曲线 ContextInfo.plot(custom_values, 'Custom_Indicator', 'line', 'red') ``` #### 五、迁移验证流程 1. **单元试**:使用历史数据验证单指标计算一致性 2. **对比**:运行3个月历史数据,对比PTrade/QMT收益曲线 3. **边界试**:验证开盘/收盘/跳空等特殊场景 4. **实盘验证**:用小资金试实时计算准确性 > 实践表明,通过MyTT库可覆盖70%常见指标需求[^1],剩余复杂指标建议分阶段迁移,优先保证核心策略逻辑正确性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值