常听人说“一根均线打天下”,那我们就从单均线策略入手来学习QMT股票量化吧。
买卖规则:当股价大于20日均线,全仓买入,当股价小于20均线,全仓卖出。
登录QMT系统后,点击“新建策略”,选择“Python策略”。

然后,系统就自动为你新建了一个策略模板,我们先把模板里init(ContextInfo)和handlebar(ContextInfo)这两个函数里面的内容全部删除,换成我们自己的代码。
init(ContextInfo)函数是初始化函数,在回测时,它只会运行一次。一般用来放置要操作的股票代码,自己的账号等等。

handlebar(ContextInfo)函数是策略的核心,它定义了当每根新的K线生成时,策略将如何响应市场数据的变化,也就是每一根K线,它都会运行一次。在本策略中,handlebar 函数执行以下操作:
- 使用 ContextInfo.get_market_data_ex 方法获取股票的收盘价数据。
- 计算20日均线(MA20)。
- 根据20日均线和当前股价的关系,决定是执行买入还是卖出操作。
完整代码如下:
#encoding:gbk
'''
单均线策略,股价大于20日均线,全仓买入,小于20均线,全仓卖出
注意:本策仅用于python量化学习,不用于真实交易
'''
import pandas as pd
import numpy as np
def init(ContextInfo):
# 设置股票代码和账户ID
ContextInfo.stock = "600863.SH"
ContextInfo.accID = 'your accID'
# 设置移动平均周期
ContextInfo.MA_period = 20
def handlebar(ContextInfo):
# 计算20日均线
close = ContextInfo.get_market_data_ex(
['close'],
[ContextInfo.stock],
start_time="20230101",
end_time="20231231",
period='1d',
dividend_type='none'
)[ContextInfo.stock]['close']
MA20 = pd.Series(close).rolling(window=ContextInfo.MA_period).mean()
# 获取账户信息
account_info = get_trade_detail_data(ContextInfo.accID, 'stock', 'account')
if not account_info:
print("无法获取账户信息")
return
account_info = account_info[0]
available_cash = int(account_info.m_dAvailable) # 可用资金
# 全仓买入逻辑
if close[-2] <= MA20[-2] and close[-1] > MA20[-1]:
# 计算买入数量,向下取整
buy_volume = available_cash // close[-1]
# 下单买入
order_target_value(ContextInfo.stock, buy_volume, ContextInfo, ContextInfo.accID)
# 全仓卖出逻辑
elif close[-2] > MA20[-2] and close[-1] <= MA20[-1]:
# 获取持仓信息
position_info = get_trade_detail_data(ContextInfo.accID, 'stock', 'position')
if not position_info:
print("无法获取持仓信息")
return
position_info = position_info.get(ContextInfo.stock, 0) # 获取当前股票的持仓量
# 下单卖出
order_target_value(ContextInfo.stock, -position_info, ContextInfo, ContextInfo.accID)
最后回测,看看代码是否按预想运行了。


如图所示,在回测中,买卖如期进行了!收益嘛…….暂时别管它,咱们现阶段的主要目的学习写代码,了解一下QMT写策略的步骤和方法,通过写单均线策略,目的算是达到了。
再补充一点:用
ContextInfo.get_market_data_ex 方法获取股票的收盘价数据其实是一个字典,但要对数据进行处理,例如计算20日均线,那就要把字典里的值取了来,它的值才是DataFrame。字典的键是股票代码。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/73463
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!