当前位置: 首页 > news >正文

量化研究--高频日内网格T0策略研究

量化研究--高频日内网格T0策略研究

文章声明:本内容为个人的业余研究,和任何单位,机构没有关系,文章出现的股票代码,全部只是测试例子,不做投资参考,投资有风险,代码学习使用,不做商业用途

我写了800多行完成了这个框架,后面就只需要把T0算法放入模块就可以很方便

图片

图片

图片

这个框架是我专门研究的高频T0模块,支持自定义算法交易,支持自定义函数,详细的教程

量化研究--高频日内网格T0策略研究https://mp.weixin.qq.com/s/DfnisJCXXs7cuds-lJRadQ

图片

先看一下这个模块的原理,在看怎么样设置实盘,策略的模块的配置参数

图片

策略的算法

图片

策略的原理

一、策略原理深度分析

这是一个基于价格百分比波动来触发交易的条件单式网格策略。它不同于传统的、在固定价位设置无数网格线的网格策略,它只在特定的条件(涨跌幅)被触发时,才会建议进行一次买卖操作。

其核心逻辑可以概括为:

  1. 确定一个基准价格(base_price:这是计算当前涨跌幅的锚点。策略会非常智能地根据历史交易记录来确定这个价格,这是该策略的关键所在。

  2. 计算当前相对于基准价的涨跌幅(zdfzdf = (当前价 - 基准价) / 基准价 * 100

  3. 根据涨跌幅与阈值的比较,发出交易信号

    • 卖出信号(return 'sell':当 zdf >= x1 (例如 0.8%) 时。

    • 买入信号(return 'buy':当 zdf <= x2 (例如 -1%) 时。

    • 无信号(return '':当 zdf 介于 x2 和 x1 之间时。

基准价(base_price)的确定逻辑(策略的灵魂):

这是该策略最精妙的部分,它决定了策略是“一次性”还是“可循环”的。代码中的 if self.log.shape[0]>0 分支详细处理了这一点:

  1. 首次运行(无任何历史日志记录)

    • 检查是否有该股票的买入订单(check_buy_order。这可能是系统里挂的限价单。

    • 如果有,则以订单价格作为 base_price。这意味着策略会追踪你这个挂单的成本。

    • 如果没有,则使用股票的昨日收盘价(lastClose 作为 base_price

  2. 非首次运行(已有该策略的历史交易日志)

    • 它会从日志(log)中筛选出同名策略对同一只股票的操作记录。

    • 如果找到记录:则取最近一次操作的触发价格(pre_price 作为新的基准价。这是策略能够循环运作的关键。例如,第一次基准价是10元,涨到10.08元(+0.8%)卖出后,下一次的基准价就变成了10.08元。如果价格又从10.08元跌到9.98元(约-1%),就会触发买入。

    • 如果没找到记录(例如是另一只股票):则逻辑与“首次运行”相同,检查订单或使用昨日收盘价。

简单比喻:这个策略像一个会自动重置起跑线的运动员。每次到达终点(触发交易)后,它就把新的起点(基准价)设在上一次终点的地方,然后开始新一轮的奔跑(监测涨跌幅)。

二、策略特点

  1. 高频与分时:参数 x1 和 x2 设置得很小(0.8% 和 -1%),旨在捕捉盘中分时图上的微小波动,符合“高频”和“分时”的特性。适合波动较大、交易活跃的标的。

  2. 条件单式(非连续网格):它不像传统网格那样布满买入卖出线,而是在一个动态移动的基准点上下设置一个“买入条件单”和一个“卖出条件单”。只有条件满足时才触发,每次只操作一次。

  3. 动态基准调整:其核心特点是基准价会根据上一次交易成果动态调整,这使得策略能适应价格的趋势性移动,避免在单边上涨或下跌市场中迅速失效。

  4. 依赖订单状态:策略与订单系统(check_buy_order)有耦合,说明它可能被设计为与一个实际的交易执行系统协同工作,不仅可以处理已成交的订单,还能处理挂单。

  5. 风险控制

    • 优点:由于基准价动态上移,在上涨趋势中,卖出价会不断抬高,能锁定利润。

    • 缺点:在下跌趋势中,买入价也会不断下移,虽然每次买入的成本都比前一次低,但如果遇到长期阴跌,会导致持续买入而被套较深。参数设置中的 “保留底仓” 和 “持有值” 就是为了控制这个风险,限制买入的总金额。

  6. 虚拟单功能:参数中“是否生成买入/卖出虚拟单子”表明,该策略可能主要用于模拟或信号生成,真正的下单操作由其他资金管理模块处理。

三、策略参数设置解析

{    "函数名称": "conditional_single_time_sharing_grid(name='固定高频分时网格',x1=0.8,x2=-1)",    "是否开启": "是",    "资金模型": "金额",    "卖出值": 200,    "买入值": 200,    "持有值": 600,    "保留底仓": 0,    "是否生成买入虚拟单子": "是",    "是否生成卖出虚拟单子": "否"}
  • x1=0.8, x2=-1:策略的核心参数,定义了网格的宽度。卖出阈值(0.8%)小于买入阈值(1%)的绝对值,这种不对称设置可能是为了在震荡中略微赚取差价(高卖低买),并给下跌留出更多空间。

  • 资金模型:金额:意味着接下来的值都是固定金额,而不是股票数量。

  • 卖出值:200:每次触发卖出信号时,卖出200元市值的股票。

  • 买入值:200:每次触发买入信号时,买入200元市值的股票。

  • 持有值:600:该策略对这只股票的目标最大持仓市值是600元。这是一个重要的风险控制参数。

  • 保留底仓:0:当策略需要卖出时,允许全部卖出,不保留底仓。如果设置为100,那么即使触发卖出,也会至少保留100元市值的股票不动。

  • 是否生成买入/卖出虚拟单子:这 likely 是一个模拟盘或信号测试功能。"生成买入虚拟单子"为“是”,意味着当发出 buy 信号时,系统会记录一个虚拟的买入订单,以便后续计算基准价。“卖出虚拟单子”为“否”,可能意味着卖出操作会直接调用真实交易接口或另一种日志方式。

策略的实盘设置,我没有开启的模块不要动,我在测试加入其他的控制算法,设置账户

图片

设置记录文件路径,这个路径可以自己随便建立一个excel表输入路径就可以

图片

建议和我的统一设置西蒙斯高频日内算法交易框架5.xlsx

图片

设置股票池,建议先自定义运行,不要选择持股,持股会加载账户的全部持股分析

图片

设置自定义股票,名字,股票代码一一对应

图片

开启算法参数,其他的模块先不动,我明天给策略的运行图

图片

设置网格参数x1,上涨卖出单元格,x2下跌买入单元格

图片

设置交易金额,可以保留底仓

图片

点击运行测试一下

图片

没有问题挂模型交易就可以

图片

点击运行就可以

图片

日志输出

图片

交易记录

图片

策略日志不要随便情况文件里面保存的记录数据

图片

下单的结果

图片

策略的委托

图片

自定义因子计算框架


class user_def_trader_func:def __init__(self,c,stock='512480.SH',tick='',hist='',other_data=''):'''自定义交易函数'''self.tick=tickself.hist=histself.other_data=other_dataself.log=pd.read_excel(r'{}'.format(c.path))self.trader_date=str(datetime.now())[:10]self.now_date=datetime.now()self.stock=stockif self.log.shape[0]>0:self.log=self.log[['证券代码','模块名称','交易日','触发时间','交易类型','交易数量','触发价格','投资备注','交易状态']]self.log=self.log.sort_values(by='触发时间',ascending=True)self.log=self.log[self.log['交易日']==self.trader_date]else:self.log=pd.DataFrame()self.c=cdef conditional_single_time_sharing_grid(self,name='固定高频分时网格',x1=0.8,x2=-1):tick=self.histstock=self.stockbase_price=tick['lastClose'].tolist()[-1]price=tick['lastPrice'].tolist()[-1]close_list=tick['lastPrice'].tolist()if self.log.shape[0]>0:self.log['证券代码']=self.log['证券代码'].astype(str)log=self.log[self.log['模块名称']==name]log=log[log['证券代码']==stock]if log.shape[0]>0:pre_price=log['触发价格'].tolist()[-1]zdf=((price-pre_price)/pre_price)*100else:order_stats,order_price=check_buy_order(self.c,stock=stock)if order_stats==True:base_price=order_priceelse:base_price=base_pricezdf=((price-base_price)/base_price)*100else:order_stats,order_price=check_buy_order(self.c,stock=stock)if order_stats==True:base_price=order_priceelse:base_price=base_pricezdf=((price-base_price)/base_price)*100if zdf>=x1:print('{} 模块{} 卖出{}  目前涨跌幅{} 大于目前标涨跌幅{} '.format(self.now_date,name,stock,zdf,x1))return 'sell'elif zdf<=x2:print('{} 模块{} 买入{}  目前涨跌幅{} 小于目前标涨跌幅{} '.format(self.now_date,name,stock,zdf,x2))return 'buy'else:print('{} 模块{} 不符合交易{}  目前涨跌幅{} 在{}到{}期间 '.format(self.now_date,name,stock,zdf,x2,x1))return ''def symmetric_grid_trading(self,name='对称高频分时网格',x1=0.8,x2=-1):'''对称高频分时网格'''tick=self.histstock=self.stockbase_price=tick['lastClose'].tolist()[-1]price=tick['lastPrice'].tolist()[-1]close_list=tick['lastPrice'].tolist()if self.log.shape[0]>0:self.log['证券代码']=self.log['证券代码'].astype(str)log=self.log[self.log['模块名称']==name]log=log[log['证券代码']==stock]if log.shape[0]>0:pre_price=log['触发价格'].tolist()[-1]zdf=((price-pre_price)/pre_price)*100shift_trader_type=log['交易类型'].tolist()[-1]else:order_stats,order_price=check_buy_order(self.c,stock=stock)if order_stats==True:base_price=order_priceelse:base_price=base_pricezdf=((price-base_price)/base_price)*100shift_trader_type=''else:order_stats,order_price=check_buy_order(self.c,stock=stock)if order_stats==True:base_price=order_priceelse:base_price=base_pricezdf=((price-base_price)/base_price)*100shift_trader_type=''if zdf>=x1 and shift_trader_type=='buy':print('{} 上一笔买入模块{} 卖出{}  目前涨跌幅{} 大于目前标涨跌幅{} '.format(self.now_date,name,stock,zdf,x1))return 'sell'elif zdf<=x2 and shift_trader_type=='sell':print('{}上一笔卖出 模块{} 买入{}  目前涨跌幅{} 小于目前标涨跌幅{} '.format(self.now_date,name,stock,zdf,x2))return 'buy'if zdf>=x1 :print('{}上一笔没有买入委托 模块{} 卖出{}  目前涨跌幅{} 大于目前标涨跌幅{} '.format(self.now_date,name,stock,zdf,x1))return 'sell'elif zdf<=x2 :print('{} 上一笔没有卖出委托模块{} 买入{}  目前涨跌幅{} 小于目前标涨跌幅{} '.format(self.now_date,name,stock,zdf,x2))return 'buy'else:print('{} 模块{} 不符合交易{}  目前涨跌幅{} 在{}到{}期间 '.format(self.now_date,name,stock,zdf,x2,x1))return ''def sell_on_the_rally(self,name='冲高回落卖出',x1=3,x2=-1):'''冲高回落卖出x1 冲高启动计算最低涨跌幅x2 回落涨跌幅'''stock=self.stocktick=self.histbase_price=tick['lastClose'].tolist()[-1]stock=self.stockif self.log.shape[0]>0:self.log['证券代码']=self.log['证券代码'].astype(str)log=self.log[self.log['模块名称']==name]log=log[log['证券代码']==stock]if log.shape[0]>0:pre_price=log['触发价格'].tolist()[-1]#触发时间shift_date=log['触发时间'].tolist()[-1]shift_date=str(shift_date).split('.')[0].replace('-','').replace(' ','').replace(':','')shift_date=int(shift_date)tick=tick[tick['date_1']>=shift_date]close_list=tick['lastPrice'].tolist()price=close_list[-1]#最大值max_value=max(close_list)else:close_list=tick['lastPrice'].tolist()price=close_list[-1]order_stats,order_price=check_buy_order(self.c,stock=stock)if order_stats==True:base_price=order_priceelse:base_price=base_pricepre_price=base_price#最大值max_value=max(close_list)else:close_list=tick['lastPrice'].tolist()price=close_list[-1]order_stats,order_price=check_buy_order(self.c,stock=stock)if order_stats==True:base_price=order_priceelse:base_price=base_pricepre_price=base_price#最大值max_value=max(close_list)#最大涨跌幅max_zdf=((max_value-pre_price)/pre_price)*100#回落的涨跌幅last_zdf=((price-max_value)/max_value)*100if max_zdf>=x1 and last_zdf<=x2:print('{} {} 冲高{} 大于{} 回落{}大于{} 卖出'.format(stock,name,max_zdf,x1,last_zdf,x2))return 'sell'else:print('{} {} 冲高{} {} 回落{} {} 等待卖出'.format(stock,name,max_zdf,x1,last_zdf,x2))return ''


文章转载自:

http://nBtXQRVZ.knsmh.cn
http://Ciw11MNu.knsmh.cn
http://Gxjm9GM2.knsmh.cn
http://u0dCYAUa.knsmh.cn
http://8hYUk8G5.knsmh.cn
http://bXlMcDWG.knsmh.cn
http://sc73rAxv.knsmh.cn
http://oYCIXKJ5.knsmh.cn
http://hrDpTbPa.knsmh.cn
http://1SVWpNsi.knsmh.cn
http://WC6gemMN.knsmh.cn
http://Z6k1uy8U.knsmh.cn
http://OxhU5WaO.knsmh.cn
http://dZANvu3i.knsmh.cn
http://UWT4rOWD.knsmh.cn
http://qSySyEcd.knsmh.cn
http://m3tR14WO.knsmh.cn
http://5uT7GMfQ.knsmh.cn
http://XkAsKY5v.knsmh.cn
http://CGXDHBEa.knsmh.cn
http://rmCYPO9h.knsmh.cn
http://VWo2pL6W.knsmh.cn
http://UPKuAFXx.knsmh.cn
http://kgphAXTg.knsmh.cn
http://qvLqdI0Q.knsmh.cn
http://GjGdOUP7.knsmh.cn
http://SV4NXwRb.knsmh.cn
http://S5jUMDqV.knsmh.cn
http://77hkcKkU.knsmh.cn
http://CvCRJilP.knsmh.cn
http://www.dtcms.com/a/386884.html

相关文章:

  • [Dify] 自动摘要与精炼:构建内容浓缩型工作流的实践指南
  • Windows安装mamba最佳实践(WSL ubuntu丝滑版)
  • 黑马头条_SpringCloud项目阶段一:环境搭建(Mac版本)
  • Java 设计模式全景解析
  • 【Python】OS模块操作目录
  • 深度学习基本模块:LSTM 长短期记忆网络
  • 初始化Vue3 项目
  • 耕地质量评价
  • MeloTTS安装实践
  • 国产化芯片ZCC3790--同步升降压控制器的全新选择, 替代LT3790
  • LeetCode 977.有序数组的平方
  • 佳易王个体诊所中西医电子处方管理系统软件教程详解:开方的时候可一键导入配方模板,自由添加模板
  • C#实现WGS-84到西安80坐标系转换的完整指南
  • rabbitmq面试题总结
  • 【Java初学基础】⭐Object()顶级父类与它的重要方法equals()
  • C语言初尝试——洛谷
  • Kaleidoscope for Mac:Mac 平台文件与图像差异对比的终极工具
  • LeetCode 刷题【80. 删除有序数组中的重复项 II】
  • 淘宝扭蛋机小程序系统开发:引领电商娱乐化潮流
  • 【车载audio开发】【基础概念2】【Usage、ContentType、Flags、SessionId之间的关系】
  • 【Day 52 】Linux-Jenkins
  • 向内核社区提交补丁
  • 【Java-常用类】
  • 在线教程丨ACL机器翻译大赛30个语种摘冠,腾讯Hunyuan-MT-7B支持33种语言翻译
  • 006 Rust基本数据类型
  • docker配置代理加速
  • 基于MATLAB的视频动态目标跟踪检测实现方案
  • AirPods Pro 3正式发布:全方位升级​
  • PyTorch生成式人工智能(29)——基于Transformer生成音乐
  • 《如龙8外传》共五章:漂流记、老人与海、金银岛等!