QMT实盘代码案例教学:etf全球配置策略
以大QMT为例,etf全球大类资产资产配置策略介绍:
通过QMT平台周期分析etf数据,并执行自动交易操作。
通过选择全世界各地的etf比如纳斯达克etf,标普etf,黄金etf,德经etf,印度etf,日本etf,国债etf等,这些etf在历史上长期属于熊短牛长,具有很高的胜率以及安全边际。
自动交易执行
通过QMT平台的xtquant库连接券商交易接口,实现毫秒级的交易响应4
支持多种委托类型:限价单、最优五档、对手方最优价、本方最优价等4
灵活的策略配置
用户可通过图形界面(GUI)设置交易参数,包括账户信息、交易品种、资金分配、风险控制等4
支持多种交易策略的快速切换和组合
全面的风险管理
内置多重风险控制机制,包括单笔金额限制、总金额限制、价格波动幅度限制等4
自动止损止盈功能,保护投资者资金安全
实时监控与日志记录
提供直观的交易监控界面,实时显示交易状态和账户情况4
完整的操作日志记录,便于事后分析和策略优化
系统架构与技术实现 etf全球大类资产资产交易系统采用模块化设计,主要由以下几个核心组件构成:
预警监控模块
负责实时读取ETF选股池行情
采用高效的文件变化检测算法,确保预警信号的及时捕获
配置流程
设置ETF选股池
配置QMT交易账户和接口参数
设定交易策略参数和风险控制规则
运行模式
支持模拟交易和实盘交易两种模式
安装教程
直接导入大QMT即可
使用说明
一、打开大QMT
打开qmt,不选择独立交易,直接进入大QMT
二、导入策略
点击右键,选择导入策略
三、策略账户设置
点击qmt的文件编辑
修改为自己的股票账号
修改etf交易池
设置参数
设置动量参数:
设置购买股票数量:
四、模型测试
点击运行,编译成功后,点击运行
回测效果:
五、实盘设置
点击模型交易模型挂实盘
六、策略代码
源代码,部分。
import numpy as np
import pandas as pd
import math
class A():
pass
a=A()
#初始化函数
def init(C):
C.acct = '55003243'
C.acct_type = 'STOCK'
C.etf_pool = [
'518880.SH', #黄金ETF(大宗商品)
'513100.SH', #纳指100(海外资产)
'159915.SZ', #创业板100(成长股,科技股,中小盘)
'510180.SH', #上证180(价值股,蓝筹股,中大盘)
]
C.etf_pool = ['513100.SH',
'518880.SH', #黄金ETF(大宗商品)
'513100.SH', #纳指100(海外资产)
'159915.SZ', #创业板100(成长股,科技股,中小盘)
'510180.SH', #上证180(价值股,蓝筹股,中大盘)
'159632.SZ',
'159941.SZ',
'159502.SZ',
'159509.SZ',
'159655.SZ',
'513500.SH',
'513300.SH',
'513400.SH',
'513850.SH',
'159659.SZ',
'159660.SZ',
'164824.SZ',
'159866.SZ',
'513030.SH',
'513080.SH',
'513730.SH',
'159687.SZ',
'159937.SZ',
'159980.SZ',
'159985.SZ',
'159981.SZ']
"""
C.etf_pool = [
'600309.SH', #黄金ETF(大宗商品)
'600231.SH', #纳指100(海外资产)
'000151.SZ', #创业板100(成长股,科技股,中小盘)
'600000.SH', #上证180(价值股,蓝筹股,中大盘)
]
"""
#C.etf_pool = C.get_stock_list_in_sector('沪深300')
print(C.etf_pool)
for i in C.etf_pool:
download_history_data(i,'1d','','')
download_history_data(i,'1m','','')
C.m_days = 60 #动量参考天数
C.Num = 5 #购买股票数量
#C.run_time('trade','1nDay',"2024-07-25 14:57:00")
def handlebar(C):
#pass
trade(C) #每天运行确保即时捕捉动量变化
#trade(C) #每天运行确保即时捕捉动量变化
def get_rank(C,etf_pool):
score_list = []
start_time = timetag_to_datetime(C.get_bar_timetag(C.barpos-C.m_days),'%Y%m%d')
end_time = timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d')
for etf in etf_pool:
data = C.get_market_data_ex(fields=["close"],stock_code=[etf], period = "1d", start_time = start_time, end_time = end_time,count=C.m_days)
df = data[etf]
y = df['log'] = np.log(df.close)
x = df['num'] = np.arange(df.log.size)
slope, intercept = np.polyfit(x, y, 1)
annualized_returns = math.pow(math.exp(slope), 250) - 1
r_squared = 1 - (sum((y - (slope * x + intercept))**2) / ((len(y) - 1) * np.var(y, ddof=1)))
score = annualized_returns * r_squared
score_list.append(score)
df = pd.DataFrame(index=etf_pool, data={'score':score_list})
df = df.sort_values(by='score', ascending=False)
rank_list = list(df.index)
return rank_list
# 交易
def trade(C):
# 获取动量最高的一只ETF
target_num = C.Num
target_list = get_rank(C,C.etf_pool)[:target_num]
#获取持仓信息
holdings = get_trade_detail_data(C.acct, C.acct_type, 'position')
#获取股票的代码和持仓数量的字典
holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nCanUseVolume for i in holdings}
# 卖出
hold_list = holdings
for etf in hold_list:
if etf not in target_list:
passorder(24, 1101, C.acct, etf, 10, 0, holdings.get(etf,0), '', 1 , '', C)
print(timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d'), '卖出' + str(etf))
else:
print( timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d'),'继续持有' + str(etf))
欢迎点赞关注
有任何疑问也欢迎留言交流心得。