我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统(KhQuant 是其核心框架)。
一、关于指标库
在量化交易的世界里,技术指标是构建策略的基石。
前期开发精力主要在框架搭建上,目前系统公开发布在即,补充一个常用指标库对于大家的策略编写是十分必要的。
本来对于指标我想一个个手撸,不过后来发现珠玉在前,有前辈已经做好这项工作,所以考虑这部分不再重头弄起,后续只在此基础上补充完善。
二、MyTT:轻量而强大的指标库
MyTT 是一个在量化圈广受欢迎的纯 Python 技术指标库,它的 GitHub 地址是:https://github.com/mpquant/MyTT
以下是 MyTT 的官方介绍:
MyTT是您量化工具箱里的瑞士军刀,精炼而高效,它将通达信,同花顺,文华麦语言等指标公式indicators,最简移植到Python中,核心库单个文件,仅百行代码,实现和转换同花顺通达信所有常见指标MACD,RSI,BOLL,ATR,KDJ,CCI,PSY等,全部基于numpy和pandas的函数封装,简洁且高性能,能非常方便的应用在各自股票股市技术分析,股票自动程序化交易,数字货币BTC等量化等领域.Mini Python library with most stock market indicators.
核心库轻量化: 项目库就一个文件 MyTT.py,不用安装设置,可自由裁剪,随用随走 from MyTT import * 即可
代码人类化:) 没有什么炫耀的编程花样,初学者也能看懂,自己就能自行增加指标,马上就能用在项目中。
不需要安装ta-lib库,是纯python代码实现的的核心逻辑,很多人都有安装ta-lib库的痛苦经历
和通达信,同花顺的指标写法完全兼容,一个新的指标基本不用做修改,直接拿来即可使用
超高性能,基本不用循环,全是靠numpy,pandas的内置函数实现各种指标
和Talib库一样是多天参数进,多天指标出(序列进,序列出),便于画图和观察趋势
MyTT实现的各种指标和通达信,同花顺,雪球等软件的技术指标一致到小数点后2位
MyTT 提供了丰富的指标函数,以下是其中常用的一部分:
- 均线类:
MA
(简单移动平均),EMA
(指数移动平均),SMA
(平滑移动平均),DMA
(动态移动平均),BBI
(多空均线),EXPMA
(指数平均数),DFMA
(平行线差) - 趋势转向类:
MACD
(平滑异同移动平均线),SAR
(抛物线转向),DMI
(动向),TRIX
(三重指数平滑均线),DPO
(区间震荡线) - 动量摆动类:
KDJ
(随机指标),RSI
(相对强弱指标),WR
(威廉指标),BIAS
(乖离率),CCI
(顺势指标),MTM
(动量),ROC
(变动率),PSY
(心理线) - 波动通道类:
BOLL
(布林带),ATR
(平均真实波幅),KTN
(肯特纳通道),XSII
(薛斯通道II) - 成交量类:
OBV
(能量潮),VR
(容量比率),EMV
(简易波动),MFI
(资金流向),MASS
(梅斯线) - 其他:
CR
(价格动量),BRAR
(情绪指标),ASI
(振动升降)
三、如何在策略中使用 MyTT 指标
需要强调的是,khQuant 已经将 MyTT 完整集成到系统中,所以在您的策略里使用这些指标时,无需再单独安装或导入 MyTT 模块。
在 khQuant 中使用 MyTT 非常简单,只需三步即可完成指标计算。
第一步:统一导入
在任何策略文件的顶部,只需一行代码即可引入所有 khQuant 工具及 MyTT 函数库:
from khQuantImport import *
第二步:获取历史数据序列
MyTT 的所有函数都接收一个 ndarray
或 pandas.Series
作为输入。因此,你需要先用 khHistory
函数获取所需的数据。
# 获取某只股票过去60天的日线收盘价序列
hist = khHistory(sc, ["close"], 60, "1d", dn)
closes = hist[sc]["close"].values
第三步:调用 MyTT 函数
有了数据序列,你就可以像调用普通 Python 函数一样,直接使用 MyTT 提供的指标函数了。
# 计算20日均线
ma20_series = MA(closes, 20)
# 获取最新的均线值
ma20_latest = ma20_series[-1]
# 计算14日RSI
rsi_series = RSI(closes, 14)
rsi_latest = rsi_series[-1]
在上一篇文章中,我们演示了使用 MA
函数实现双均线策略。为了避免与 MyTT 库中的 MA
函数产生命名冲突,从本版本开始,我将自己封装的 MA
函数更名为 khMA
。
做出这个改动,是因为两类函数的设计哲学有所不同:
- MyTT 函数 (
MA
,RSI
等):更贴近底层数学公式,遵循“序列进,序列出”的原则,具备最高的灵活性,便于组合和创造新指标。 - khQuant 封装函数 (
khMA
等):更侧重工程实用性,将“数据获取”等步骤封装在内,一行代码即可调用。这虽然大大提升了便利性,但也牺牲了部分灵活性。
因此,我确立了新的命名规范:未来所有由我封装、提供更强易用性的指标函数,都会以 kh
作为前缀;而直接源于 MyTT 或我为 MyTT 补充的底层公式函数,则不加前缀。这有助于大家在策略开发中清晰地选择所需工具。
示例对比:khMA 与 MyTT 的不同用法
A. 使用 khMA (系统内置一步到位)
下边是我在上一篇文章中演示的双均线策略,只不过我把函数名改成了'khMA'。 注意使用这个函数是不需要提前获取数据的。
# strategies/双均线多股票_使用khMA函数.py
from khQuantImport import * # 导入所有量化工具
def init(stocks=None, data=None):# 策略初始化函数
"""本策略不需初始化"""
def khHandlebar(data: Dict) -> List[Dict]:# 主策略函数
"""策略主逻辑,支持多只股票的双均线策略"""
signals = [] # 初始化信号列表
stock_list = khGet(data, "stocks") # 获取股票池列表
current_date_str = khGet(data, "date_num") # 获取当前日期数字格式
for stock_code in stock_list: # 遍历每只股票
current_price = khPrice(data, stock_code, "open") # 获取当前开盘价
ma_short = khMA(stock_code, 5, end_time=current_date_str) # 计算5日均线
ma_long = khMA(stock_code, 20, end_time=current_date_str) # 计算20日均线
has_position = khHas(data, stock_code) # 检查是否持有该股票
if ma_short > ma_long andnot has_position: # 金叉且无持仓
signals.extend(generate_signal(data, stock_code, current_price, 0.5, 'buy', f"{stock_code[:6]} 金叉买入")) # 单股票20%仓位
elif ma_short < ma_long and has_position: # 死叉且有持仓
signals.extend(generate_signal(data, stock_code, current_price, 1, 'sell', f"{stock_code[:6]} 死叉卖出")) # 全部卖出
return signals # 返回交易信号
B. 使用 MyTT.MA (先取序列再计算)
下边演示的是使用 MyTT.MA的例子,大家可以对比一下这两种函数的区别,使用MyTT.MA函数,需要提前获取收盘价数据。这里可以调用我封装的khHistory函数,便捷地获取数据。 对于我没有做类似khMA函数的封装的其他指标,大家需要参照下边的例子来编写策略。
# strategies/双均线多股票_使用MA函数.py
from khQuantImport import * # 统一导入工具与指标
def init(stocks=None, data=None):# 策略初始化(无需特殊处理)
"""本策略不需初始化"""
def khHandlebar(data: Dict) -> List[Dict]:# 主策略函数
"""多股票双均线(MyTT.MA)策略:MA5 上穿 MA20 买入,反向卖出"""
signals = [] # 信号列表
stock_list = khGet(data, "stocks") # 股票池
dn = khGet(data, "date_num") # 当前日期(数值格式)
for sc in stock_list: # 遍历股票
hist = khHistory(sc, ["close"], 60, "1d", dn, fq="pre", force_download=False) # 拉取60日收盘价
closes = hist[sc]["close"].values # 收盘序列
ma5_now = float(MA(closes, 5)[-1]) # 当日MA5
ma20_now = float(MA(closes, 20)[-1]) # 当日MA20
price = khPrice(data, sc, "open") # 当日开盘价
has_pos = khHas(data, sc) # 是否持仓
if ma5_now > ma20_now andnot has_pos: # 金叉且无持仓→买入
signals.extend(generate_signal(data, sc, price, 0.5, "buy", f"{sc[:6]} 金叉买入")) # 0.5仓
elif ma5_now < ma20_now and has_pos: # 死叉且有持仓→卖出
signals.extend(generate_signal(data, sc, price, 1.0, "sell", f"{sc[:6]} 死叉卖出")) # 全部卖出
return signals # 返回信号
后续我将继续在当前MyTT库的基础上补充完善指标库,同时增加一些使用这些指标的策略案例。如果有需求,后续专门出一期讲一讲如何将通达信策略转换成当前框架下的策略示。
四、加入内测,抢先体验
看到这里,也许已经对新版本充满期待。如果想第一时间体验上述所有新功能,诚挚地邀请加入内部测试,抢先一步,感受最新版本的魅力。
内测资格目前只对通过作者推荐渠道开通miniQMT(开通是免费的)的朋友开放。这既是对开发工作的一种支持,也是回馈核心朋友的一种方式。尽管公开发布在即,不过加入内测群会有持续的福利:
- 版本领先体验:将永远比公开发布版领先一个大功能版本,提前使用到正在开发中的新功能。
- 专属交流群:受邀加入内部交流群,与作者及众多量化爱好者直接交流,获取及时的帮助和策略思路分享。
- 知识星球福利:后续如果开通知识星球,它将主要用于更深入的策略算法探讨,而看海量化系统本身承诺永久免费使用。届时,内测群成员将免费获赠一年的知识星球会员资格,共享更深度的研究成果。
如果对此感兴趣,请关注公众号“看海的城堡”,在公众号页面下方点击相应标签即可获取开户方式,开通后联系作者即可加入。
五、未来的路
内测阶段预计将在八月底前结束,最晚九月份会完成。在此期间,我们的工作重心将是:丰富更多的策略案例,进一步完善和优化策略工具库,并持续修复潜在的BUG,进一步提升软件的稳定性和易用性,确保在正式发布时,能带来尽可能完善的功能和体验。
对于等不及的朋友,再次发出邀请:欢迎加入内测!再次感谢所有内测伙伴的付出!期待你的加入!