量化交易策略是一种基于数学模型和统计分析的交易方法,通过计算机程序自动执行交易指令,以实现稳定、可持续的收益。量化交易策略的核心思想是通过对历史数据的挖掘和分析,找到市场中的规律和趋势,从而制定出一套具有较高胜率和较低风险的交易策略。量化交易策略在金融市场中的应用越来越广泛,已经成为许多投资者和机构的重要工具。
一、什么是量化交易策略?
量化交易策略是指通过数学和统计的方法,利用大量历史和实时市场数据,以及一系列预定的规则和算法,来进行交易决策的一种交易方式。量化交易策略的目标是通过系统性地分析市场数据,发现价格趋势、周期和其他统计规律,并基于这些规律进行交易决策,以获取稳定的投资收益。
量化交易策略的核心理念是利用大数据和数学模型来预测价格走势和市场行为,以此为基础制定交易策略。这种策略通常使用计算机程序进行自动化执行,以提高交易效率和减少人为错误。
二、如何编写专属自己的量化策略?
编写专属自己的量化交易策略需要以下几个步骤:
1、确定交易目标:
首先,需要明确自己的交易目标,包括期望的收益率、风险承受能力和投资时间等。这有助于确定交易策略的方向和风格。
2、数据获取和处理:
获取并整理市场相关数据是量化交易策略的基础。这些数据包括股票价格、财务指标、宏观经济数据等。可以通过各种数据供应商、金融平台或API来获取所需数据,并进行清洗和预处理。
3、策略开发和测试:
基于所获取的数据,使用数学模型、统计方法和机器学习等技术,开发量化交易策略。这包括选择适当的指标、设计买卖规则和风险管理策略等。在开发过程中,需要进行历史回测和模拟交易,以评估策略的表现和稳定性。
4、参数优化和策略改进:
通过对策略参数的优化,可以进一步提高策略的表现。参数优化可以使用优化算法和回测结果进行,目标是找到最优的参数组合,使策略在历史数据上表现最好。
5、实盘交易和监控:
在经过充分的回测和模拟交易验证后,可以将策略应用于实盘交易。在实盘交易中,需要进行实时监控和风险控制,及时调整策略参数以适应市场变化。
三、策略编写举例参考
假设我们要开发一个股票交易策略,目标是在上涨趋势中买入股票并在下跌趋势中卖出。
第一步,我们需要获取股票历史价格数据和技术指标数据。可以使用金融数据供应商的API或者开源的数据源来获取这些数据。
第二步,我们使用Python语言,结合一些开源的量化交易库,如pandas、numpy和ta-lib等。我们可以编写一段简单的代码来实现我们的交易策略:
在这段代码中,我们首先计算了一些常用的技术指标,如简单移动平均线(SMA)、指数移动平均线(EMA)和移动平均收敛/发散指标(MACD)。然后,根据这些指标生成了交易信号,即在价格上涨时买入,价格下跌时卖出。最后,我们计算了策略的收益率,并打印出回测结果。
四、量化交易策略的优势
系统性:量化交易策略是基于数学模型和统计分析的,具有很强的系统性和科学性。通过对历史数据的挖掘和分析,可以找到市场中的规律和趋势,从而提高交易的准确性和稳定性。
自动化:量化交易策略可以通过计算机程序自动执行交易指令,实现自动化交易。这不仅可以大大提高交易效率,还可以避免人为的情绪波动和操作失误。
客观性:量化交易策略是基于数据和模型的,不受个人主观判断的影响。这使得量化交易策略更加客观和公正,有利于提高投资决策的质量。
可复制性:量化交易策略具有很强的可复制性。一旦建立了一个有效的量化交易策略,就可以在不同的市场环境和时间段内进行应用,从而实现持续的收益。
风险管理:量化交易策略可以帮助投资者更好地管理风险。通过对仓位、止损、止盈等方面的设置,可以降低潜在的损失,提高投资的安全性。
我了解的一家证券公司可以免费开通QMT和Ptrade使用(满足入金30万),股票佣金万一,ETF万0.5,可转债上海万0.44、深圳万0.5,还有快速交易通道可以赠送
获取行情数据
交易类数据提供股票的交易行情数据,通过API接口调用即可获取相应的数据。
具体请查看API, 数据获取部分行情相关接口 数据获取函数
。
名称 | 描述 |
---|---|
get_market_data | 获取历史数据与实时行情(包含tick数据),可查询多个标的多个数据字段,返回数据格式为 {field:DataFrame} |
get_market_data_ex | 获取历史数据与实时行情(包含tick数据),可查询多个标的多个数据字段,返回数据格式为 {stock_code:DataFrame} |
get_local_data | 获取历史数据(包含tick数据),可查询单个或多个标的多个数据字段,返回数据格式为 {stock_code:DataFrame} |
get_full_tick | 获取最新的 tick 数据 |
subscribe_whole_quote | 订阅多个标的实时tick数据 |
获取历史行情与实时行情
提示
-
在gmd系列函数中,历史行情需要从本地读取,所以若想取历史行情,需要先将历史行情下载到本地,而实时行情是从服务器返回的
-
所以,若需要历史行情,请先使用
界面端
或者download_history
函数进行下载;若需要最新行情,请向服务器进行订阅
-
特别的,对于xtdata.get_market_data_ex来说,由于没有subscribe参数,需要在参数外先进行订阅(
subscribe_quote
)才能获取最新行情 -
对于同时获取历史和实时行情的情况,gmd系列函数会自动进行拼接
内置Python
调用方法
ContextInfo.get_market_data_ex(
fields=[],
stock_code=[],
period='follow',
start_time='',
end_time='',
count=-1,
dividend_type='follow',
fill_data=True,
subscribe=True)
释义
获取实时行情与历史行情数据
参数
名称 | 类型 | 描述 |
---|---|---|
field | list | 数据字段,详情见下方field字段表 |
stock_list | list | 合约代码列表 |
period | str | 数据周期,可选字段为: "tick" "1m"的整数倍周期 "5m"的整数倍周期 "1d"的整数倍周期 |
start_time | str | 数据起始时间,格式为 %Y%m%d 或 %Y%m%d%H%M%S,填""为获取历史最早一天 |
end_time | str | 数据结束时间,格式为 %Y%m%d 或 %Y%m%d%H%M%S ,填""为截止到最新一天 |
count | int | 数据个数 |
dividend_type | str | 除权方式,可选值为 'none':不复权 'front':前复权 'back':后复权 'front_ratio': 等比前复权 'back_ratio': 等比后复权 |
fill_data | bool | 是否填充数据 |
subscribe | bool | 订阅数据开关,默认为True,设置为False时不做数据订阅,只读取本地已有数据。 |
field
字段可选:
field | 数据类型 | 含义 |
---|---|---|
time | int | 时间 |
open | float | 开盘价 |
high | float | 最高价 |
low | float | 最低价 |
close | float | 收盘价 |
volume | float | 成交量 |
amount | float | 成交额 |
settle | float | 今结算 |
openInterest | float | 持仓量 |
preClose | float | 前收盘价 |
suspendFlag | int | 停牌 1停牌,0 不停牌 |
period
周期为tick时,field
字段可选:
字段名 | 数据类型 | 含义 |
---|---|---|
time | int | 时间戳 |
stime | string | 时间戳字符串形式 |
lastPrice | float | 最新价 |
open | float | 开盘价 |
high | float | 最高价 |
low | float | 最低价 |
lastClose | float | 前收盘价 |
amount | float | 成交总额 |
volume | int | 成交总量(手) |
pvolume | int | 原始成交总量(未经过股手转换的成交总量)【不推荐使用】 |
stockStatus | int | 证券状态 |
openInterest | int | 若是股票,则openInt含义为股票状态,非股票则是持仓量 openInt字段说明 |
transactionNum | float | 成交笔数(期货没有,单独计算) |
lastSettlementPrice | float | 前结算(股票为0) |
settlementPrice | float | 今结算(股票为0) |
askPrice | list[float] | 多档委卖价 |
askVol | list[int] | 多档委卖量 |
bidPrice | list[float] | 多档委买价 |
bidVol | list[int] | 多档委买量 |
返回值
- 返回dict { stock_code1 : value1, stock_code2 : value2, ... }
- value1, value2, ... :pd.DataFrame 数据集,index为time_list,columns为fields,可参考Bar字段
- 各标的对应的DataFrame维度相同、索引相同
示例
# coding:gbk
def init(C):
start_date = '20231001'# 格式"YYYYMMDD",开始下载的日期,date = ""时全量下载
end_date = ""
period = "1d"
need_download = 1 # 取数据是空值时,将need_download赋值为1,确保正确下载了历史数据
code_list = ["000001.SZ", "600519.SH"] # 股票列表
if need_download: # 判断要不要下载数据, gmd系列函数都是从本地读取历史数据,从服务器订阅获取最新数据
my_download(code_list, period, start_date, end_date)
############ 仅获取历史行情 #####################
subscribe = False # 设置订阅参数,使gmd_ex仅返回本地数据
count = -1 # 设置count参数,使gmd_ex返回全部数据
data1 = C.get_market_data_ex([],code_list,period = period, start_time = start_date, end_time = end_date,subscribe = subscribe)
############ 仅获取最新行情 #####################
subscribe = True # 设置订阅参数,使gmd_ex仅返回最新行情
count = 1 # 设置count参数,使gmd_ex仅返回最新行情数据
data2 = C.get_market_data_ex([],code_list,period = period, start_time = start_date, end_time = end_date,subscribe = subscribe, count = 1) # count 设置为1,使返回值只包含最新行情
############ 获取历史行情+最新行情 #####################
subscribe = True # 设置订阅参数,使gmd_ex仅返回最新行情
count = -1 # 设置count参数,使gmd_ex返回全部数据
data3 = C.get_market_data_ex([],code_list,period = period, start_time = start_date, end_time = end_date,subscribe = subscribe, count = -1) # count 设置为1,使返回值只包含最新行情
print(data1[code_list[0]].tail())# 行情数据查看
print(data2[code_list[0]].tail())
print(data3[code_list[0]].tail())
def handlebar(C):
return
def my_download(stock_list,period,start_date = '', end_date = ''):
'''
用于显示下载进度
'''
if "d" in period:
period = "1d"
elif "m" in period:
if int(period[0]) < 5:
period = "1m"
else:
period = "5m"
elif "tick" == period:
pass
else:
raise KeyboardInterrupt("周期传入错误")
n = 1
num = len(stock_list)
for i in stock_list:
print(f"当前正在下载{n}/{num}")
download_history_data(i,period,start_date, end_date)
n += 1
print("下载任务结束")