本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。
QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。
文章目录
- 相关阅读
- DeepSeek新用户注册
- cline 集成
- 指令测试
相关阅读
小白也能做量化:零门槛QMT、Ptrade免费送
量化交易入门:如何在QMT中配置Python环境,安装第三方依赖包
量化交易策略:多因子选股结合布林带择时
DeepSeek凭借低廉地训练成本火爆出圈,引发的美股科技股狂跌,英伟达下跌16.86%,创历史上最大单日个股蒸发规模,市值蒸发5888.62亿美元(约合人民币4.27万亿元)。甚至由于太过火爆,开始限制海外用户注册,国内用户暂时不受影响。DeepSeek新用户可以通过官网注册。
DeepSeek新用户注册
目前新用户免费赠送500万tokens,即使用超了,续费价格也极低:
创建自己的API key,记录下来,(最新访问人数过多,又新推了app,API 平台可能暂时不开放)
cline 集成
cline 是一款集成在 IDE 中的自主编码代理,专注于自动化软件开发任务,它为软件开发者和编程人员提供了高效的代码编写、调试和项目管理方案,显著提升开发效率。VSCode,作为一款功能强大且高度可定制的代码编辑器,其简洁直观的界面、丰富的插件生态以及强大的代码编辑功能,为编写量化策略代码提供了绝佳的平台。当将 VSCode、Cline 和 DeepSeek 这三大利器巧妙组合在一起,就如同为量化小白打造了一艘坚固而快速的战舰。
在VScode中搜索插件cline,点击安装:
配置cline的api提供方,选择deepseek,输入刚才保存的api key:
测试下"你是谁“,发现他有很清晰的自我定位,”我是一个高度熟练的软件工程师,拥有多种编程语言、框架、设计模式和最佳实践的广泛知识。我可以帮助你完成编程相关的任务,比如编写代码、调试程序、优化算法等。“
此外,还可以读取本地的文件结构,分析出了当前工程中正在进行的项目,将自己已经写过的miniQMT的量化交易喂给他,并给他足够的权限,创建文件,执行python命令等。
指令测试
给他指令“请根据miniQMT的api,编写一个布林带突破策略”,他会先分析需求,再拆分任务,列出要点,最后编写代码,一切都是按真实的软件工程的步骤,需求分析-概要设计-详细设计-编码。
根据用户要求,我需要使用迅投miniQMT API编写一个布林带突破策略。这个策略需要:
获取历史K线数据计算布林带指标
实时监控价格突破布林带上下轨
实现突破时的买卖逻辑
使用miniQMT的交易接口进行下单
我将基于用户现有的股票打板策略.py文件结构,创建一个新的布林带策略文件。
执行后,可以看到已经新建了“布林带突破策略.py“文件,
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@Author : 木头左
@Date : 2024-12-22 16:47:36
@LastEditTime : 2025-01-05 20:14:41
@Description : 布林带突破策略
@欢迎关注木头左,学习更多量化交易知识,共同进步,微信号:bigleft0
@Copyright (c) 2024 by mutouzuo, All Rights Reserved.
'''
from xtquant import xtdata,xttrader
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
import random,os,sys,math
from datetime import datetime
from xtquant.xttype import StockAccount
from xtquant.xttrader import XtQuantTrader
from xtquant import xtconstant
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
sys.path.append(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import sys,schedule,json,time
class BollingerStrategy:
def __init__(self):
self.period = 20 # 布林带周期
self.std_multiplier = 2 # 标准差倍数
self.position = 0 # 当前持仓
self.capital = 100000 # 初始资金
self.stock_code = '000001.SZ' # 默认交易标的
def calculate_bollinger(self, close_prices):
"""计算布林带指标"""
if len(close_prices) < self.period:
return None, None, None
rolling_mean = close_prices.rolling(window=self.period).mean()
rolling_std = close_prices.rolling(window=self.period).std()
upper_band = rolling_mean + (rolling_std * self.std_multiplier)
lower_band = rolling_mean - (rolling_std * self.std_multiplier)
return upper_band.iloc[-1], rolling_mean.iloc[-1], lower_band.iloc[-1]
def handle_tick(self, tick_data):
"""处理实时行情"""
if not tick_data:
return
# 获取历史K线
hist_data = xtdata.get_market_data_ex(
stock_list=[self.stock_code],
period='1d',
start_time=(datetime.now() - timedelta(days=30)).strftime('%Y%m%d'),
end_time=datetime.now().strftime('%Y%m%d')
)
close_prices = pd.Series(hist_data[self.stock_code]['close'])
upper, middle, lower = self.calculate_bollinger(close_prices)
if upper is None:
return
last_price = tick_data[self.stock_code]['lastPrice']
# 突破上轨买入信号
if last_price > upper and self.position <= 0:
self.buy_signal()
# 突破下轨卖出信号
elif last_price < lower and self.position >= 0:
self.sell_signal()
def buy_signal(self):
"""买入信号处理"""
print(f"{datetime.now()} 买入信号触发")
# 计算买入数量
vol = int(self.capital * 0.1 / xtdata.get_market_data_ex(
stock_list=[self.stock_code],
period='1d',
start_time=datetime.now().strftime('%Y%m%d'),
end_time=datetime.now().strftime('%Y%m%d')
)[self.stock_code]['close'][-1] / 100) * 100
if vol > 0:
xt_trader.order_stock_async(
acc, self.stock_code, xtconstant.STOCK_BUY,
vol, xtconstant.FIX_PRICE, 0, '布林带突破策略', '买入'
)
self.position += vol
print(f"买入 {self.stock_code} {vol}股")
def sell_signal(self):
"""卖出信号处理"""
print(f"{datetime.now()} 卖出信号触发")
if self.position > 0:
xt_trader.order_stock_async(
acc, self.stock_code, xtconstant.STOCK_SELL,
self.position, xtconstant.FIX_PRICE, 0, '布林带突破策略', '卖出'
)
print(f"卖出 {self.stock_code} {self.position}股")
self.position = 0
# 初始化交易环境
path = r'E:\programData\qmt\userdata_mini'
acc = StockAccount('8886', 'STOCK')
session_id = int(time.time())
xt_trader = XtQuantTrader(path, session_id)
xt_trader.start()
xt_trader.connect()
# 创建策略实例
strategy = BollingerStrategy()
# 订阅行情
xtdata.subscribe_quote(
strategy.stock_code,
period='tick',
start_time='093000',
end_time='150000',
callback=strategy.handle_tick
)
# 保持策略运行
while True:
time.sleep(1)
大体的代码结构基本上都是完整的,但是有概率不能直接运行,通常是deepseek对函数的入参不太了解,或者是对第三方库api不熟悉,轻微调试一下就可以了。
Traceback (most recent call last):
File "e:\programData\pythonProject\木头左量化\布林带突破策略.py", line 117, in <module>
xtdata.subscribe_quote(
File "D:\ProgramData\anaconda3\lib\site-packages\xtquant\xtdata.py", line 941, in subscribe_quote
return client.subscribe_quote(bson.BSON.encode(meta), bson.BSON.encode(region), callback)
RuntimeError: start_time ill-formed, meta:3000, market:SZ
这种就是时间格式不对,点进api看下参数要求,修改一下,就可以了,简直是量化小白福音。
ai发展到最后,一定是像水、电、互联网一样成为基础设施,让普通大众便捷的使用,在此之前,谁先熟念地使用,就会占得先机。