返回列表 发布新帖

法码高频日内网格算法--3单边网格买入原理例子说明

21 1
发表于 前天 21:34 | 显示全部楼层 阅读模式

前面一个文章我们介绍了网格单边买入的一个原理

网格交易是一种基于价格波动的量化交易策略,核心思想是在设定价格区间内,将资金分成多份,每当价格下跌一定幅度(网格间距)时买入一份,价格上涨一定幅度时卖出一份,通过低买高卖赚取差价。

买入网格 是网格交易的单边部分,专注于在价格下跌时逐步建仓,等待未来价格上涨时卖出(可由另一函数实现)。该策略适用于震荡市场,能自动捕捉价格波动中的买入机会。

下面利用例子说明方便我们理解这个策略

为了更好地理解网格买入策略的原理和流程,我们通过一个具体的例子来模拟代码的执行过程。假设我们使用以下配置:

股票代码:000001(平安银行)

股票名称:平安银行

当前日期:2023-05-22(交易日)

下跌比例:-1%(即价格从基准下跌超过1%时触发买入)

交易模式:数量

下单值:100(每次买入100股)

账户情况:总资产充足,无持仓(首次运行)

记录文件路径:D:/grid_log.xlsx

初始状态昨日收盘价(基准价格)为 10.00 元。

当前时间 09:35:00,最新价 10.00 元,跌幅 0%,未触发买入。

模拟价格变动我们假设股价在当天逐步下跌,触发两次网格买入。

第一次触发(09:45)最新价:9.90 元

基准价格:初始为昨日收盘价 10.00 元(因为当日无交易日志)

跌幅计算:(9.90 - 10.00) / 10.00 * 100% = -1.00%

触发条件:-1.00% < -1%?注意:下跌比例设定为 -1,表示跌幅大于1%(即更负)。-1.00% 等于设定值,但代码条件为 last_zdf < down_ratio,若 down_ratio = -1,则 -1.00 < -1 为假(严格小于),因此不会触发。若要触发需跌幅超过1%,例如 -1.01%。所以调整一下:设最新价 9.89 元,跌幅 -1.10%。

重新计算:最新价 9.89 元,跌幅 -1.10%,满足 -1.10 < -1,触发买入。

代码执行步骤:

函数开始,读取参数:down_ratio = -1, trader_type = '数量', value = 100。

获取持仓:此时 position 为空,hold_list = [],av_amount_dict = {}。

检查交易日:是,获取股票池(包含 000001)。

遍历股票池,处理 000001:

获取当前日期时间:now_date = 20230522, date_time = 94500(假设09:45:00)。

读取交易日志:当日无记录,log 为空。

获取最新价 price = 9.89,并取基准价格 get_base_price 返回 10.00(昨日收盘)。

获取分笔行情:从 09:30:00 开始,得到 tick 数据,最新价 9.89。

计算涨跌幅:last_zdf = -1.10%。

判断触发:-1.10 < -1 → 触发。

根据交易模式计算数量:amount = 100。

检查买入条件:check_is_buy 检查资金等,通过。

执行买入委托:passorder 发送买入指令。

构造交易日志:trader_log 包含股票、价格、时间等。

首次循环标志 a.gd_buy 初始为0,所以不写入文件,仅打印“第一次循环运行买入不记录”,并将 a.gd_buy 设为1。

打印买入信息。

第一次买入后

基准价格更新:由于日志记录尚未写入,但下一次循环会使用最近一次交易价格作为基准。注意,虽然这次没有写入文件,但函数内部下次调用时,会读取日志文件(因为每次循环都会重新读取),因此这次未写入,下次读取时仍然没有这条记录,基准仍是昨收。但代码中若 log 有记录,则取最近交易价。由于首次未写入,下次基准仍为昨收,可能导致重复触发。这可能是设计上的考量,让首次运行不记录是为了避免重启时重复触发?实际策略中,基准应该实时更新,但这里通过 stats 标志和 last_time 来控制行情获取的起始时间,避免重复触发。我们继续模拟,假设第二次触发时,log 仍为空(因为未写入),但 last_time 在首次触发后已更新为 94500,所以获取 tick 时会从 94500 之后开始,避免重复触发同一价格点。

