传统交易依赖交易员的经验、主观判断和手动操作,分析数据的量与速度有限,决策易受个人情绪影响,执行效率低,往往错过最佳交易时机,风险控制也更多凭经验而非量化标准,在成熟市场中已逐渐被量化交易挤压份额。
传统交易类似于下图:
量化交易与传统交易的核心区别在于 “工具、决策、效率” 的全面差异:量化交易以计算机程序和数学模型为核心,能快速处理海量历史与实时市场数据,自动挖掘价格规律、执行交易指令,从决策到下单全程无人工干预,既避免了贪婪、恐惧等情绪干扰,又能在毫秒间捕捉稍纵即逝的机会,还可通过预设参数精准控制风险、同时覆盖多市场多品种。
量化能让你的交易效率提高百倍,量化交易之于传统交易方法,如同大型收割机之于锄头镰刀,机枪大炮之于刀剑棍棒。
量化交类似于下图:
量化交易怎么做?
量化交易是指借助现代统计学和数学的方法,利用计算机技术来进行交易的证券投资方式。便于理解的说,量化交易主要是做这样的事:
从一个想法开始
想法就是指那些你想验证的可能会盈利的方法,比如银行股可能是良好的投资品种,想通过计算其快慢双均线,在金叉时买入,死叉时做卖出。想法来源的方式可以是阅读、听人说、自己的经验等等。
这里我们以一个简单的情况为例进行讲解。比如你的想法如下:
“通过计算快慢均线交叉信号,在金叉时买入,死叉时做卖出
把想法细化成明确的可执行的交易策略”
一般想法都很模糊,需要将组略的想法细化成明确并且可执行的策略,目的是为了能得到确定的结果,以及为后续程序化准备。
比如,你想将想法应用到股市,这个想法就很模糊,就需要明确什么条件下买卖,买卖什么品种,买卖多少量等,从而形成一个明确的交易策略,让不同人根据你的描述在相同情形下都能做出相同的操作。
比如我们要明确几个核心问题:
均线周期是多少?
金叉(买入)和死叉(卖出)的具体条件是什么?
交易标的范围如何限定?
买入金额 / 数量如何设定?
交易时间如何限定?
细化后,原本模糊的想法就变成了清晰的策略:
均线周期:快线周期为 17 日,慢线周期为 27 日
金叉(买入条件): 前一期快线(17 日均线)低于慢线(27 日均线),且当前期快线向上突破并高于慢线,同时需满足可用资金大于单笔买入金额、买入数量不少于 100 股、当前无该股票持仓。
死叉(卖出条件):前一期快线高于慢线,且当前期快线向下突破并低于慢线,同时需满足当前持有该股票且可卖数量大于 0。
买入金额:固定为 10000 元,且需满足可用资金大于该金额。
买入数量:按 “买入金额 ÷ 当前股价” 计算后,向下取整为 100 的整数倍,且不少于 100 股(1 手)。
卖出数量:卖出当前持仓的全部可卖数量。
交易时间:仅在每日 9:30-15:00(包含首尾时间)的交易时段执行操作,且仅在每根 K 线的最后一笔数据触发时进行判断,避免盘中分笔数据波动导致重复操作。
现在我们基本已经把之前的灵感细化成明确的可执行的交易策略。当然,可能还有些地方不够明确,也可能有些细节还不确定要改动,这些可以随时想到随时再改,不必一次做到完美。
把策略转化为计算机语言
以主流量化软件QMT为例,我们把刚才的策略翻译成简单代码(仅作逻辑展示):
encoding:gbk
import pandas as pd
import numpy as np
import datetime
"""
示例说明:双均线实盘策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出
"""
class a():
pass
A = a() #创建空的类的实例 用来保存委托状态
ContextInfo对象在盘中每次handlebar调用前都会被深拷贝, 如果调用handlebar的分笔不是k线最后分笔 ContextInfo会被回退到深拷贝的内容 所以ContextInfo不能用来记录快速交易的信号
def init(C):
A.stock= C.stockcode + '.' + C.market #品种为模型交易界面选择品种
A.acct= account #账号为模型交易界面选择账号
A.acct_type= accountType #账号类型为模型交易界面选择账号
A.amount = 10000 #单笔买入金额 触发买入信号后买入指定金额
A.line1=17 #快线周期
A.line2=27 #慢线周期
A.waiting_list = [] #未查到委托列表 存在未查到委托情况暂停后续报单 防止超单
A.buy_code = 23 if A.acct_type == 'STOCK'else 33 #买卖代码 区分股票 与 两融账号
A.sell_code = 24 if A.acct_type == 'STOCK'else 34
设置股票池 订阅品种行情
C.set_universe([A.stock])
print(f'双均线实盘示例{A.stock} {A.acct} {A.acct_type} 单笔买入金额{A.amount}')
def handlebar(C):
跳过历史k线
if not C.is_last_bar():
return
now = datetime.datetime.now()
now_time = now.strftime('%H%M%S')
跳过非交易时间
if now_time < '093000' or now_time > "150000":
return
account = get_trade_detail_data(A.acct, A.acct_type, 'account')
if len(account)==0:
print(f'账号{A.acct} 未登录 请检查')
return
account = account[0]
available_cash = int(account.m_dAvailable)
如果有未查到委托 查询委托
if A.waiting_list:
found_list = []
orders = get_trade_detail_data(A.acct, A.acct_type, 'order')
for order in orders:
if order.m_strRemark in A.waiting_list:
found_list.append(order.m_strRemark)
A.waiting_list = [i for i in A.waiting_list if i not in found_list]
if A.waiting_list:
print(f"当前有未查到委托 {A.waiting_list} 暂停后续报单")
return
holdings = get_trade_detail_data(A.acct, A.acct_type, 'position')
holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nCanUseVolume for i in holdings}
获取行情数据
data = C.get_history_data(max(A.line1, A.line2)+1, '1d', 'close',dividend_type='front_ratio')
close_list = data[A.stock]
if len(close_list) < max(A.line1, A.line2)+1:
print('行情长度不足(新上市或最近有停牌) 跳过运行')
return
pre_line1 = np.mean(close_list[-A.line1-1: -1])
pre_line2 = np.mean(close_list[-A.line2-1: -1])
current_line1 = np.mean(close_list[-A.line1:])
current_line2 = np.mean(close_list[-A.line2:])
如果快线穿过慢线,则买入委托 当前无持仓 买入
vol = int(A.amount / close_list[-1] / 100) * 100 #买入数量 向下取整到100的整数倍
if A.amount < available_cash and vol >= 100 and A.stock not in holdings and pre_line1 < pre_line2 and current_line1 > current_line2:
下单开仓 ,参数说明可搜索PY交易函数 passorder
msg = f"双均线实盘 {A.stock} 上穿均线 买入 {vol}股"
passorder(A.buy_code, 1101, A.acct, A.stock, 14, -1, vol, '双均线实盘', 1 , msg, C)
print(msg)
A.waiting_list.append(msg)
如果快线下穿慢线,则卖出委托
if A.stock in holdings and holdings[A.stock] > 0 and pre_line1 > pre_line2 and current_line1 < current_line2:
msg = f"双均线实盘 {A.stock} 下穿均线 卖出 {holdings[A.stock]}股"
passorder(A.sell_code, 1101, A.acct, A.stock, 14, -1, holdings[A.stock], '双均线实盘', 1 , msg, C)
print(msg)
A.waiting_list.append(msg)
检验策略效果
现在计算机理解了你的策略,你现在可以借助计算机的力量来验证你的策略了。基本的检验策略方法有回测和模拟交易两种方法。
回测是让计算机能根据一段时间的历史数据模拟执行该策略,根据结果评价并改进策略。如果结果不好,则需要分析原因并改进。如果结果不错,则可以考虑用模拟交易进一步验证。
模拟交易是让量化软件能根据实际行情模拟执行该策略一段时间,根据结果评价并改进策略。
与回测不同,回测是用历史数据模拟,模拟交易使用实际的实时行情来模拟执行策略的。股市开始交易,真实的行情数据就会实时地发送到量化软件,软件会利用真实的数据模仿真实的市场,执行你的策略程序。同时,你会得到一份实时更新的报告。这报告类似于回测得到的报告,不同的是会根据实际行情变化更新。同样你能据此评估交易策略的好坏。
实盘和模拟一样都会在模型交易信号显示区显示交易信号,区别仅仅在于实盘模式还会向柜台发送实盘交易信号,而模拟模式不会。
策略实盘
实盘交易说白了,就是让电脑跟着实时的市场行情,自动用真钱去执行你定好的交易策略,直接下单操作。跟你说个关键的 —— 这可不是用虚拟资金玩模拟盘,赚了是真落袋,亏了也是真金白银往外掏。
而且实盘交易一般也会给你一份报告,跟模拟盘的报告有点像,还会随时更新。你得盯着这份报告看策略实际跑起来怎么样,要是不行就赶紧调、赶紧改,这样才能让策略一直稳着赚钱。
做量化交易需要做什么?
通常一个投资者做量化交易所需要做的准备,就如同让一个农民自己去造一个大型收割机,而且还是从挖矿开始做起,极度困难,所以量化交易最初在金融与科技最为发达的美国由少数顶级精英发起的。
要有各种数据,要有能方便使用的各种投资相关的数据。这要考虑到各种数据的收集、存储、清洗、更新,以及数据取用时的便捷、速度、稳定。
还要有一套量化交易的底层系统,要有能编写策略、执行策略、评测策略的系统。这要考虑到系统对各种策略编写的支持、系统进行回测与模拟的高仿真、系统执行策略的高速、系统评测策略的科学可靠全方面。
现在有主流量化平台可以提供数据和量化交易的底层系统。QMT和ptrade是两款主流量化交易软件,都可以进行策略编写到实盘全流程,两者各有特点:
QMT由迅投开发,本地运行,支持股票、期货、期权等全品种交易,适合专业开发者编写复杂策略,如高频交易、套利等。需本地部署,编程支持Python和VBA,数据处理灵活,可接入第三方数据。
ptrade由恒生电子开发,云端运行,策略在券商服务器执行,无需本地电脑开机。主打股票、ETF、可转债交易,适合小白用户,支持AI辅助策略生成,交易速度极快(毫秒级),自带Level-2数据,回测速度快。
如果不会编程写代码,但又好策略想实现,也可以联系笔者代写
量化交易开通步骤
如何开通量化软件QMT、PTrade
根据笔者目前对接券商(文末扫码获取vip官方app开户链接),限时入金10万就可以开通
佣金费率
股票佣金最低可以做到万0.854