搭建自己的量化系统
近几年随着AI文本大模型的推出,搭建自己的量化交易系统变得容易很多。
我们把过程中遇到的问题尽量详尽告诉AI,让它返回给我们想要的结果即可,一次不行就多来回交互几次,直到结果满意为止。
对于刚入门想搭建量化系统的小白,非常关心以下这些问题,于是我们就可以问下DeepSeek.
Q:为什么要搭建一套属于自己的量化交易系统?
DeepSeek回答:
A:我们认为,如果要长期在市场中立于不败之地!必须要形成一套自己的交易系统。我们结合DeepSeek的回答总结了以下几点原因:
Q:如何最快速度学会搭建自己的系统?
DeepSeek回答:
A:边实战边学习,在实战中学习才是最有效地方式。我们分享一个即可以用于实战炒股,也可以用于学习的股票量化系统——QTYX,以此为教学模版,帮助大家学会搭建自己的系统。QTYX提供源码,大家可以根据自己的风格二次开发。
Q:如何围绕QTYX系统学会搭建自己的系统?
A:首先学会使用QTYX的各种功能,辅助自己进行股票分析。下一步是结合线上培训课程,消化里面的各个功能模块的设计原理和代码实现。最后把自己的一些交易想法在QTYX上去实现,二次开发为自己的系统。
Q:QTYX系统上的各种功能是一直迭代更新的吗?
A:是的。QTYX上的功能是基于我们团队和星球大佬级学员们在实战中的经验组合而成的。因为市场是一直在变动的,没有一个软件系统或者一个策略可以永久有效,我们会在实战中不断迭代优化QTYX系统。
快速入门指南
由于QTYX一直迭代更新,当前介绍对应于版本V3.0.1。后续升级版本会同步更新文档内容。
选股框架说明
我们可以把这个选股框架图输入到DeepSeek中,让它解释下选股框架的设计流程和思路! 结合DeepSeek回答,我们再进一步扩展介绍下。QTYX的选股框架流程像一个“多层级”“循环迭代”的漏斗一样,把A股全市场5000只股票的数据输入到框架中,经过逐级的过滤筛选,最终输出几只精挑细选的强势股进入股票池。 选股框架的特点如下:
多层级。QTYX支持“数据驱动选股”、“形态驱动选股”、“马太效应选股”、“条件因子筛选”、“组合分析模块”等功能,通过组合可以达到多层级过滤的目的。
循环迭代。QTYX支持多次循环迭代选股,第一次输出的股票池可以作为第二次输入的股票池,经过多轮循环筛选后可以精选出个股。
怎么去设计这个漏斗,过滤出符合哪些条件的股票呢?
比如2023年,我们把“数据驱动层”的“涨停明细数据”、“热门题材跟踪”与“形态驱动层”的“主升浪形态”结合一起,在实战中开发了一套狙击热门股的战法,代号“飞龙在天”。
历史实战选股记录如下:
股票量化系统QTYX打造“主升浪套利”战法,2023年回顾和总结!
第一层级通过“涨停明细数据”获取近期受到资金关注的个股。
第二层级通过“热门题材跟踪”聚焦近期热门题材。
第三层级通过“主升浪形态”产生向上动力更大股票。
在这个基础上还可以叠加基本面数据进行多维度的综合分析,比如“每日基本面”和“季度业绩报告”等等。
通过条件表达式多次循环过滤,最终输出几只精挑细选的个股在盘中观察买入。
大家掌握了这个框架流程后大家可以根据自己需求选择模块叠加进去进行选股,让QTYX变成和自己风格100%匹配的一款股票分析软件。
全功能拓扑思维导图
注:以下是QTYX核心功能的使用攻略链接导引,对于一些通用的功能或者相对容易操作的功能,我们在“快速上手”的视频中演示。使用时遇到疑问可以在“星球答疑解惑群”中提问。
选股功能:
数据驱动选股部分。“每日行情数据”、“选股结果条件表达式过滤”的功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“选股框架”篇——数据因子+条件公式=无限的策略v2.8.6
数据驱动选股部分。“基金持仓数据”、“北上基金持仓”、“季度财务数据”、“可拼搭组合数据源”的功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“选股框架”篇——每日行情&北上持仓&财务报告,数据拼搭组合(更新v2.9.6)
数据驱动选股部分。“涨停板数据”、“涨停打分模型”、“热门题材跟踪”的功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“选股框架”篇——“涨停个股明细”“热门题材跟踪”选股(更新2.7.9)
数据驱动选股部分。“问财自定义数据”的功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“选股框架”篇——问财自定义选股,各类数据应有尽有(更新2.8.2)
数据驱动选股部分。“个股盘口异动数据”的功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“盘中战法”篇——监测个股盘口异动,机器人远程提醒(更新2.8.0)
形态驱动选股(含ETF)部分。“均线多头排列”、“突破前高检测”,“箱体形态突破”、“双底形态突破”,“单针探底拉升”以及“选股结果支持回测”的功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“选股框架”篇——形态选股大全!支持股票和ETF,支持回测(更新3.0.1)
形态驱动选股(含ETF)部分。“自定义策略”的功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“选股框架”篇——添加一个选股策略,以均线发散+KDJ发散为例
强者恒强选股部分。“欧奈尔RPS排名”的功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“选股框架”篇——动画版RPS,强者恒强龙头战法(更新2.9.3)
组合对比分析(含ETF)部分。“行情走势叠加分析”、“收益与波动分析”的功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“选股框架”篇——组合对比分析,孰优孰劣一目了然(更新2.9.3)
择时功能:
回测评估、择时策略、实盘框架三部分,在如下链接集中介绍功能和使用方法:
量化系统QTYX使用攻略|“自动交易”篇——“六边形”量化框架!支持股票和ETF,可添加策略(更新v2.9.9)
实盘框架中的“自动交易”功能介绍和使用方法可参考如下链接::
量化系统QTYX使用攻略|“自动交易”篇——如何下单?美股用盈透&A股用QMT(更新v2.8.7)
仓位管理/数据更新/股票管理:
“个股补仓计算器”功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“仓位管理”篇——刚买就下跌,补仓计算器帮你快速回本!(更新2.8.5)
数据更新的“抄作业”部分“ETF指数通行红绿灯信号”功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“抄作业”篇——ETF通行红绿灯+组合对比选强+QMT下单(更新2.9.8)
数据更新部分。“个股历史行情数据”功能介绍和使用方法可参考如下链接:
股票量化分析工具QTYX使用攻略——高速版本地行情源(更新v2.6.4)
股票管理部分。“自选股票池导入导出”功能介绍和使用方法可参考如下链接:
量化系统QTYX使用攻略|“扩展兼容”篇——链接同花顺&通达信自选股票池v2.8.6
代码整体结构思维导图
ApiData文件夹:这个文件夹存储数据获取相关的Py代码。
CommIf文件夹:这个文件夹存储通用事务类任务的Py代码。
ConfigFiles文件夹:这个文件夹存储配置文件、选股结果等文件。
DataFiles文件夹:这个文件夹存储获取到的各类股票数据文件。
EventEngine文件夹:这个文件夹作是界面和数据的中间链接层,起到降低界面和数据耦合度的作用,便于后续更换界面模块或者数据模块。
MainGui文件夹:这个文件夹存储wxPython界面相关的Py代码。
MultiGraphs文件夹:这个文件夹存储界面中行情和回测图形化显示的Py代码。
StrategyGath文件夹:这个文件夹存储各种策略逻辑相关的Py代码。
TradeDrv文件夹:这个文件夹存储程序化下单交易的驱动,其中IBKR_Drv是针对美股的盈透驱动,QMT是针对A股的miniqmt驱动。
StartEntry单个文件,用于启动QTYX程序。
DeepSeek学习源码和二次开发
看不懂的代码让DeepSeek解释一下
我输入了一段QTYX工程的PattenGath.py文件中的主升浪形态选股的代码“main_rise_wave”,要求“帮我解释下每一句代码的用途”。
DeepSeek返回结果非常准确,还额外提出了代码优化方案,甚至给出了优化后的代码。
DeepSeek帮我写一个“六脉神剑”形态选股策略添加到QTYX中
QTYX工程的PattenGath.py文件中有一个用户自定义形态选股Demo代码“user_define_strategy”。我们让DeepSeek模仿这个格式写一个“六脉神剑六红”选股策略。
@staticmethoddef user_define_strategy(name, code, stock_data, patlog_obj, **kwargs): """ # 输入参数 :param name: 股票名称, 平安银行 :param code: 股票代码, 000001.SZ :param stock_data: 股票数据, DataFrame格式 :param patlog_obj: 打印日志接口 :param kwargs: dict: 配置参数, 可以直接在函数中修改 :return: """ try: df_search = pd.DataFrame() # 构建一个空的dataframe用来装数据 MA1 = stock_data["收盘价"].rolling(window=5).mean() # 计算M日的移动平均线 MA2 = stock_data["收盘价"].rolling(window=10).mean() # 计算M日的移动平均线 MA3 = stock_data["收盘价"].rolling(window=20).mean() # 计算M日的移动平均线 MA4 = stock_data["收盘价"].rolling(window=30).mean() # 计算M日的移动平均线 CLOSE = stock_data["收盘价"] MA1.fillna(0, inplace=True) MA2.fillna(0, inplace=True) MA3.fillna(0, inplace=True) MA4.fillna(0, inplace=True) # 循环判断是否连续N日都符合均线多头排列的特征 for id in range(0, 4): T = (CLOSE[-1 - id] > MA1[-1 - id] > MA2[-1 - id] > MA3[-1 - id] > MA4[-1 - id]) if T != True: break # 只要有一天不满足则退出 if id >= 3: # 输出满足要求的股票 patlog_obj.re_print("符合特征: 股票 {},代码 {}".format(name, code)) df_search = pd.DataFrame([[name, code]], index=[0], columns=["股票名称", "股票代码"]) return df_search except Exception as e: print(e) return pd.DataFrame()
同时,我们告诉DeepSeek“六脉神剑六红”选股策略的逻辑是六个技术指标同时共振来选出潜在的买入信号。
MACD:异同移动平均线,是趋势指标,用于判断股票的短期趋势。
KDJ:随机指标,通过比较股票在一定时期内的最高价、最低价和收盘价之间的关系,来反映股价的强弱和超买超卖现象。
RSI:相对强弱指数,通过比较一定时期内股价的上涨幅度和下跌幅度来分析市场超买或超卖状态。
LWR:威廉指标,也是通过比较股价在一定时期内的最高价、最低价和收盘价来预测市场动向。
BBI:多空指标,通过计算不同时间周期的移动平均线的平均值来反映股价的长期趋势。
MTM:动力指标,通过比较股价的变动速度和变动幅度来判断股票的买卖时机。
当以上六个指标同时满足以下条件时,即称为“六红”:
MACD指标当前值大于前一期值。
KDJ指标的K值大于前一期值。
RSI指标的RSI1值大于前一期值。
LWR指标的LWR1值小于前一期值。
BBI指标当前值大于前一期值。
MTM指标当前值大于前一期值。
DeepSeek很快就给出了代码,而且非常工整精简,比我自己写得好多了!
@staticmethoddef six_swords_six_red_strategy(name, code, stock_data, patlog_obj, **kwargs): """ # 输入参数 :param name: 股票名称, 例如: 平安银行 :param code: 股票代码, 例如: 000001.SZ :param stock_data: 股票数据, DataFrame格式, 包含开盘价、收盘价、最高价、最低价等 :param patlog_obj: 打印日志接口 :param kwargs: dict: 配置参数, 可以直接在函数中修改 :return: DataFrame: 包含符合策略的股票名称和代码 """ try: df_search = pd.DataFrame() # 构建一个空的dataframe用来装数据 # MACD指标计算 stock_data['EMA12'] = stock_data['收盘价'].ewm(span=12, adjust=False).mean() stock_data['EMA26'] = stock_data['收盘价'].ewm(span=26, adjust=False).mean() stock_data['MACD'] = stock_data['EMA12'] - stock_data['EMA26'] stock_data['MACD_Signal'] = stock_data['MACD'].ewm(span=9, adjust=False).mean() # KDJ指标计算 low_list = stock_data['最低价'].rolling(9, min_periods=1).min() high_list = stock_data['最高价'].rolling(9, min_periods=1).max() rsv = (stock_data['收盘价'] - low_list) / (high_list - low_list) * 100 stock_data['K'] = rsv.ewm(com=2, adjust=False).mean() stock_data['D'] = stock_data['K'].ewm(com=2, adjust=False).mean() stock_data['J'] = 3 * stock_data['K'] - 2 * stock_data['D'] # RSI指标计算 delta = stock_data['收盘价'].diff() gain = (delta.where(delta > 0, 0)).rolling(window=14).mean() loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean() rs = gain / loss stock_data['RSI'] = 100 - (100 / (1 + rs)) # LWR指标计算 stock_data['LWR'] = (high_list - stock_data['收盘价']) / (high_list - low_list) * 100 # BBI指标计算 stock_data['BBI'] = (stock_data['收盘价'].rolling(window=3).mean() + stock_data['收盘价'].rolling(window=6).mean() + stock_data['收盘价'].rolling(window=12).mean() + stock_data['收盘价'].rolling(window=24).mean()) / 4 # MTM指标计算 stock_data['MTM'] = stock_data['收盘价'].diff(6) # 判断六个指标是否同时满足条件 macd_condition = stock_data['MACD'][-1] > stock_data['MACD'][-2] kdj_condition = stock_data['K'][-1] > stock_data['K'][-2] rsi_condition = stock_data['RSI'][-1] > stock_data['RSI'][-2] lwr_condition = stock_data['LWR'][-1] < stock_data['LWR'][-2] bbi_condition = stock_data['BBI'][-1] > stock_data['BBI'][-2] mtm_condition = stock_data['MTM'][-1] > stock_data['MTM'][-2]
if (macd_condition and kdj_condition and rsi_condition and lwr_condition and bbi_condition and mtm_condition): # 输出满足要求的股票 patlog_obj.re_print("符合六脉神剑六红共振特征: 股票 {}, 代码 {}".format(name, code)) df_search = pd.DataFrame([[name, code]], index=[0], columns=["股票名称", "股票代码"]) return df_search except Exception as e: print(e) return pd.DataFrame()
QTYX框架结构设计非常好,把这段代码拷贝到指定的Py文件中,按要求把策略注册到选股框架中就可以了!总共不到5分钟就把“六脉神剑全红共振”选股策略移植到QTYX框架中了!
二次开发过程中遇到报错DeepSeek协助排查。
DeepSeek在协助排查问题时候非常得心应手!不管控制台上报了什么异常信息,只管拷贝到DeepSeek的对话框中即可!比如我运行QTYX时候控制台上出现了一堆日志,我都懒得看直接让DeepSeek来分析。DeepSeek不但告诉我原因,还给出了优化后的代码,非常贴心!
腾讯ima知识库
为了帮助星球学员更好地解决学习过程中遇到的问题,我们建立了一个答疑解惑群,有专门的老师负责环境部署、使用攻略、设计思路、代码解读等方面的答疑。
最近,DeepSeek非常热门,它能够有效降低学习门槛,我们应该充分利用这一工具。
有群友推荐了腾讯的IMA知识库,我亲自试用后发现确实非常便捷。因此,我们决定在学员群中推广使用。我已经将大量QTYX相关的资料上传至知识库,欢迎大家尽快加入并体验!
大家积极参与,共同提升学习效率!
以下是我提问的一些回答,大家可以亲自试试!小程序加入后的问答客户端安装后的问答
说明
想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!
知识星球介绍点击:知识星球《玩转股票量化交易》精华内容概览