靠着均线买,别墅靠大海?双均线择时策略真的有效吗?
发布时间:2023-12-12 17:30阅读:229
在遥远的股票市场有这么一句流行语靠着均线买别墅靠大海但当真如此吗
在使用QMT量化交易软件的时候新手入门抓不住头脑的不妨从双均线策略开始
打开注册好的QMT软件可以试着输出自己的第一个代码
def init(C):
print('init')
def handlebar(C):
print('hello')
Init函数是初始化函数比如初始化股票池初始化资金账号初始化全局变量等
handlebar 是整个 Python 模型中的核心执行函数
当模型从数据层获取到运行所需要的数据之后会对数据集上的每一根 bar即K线调用一次 handlebar 函数处理当前这根 bar 上的数据
也就是说用户模型的核心逻辑都是写在该函数中的如获取数据设置下单条件等
在 handlebar 中处理完数据后用户可以通过 paint 方法将需要绘图输出的结果返回给界面界面会将输出结果如实的展示出来

在没有接触量化的时候我一直认为均线是非常有效的一个指标但是接触之后发现所有的择时都不如选一只漂亮股
比如今年涨得最好的游戏ETF基金利用双均线策略买入的年化收益是28.59%但是基准的年化收益是43.95%基准为930901动漫游戏指数

相对沪深300ETF和沪深300指数双均线看着还有点作用

我们在QMT上面做回测可以直接在参数设置里面修改相应的标的在init函数里面设置标的为主图品种在右侧基本信息回测参数可以自行设置

策略编写好了之后可以直接点回测然后就会显示回测的收益历史持仓明细等等
说一百遍不如自己实际操作一次完整的代码如下
代码有点乱可以右上角添加我的微信获取
#coding:gbk
#导入常用库
import pandas as pd
import numpy as np
import talib
#示例说明本策略通过计算快慢双均线在金叉时买入死叉时做卖出
def init(C):
#init handlebar函数的入参是ContextInfo对象 可以缩写为C
#设置测试标的为主图品种
C.stock= C.stockcode + '.' +C.market
#line1和line2分别为两条均线期数
C.line1=10 #快线参数
C.line2=20 #慢线参数
#accountid为测试的ID 回测模式资金账号可以填任意字符串
C.accountid = "testS"
def handlebar(C):
#当前k线日期
bar_date = timetag_to_datetime(C.get_bar_timetag(C.barpos), '%Y%m%d%H%M%S')
#回测不需要订阅最新行情 使用本地数据速度更快. 如果回测多个品种 需要手动下载对应周期历史数据 主图品种显示在界面时已经订阅了行情 直接取就可以
local_data
= C.get_local_data(C.stock, end_time = bar_date, period = C.period,
divid_type = 'front_ratio', count = max(C.line1, C.line2))
sorted_keys = sorted(local_data.keys())
close_list = [local_data[i]['close'] for i in sorted_keys]
#将获取的历史数据转换为DataFrame格式方便计算
#如果目前未持仓,同时快线穿过慢线,则买入8成仓位
if len(close_list) <1:
print(bar_date, '行情不足 跳过')
line1_mean = round(np.mean(close_list[-C.line1:]),2)
line2_mean = round(np.mean(close_list[-C.line2:]),2)
print(f"{bar_date} 短均线{line1_mean} 长均线{line2_mean}")
account = get_trade_detail_data('test', 'stock', 'account')
account = account[0]
available_cash = int(account.m_dAvailable)
holdings = get_trade_detail_data('test', 'stock', 'position')
holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nVolume for i in holdings}
holding_vol = holdings[C.stock] if C.stock in holdings else 0
if holding_vol == 0 and line1_mean > line2_mean:
vol = int(available_cash / close_list[-1] / 100) * 100
#下单开仓
passorder(23, 1101,C.accountid, C.stock, 5, -1, vol, C)
print(f"{bar_date} 开仓")
C.draw_text(1, 1, '开')
#如果目前持仓中,同时快线下穿慢线,则全部平仓
elif holding_vol > 0 and line1_mean < line2_mean:
#状态变更为未持仓
C.holding=False
#下单平仓
passorder(24, 1101, C.accountid, C.stock, 5, -1, holding_vol, C)
print(f"{bar_date} 平仓")
C.draw_text(1, 1, '平')
END
温馨提示:投资有风险,选择需谨慎。
-
中信证券现在可以买黄金吗?有人知道吗?
2025-11-03 09:31
-
北交所怎么开户?如何开通北交所交易权限?
2025-11-03 09:31
-
一文搞懂一条产业链——【通信设备及服务】
2025-11-03 09:31


当前我在线

分享该文章
