文章声明:本内容为个人的业余研究,和任何单位,机构没有关系,文章出现的股票代码,全部只是测试例子,不做投资参考,投资有风险,代码学习使用,不做商业用途
今天在把聚宽的摸狗策略迁移到ptrade,在加入我的理解,优化成我真正的动量实盘模型

我感觉在加入,止盈止损,趋势,大盘控制一下下回测就非常不错了


具体完善了高频T0的算法,包含了动态网格,对称网格,冲高回落,脉冲等模块,具体介绍动态网格策略的原理设计qmt代码
点击网页下载就可以http://14.103.193.242:9999/xms_quants.html
最后一个


这里先介绍一下怎么样使用,输入账户

输入交易记录的文件路径

选择是否开启仓位管理

选择是检测自定义股票池,还是直接检测持股交易

开启算法,设置买卖的设置

设置网格大小

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



注意时间要设置4,9,14实盘的时候

源代码我全部上传了知识星球下载就可以

不懂的问我就可以,网页的邀请码找我要就可以,备注邀请码,找我开户可以申请使用


一、 核心思想:建立一个“智能的自动高抛低吸系统”
您可以想象一个在波动的市场中不断自动工作的智能机器人。它的核心任务只有两个:价格跌到一定程度就买入,价格涨到一定程度就卖出。但这个机器人不是盲目地在一个固定价格区间内操作,而是会根据市场的最新情况和它自己之前的操作,动态地调整其判断的“基准”,从而使系统始终与市场保持同步,避免在单边行情中陷入被动。
这个策略就是这个“智能机器人”的大脑。
二、 策略原理解析:动态基准与条件触发
这个策略的原理可以分解为四个关键步骤:
1. 确立动态的“锚点价格”(基准价格)
这是整个策略最核心、最“动态”的部分。普通网格策略的锚点可能是固定的成本价或初始价,但本策略的锚点会根据实际情况智能调整,主要有以下三种情况:
- 情况一:优先以“最近成交价”为锚点
- 逻辑:如果当天在这个策略下已经成功进行了交易(无论是买还是卖),那么策略会认为市场已经认可了这个新的价格水平。此时,它会将锚点立即更新为最后一次交易的成交价。
- 类比:好比你在一条河里划船,你不再关心最初的出发岸边有多远,而是把你上一次停靠的码头作为新的起点,来计算你接下来是向上游还是下游划。
- 目的:实现网格的“移动”。这样能及时锁定之前的利润或调整成本,让策略始终基于最新的市场状态做决策。
- 情况二:以“未成交的买单价格”为锚点
- 逻辑:如果策略之前发出了买入指令但尚未成交(即挂单状态),说明系统已经认为价格跌到了值得买入的区域。此时,它会将锚点切换到这个挂单的价格。
- 类比:你告诉经纪人:“当苹果价格跌到5元时给我买一箱”。在订单未成交前,你的大脑会不自觉地以“5元”这个预期价格作为新的心理基准,来判断市场后续的波动。
- 目的:保持策略的逻辑一致性。避免在挂单期间,因价格小幅波动而触发矛盾的信号。
- 情况三:以“昨日收盘价”为初始锚点
- 逻辑:如果当天还没有任何操作和挂单,策略需要一个起点。这个起点就是前一个交易日的收盘价。
- 类比:这是你开始一天交易前,在航海图上确定的那个初始坐标。
- 目的:为当日的首次交易提供客观、合理的参考依据。
2. 计算实时的“偏离度”
确定了动态锚点价格后,策略会实时计算当前市场价格相对于这个锚点的涨跌幅度。
偏离度 = (当前价 - 锚点价格) / 锚点价格 × 100%
这个“偏离度”就是判断是否采取行动的尺子。
3. 设置触发交易的“阈值”
策略预设了两个关键阈值:
- 上方阈值 (x1):一个正数,例如
<span leaf="">0.8</span>,代表 <span leaf="">+0.8%</span>。
- 下方阈值 (x2):一个负数,例如
<span leaf="">-1.0</span>,代表 <span leaf="">-1.0%</span>。
这两个阈值就像是在锚点价格上下画出的两条“触发线”。
4. 执行条件判断与交易
最后,策略将“实时偏离度”与预设的“阈值”进行比较:
- 当 偏离度 ≥ x1 (如+0.8%):意味着价格已经从锚点上涨了足够多,触发了上方的“卖出线”。策略会发出 “卖出” 信号。这相当于完成了一次“高抛”。
- 当 偏离度 ≤ x2 (如-1.0%):意味着价格已经从锚点下跌了足够多,触发了下方的“买入线”。策略会发出 “买入” 信号。这相当于完成了一次“低吸”。
- 当 偏离度 介于 x2 和 x1 之间:意味着价格在锚点附近小幅波动,没有达到交易条件。策略会保持观望,不进行任何操作。
三、 策略的显著特点
- 动态适应性:其最大的特点在于“动态锚点”。它不像固定网格那样死板,能够根据市场走势和自身交易记录不断调整中心,更好地适应市场节奏。
- 高频与机械化:该策略旨在捕捉盘中每一段小的波动。只要价格在阈值间来回震荡,它就能反复进行“买入-卖出”的循环操作,积小胜为大胜。所有决策依据预设的数学规则,彻底杜绝了交易者的情绪干扰。
- 基于“均值回归”假设:该策略的核心信念是“价格围绕价值波动”,短期内的偏离最终会回归。它正是在利用这种偏离来盈利。
- 严格的纪律性与风险控制:通过固定的百分比阈值,策略强制规定了每笔交易的盈利目标和补仓点位,避免了人性中常见的“贪婪”和“恐惧”。
四、 策略的潜在风险与适用场景
适用场景:
- 震荡市(盘整市) 是该策略的“黄金舞台”。在价格没有明确方向,在一个区间内反复上下的行情中,该策略能最大化其效能。
五、 总结
总而言之,您所分析的这套 “动态条件分时网格策略” ,是一个设计精巧的短线交易工具。它通过动态调整基准锚点,使得网格能够紧跟市场脉搏,再通过严格的百分比阈值来触发机械化的高抛低吸操作。
它的精髓在于承认市场的不可预测性,不追求买在最低点、卖在最高点,而是通过一套严谨的系统,持续地从市场的不确定性(波动)中抽取稳定的、小幅的利润。对于震荡市场而言,它无疑是一个强大的武器;但使用者必须清醒地认识到其在趋势行情中的局限性,并做好相应的风险管理和资金规划。
底层的源代码
class user_def_trader_func:
def __init__(self,c,stock='512480.SH',tick='',hist='',other_data=''):
'''
自定义交易函数
'''
self.tick=tick
self.hist=hist
self.other_data=other_data
self.log=pd.read_excel(r'{}'.format(c.path))
self.trader_date=str(datetime.now())[:10]
self.now_date=datetime.now()
self.stock=stock
if 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=c
def conditional_single_time_sharing_grid(self,
name='固定高频分时网格',
x1=0.8,
x2=-1):
tick=self.hist
stock=self.stock
base_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)*100
else:
order_stats,order_price=check_buy_order(self.c,stock=stock)
if order_stats==True:
base_price=order_price
else:
base_price=base_price
zdf=((price-base_price)/base_price)*100
else:
order_stats,order_price=check_buy_order(self.c,stock=stock)
if order_stats==True:
base_price=order_price
else:
base_price=base_price
zdf=((price-base_price)/base_price)*100
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 ''