但价格继续下跌到新低时,基准仍为昨收,会再次触发,这符合网格下移逻辑吗?实际上网格策略每次买入后基准应该更新为买入价,但这里由于日志未写入,基准没有更新,会导致在同一个下跌波段中连续触发?让我们分析:第一次买入后,基准仍是昨收10.00,价格继续下跌到9.80,跌幅-2%,仍然大于1%,会再次触发。这相当于在同一个基准下多次触发,但每次触发价格更低,相当于网格间距为1%,但基准不更新。这取决于设计意图:如果基准不更新,那么每次下跌超过1%都会买入,直到价格反弹。这其实是一种“等跌幅”网格,但基准固定。而代码中的基准更新逻辑依赖于日志记录:如果日志有记录,则取最近交易价作为基准,这样就会动态下移。但由于首次循环不记录,导致第一次买入后基准未更新,后续可能继续以原基准触发。但第二次循环时,由于日志仍无记录,基准还是昨收,但 last_time 已经变成第一次交易时间,所以会从第一次之后开始监控,价格必须比第一次更低才能触发(因为tick数据从94500开始,最新价要低于第一次买入价才会触发新的跌幅计算)。假设第一次买入价9.89,基准10.00,跌幅-1.1%;之后价格继续跌到9.80,从94500之后的tick中最新价9.80,计算跌幅 (9.80-10.00)/10.00 = -2%,仍然大于1%,再次触发。但第二次触发时,基准仍未更新,因为日志无记录。这样会导致同一个波段内多次买入,类似于金字塔式建仓。实际上,如果基准不更新,每次跌幅超过1%就买入,那么只要价格持续下跌,就会连续买入,直到资金用完。这也可以是一种策略,但通常网格交易会更新基准以形成等间距网格。这里的代码逻辑结合了两种可能性:如果有日志则基准动态更新,否则基准固定。因此,首次循环不记录可能是一个特殊处理,避免重启程序时重复触发。我们暂且按此逻辑继续。

第二次触发(10:00)

最新价:9.80 元

基准价格:仍为昨收 10.00 元(因为日志仍无记录)

跌幅计算:-2.00%,满足 -2.00 < -1,触发。

计算数量:100 股。

检查买入条件:通过。

执行买入:发送委托。

构造交易日志:此时 a.gd_buy 已经为1(首次循环后设为1),所以会执行日志合并写入文件。

交易日志写入:将第一次和第二次的交易记录合并写入(注意第一次记录实际上在第一次触发时已构造并暂存于 log?代码中首次循环时 log 是空,触发后构造了 trader_log,但未与 log 合并,直接跳过了写入。第二次循环时,log 是从文件读取的,但文件还为空,所以 log 仍为空。然后第二次触发构造 trader_log,此时 a.gd_buy 非0,会执行 log = pd.concat([log, trader_log], ignore_index=True),但 log 为空,所以合并后只有第二次的记录。这导致第一次买入记录丢失。这似乎是一个 bug:第一次触发的交易没有被记录,但实际委托已经发出。这可能影响后续基准计算,因为日志中没有第一次买入价。后续第三次触发时,基准仍为昨收,会再次触发,但实际上第二次买入后价格已跌到9.80,基准仍为10.00,会导致连续触发。但委托已经执行,只是日志丢失。这可能是代码设计上的疏忽,需要根据实际意图调整。但作为例子,我们忽略此问题,假设日志正确记录了所有交易。

为了简化,我们假设首次循环后日志被正确记录(即去掉 a.gd_buy 判断),那么第二次触发时,基准将是第一次买入价9.89,从而形成动态网格。我们按理想情况重新模拟

理想情况(日志始终记录)

第一次触发:基准10.00,价格9.89,买入100股,记录日志,基准更新为9.89。

第二次触发:从第一次交易时间后开始监控,价格继续下跌到9.79(跌幅相对于新基准9.89为 -1.01%),再次触发买入100股,基准更新为9.79。

这样每次买入后基准下移,形成间距约1%的网格。

流程总结

下图展示了理想情况下的两次买入流程:

不懂的问我就可以

代码流程对应

初始化:读取配置,获取持仓(空),账户(有资金)。

检查股票池:包含000001。

第一次循环:

获取基准价10.00(昨收)。

获取tick数据,最新价9.89。

跌幅 -1.10% < -1%,触发。

计算数量100,买入。

构造日志记录(价格9.89,时间094500),写入文件。

第二次循环(仍处理同一只股票,但循环是逐股票,这里是同一股票的不同时间点?实际上函数是遍历股票池一次,不会自动循环等待,需要外部定时调用。所以第二次触发是在下一次调用该函数时发生,比如间隔一段时间后再次运行。所以第二次调用时,日志文件已有第一次记录):

读取日志,得到最近交易价9.89,基准更新为9.89。

获取tick数据(从第一次交易时间094500之后),最新价9.79。

跌幅 -1.01% < -1%,触发。

买入100股,记录日志。

通过这个例子,可以清晰地看到网格买入如何利用价格下跌分批建仓,并通过日志记录动态调整基准,实现自动化交易。

评论1

*******0079楼主
发表于 前天 23:38 | 显示全部楼层
管理员微信:fama_quants,不懂的问我就可以

回复

您需要登录后才可以回帖 登录 | 立即注册

主题

52

回帖

12

积分

0

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2026 迅投QMT社区 版权所有 All Rights Reserved. 京ICP备2025122616号-3
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表