本文约5800字,建议阅读10分钟
本文介绍了语言模型是如何感知时间的。
量化,简单说就是程序+交易→盈利。
程序员,或许内心深处都怀揣着一个量化投资的梦想,渴望凭借自己的编程和人工智能技能,再补点基础的金融知识,我们便可以构建一个量化交易系统,轻松实现财富自由。这样的理想确实诱人,似乎让我们看到了轻松实现个人价值的可能性,也让我们看到了用代码改变世界的力量。
不过丑话说在前面,“钱难挣屎难吃”,量化交易也是一样。这领域的风险、机遇肯定都不会少,当然水的深浅可能要试了才知道,我只是小韭菜,对量化的认识肯定有不到位的地方,而本篇入门文章就当作抛砖引玉。
回到正文,对于量化交易,神秘感还是满满的,相关的介绍比较零散,很多就是一上来就是屠龙之术,告诉你一个看上去很牛逼的策略,很难系统地了解整个概念及流程。在此,本文系统梳理量化交易的基本概念,实践过程,并附上相关资料/代码,为quant小白填填坑。
1、量化交易的概念
投机如山岳一样古老,华尔街没有新鲜事
在研究量化投资策略之前,建议补充下相关的金融知识(可以百度下各种名词术语),有空可以再读几本金融理财方面经典的书,可以形成一些金融市场基本的概念,养成一些投资理念。
价值 : 我对投资的思考
富爸爸穷爸爸
投资中最简单的事
投资最重要的事
指数基金投资指南 -- ETF
随机漫步的傻瓜 : 发现市场和人生中的隐藏机遇
聪明的投资者
证券分析 -- 格雷厄姆
巴菲特致股东的信
穷查理宝典 : 查理•芒格智慧箴言录
量化交易,相较于传统人为主观投资,本质并没有区别。简单来说,通过程序选出合适的股票(或其他),在合适的时机,发起买入或卖出的交易,从中追求盈利。
量化没有创造出新的投资逻辑,也不改变市场的运行和结构,但它用新的科学技术、对实现方法和工具进行了创新——利用了数学统计/人工智能等方法取代人工决策。一般情况,市场研究、基本面分析、选股、择时、下单等都可以由计算机自动完成,在市场进行投资。
而量化投资的核心优势在于:通过计算机分析挖掘因子的能力更强,可以从低信噪比的大数据中获取有价值的信息,可以更好量化风险及收益,决策也更为及时及客观可靠,可以克服情绪及人为操作的局限性。
2、量化交易的市场
量化投资广泛地出现在各种交易市场,如股市、期货、基金、期权、外汇、债券、比特币、NFT等等,有资源交换需求的地方就可以量化交易。这里主要展开介绍下股票和期货市场。
2.1 股市
股票市场:是股票发行和交易的场所,是已经发行的股票转让、买卖和流通的场所。股份公司通过面向社会发行股票,迅速集中大量资金,实现生产的规模经营。而社会资金也可以购买股份公司的股票,谋求财富的增值。
国内股票市场(简称A股)更多的是融资市场的角色,而不是投资市场。主要是为融资服务,卖力IPO,稳定地助力实体经济。(也难怪大A投资层面比较拉胯,毕竟市场的态度就在这。)
再者,国内市场上各种面的分析,诸如基本面分析、技术面、市场面、政策面,各种面都很好,但在我们A股都不够(流泪吃面是大A韭菜的必备休养!)。各种理论也是层出不穷,比如缠论、庄家理论、以及美股推崇的长期价值理论,尽管都很有道理,但经不住现实A股的打击。
归根结底在于,「市场的核心还是基于信息差,真正重要的信息你获取不到的,可能很多还是制造乌烟瘴气的烟雾弹。只能寄望更好的经济预期,以及信息披露及制度完善,打造一个更公平的市场吧!」
那股票量化能不能赚钱?个人感觉量化会比散户有优势(并不是绝对优势)。毕竟股票量化的盈利来源和其他市场上的参与者,并无本质区别,主要可以归因成几个部分:
一是,源于企业自身的价值和成长。能够实现这个收益可能只是A股的理想,因为现实中还是很受各种打击的。毕竟辛苦成长了那么多年,还在3000点徘徊。再遥望下美丽国、阿三的股市,真的格外尴尬。
二是,源于股票价格的非理性波动,并提供更准确的定价。量化的盈利基于市场的失效的前提下,用较低的价格买入被市场低估的“商品”,推动市场价格达到更好的平衡。在热衷跟风炒作的A股上面,这点还是有不错的空间的,量化可以通过大数据中挖掘更多有价值的信息,形成更为理性合理的决策。只要跑赢散户的非理性就有一定的收益。
2.2 期货市场
期货合约(Futures contract),简称期货(Futures),是一种跨越时间的交易方式。买卖双方透过签订合约,同意按指定的时间、价格与其他交易条件,交收指定数量的现货。通常期货集中在期货交易所,以标准化合约进行买卖,但亦有部分期货合约可透过柜台交易进行买卖,称为场外交易合约。交易的资产通常是商品或金融工具。期货的品种有:
农产品期货:如棉花、大豆、小麦、玉米、白糖等。
金属期货:如铜、铝、锡、锌、镍、黄金、白银。
能源期货:如原油、汽油、燃料油。
金融期货: 如国债期货、股指期货。(注: 金融期货的波动性及风险相对较大)
一样的,期货市场在于买卖期货赚取差价。但与股市不同,期货市场的投资操作空间更多(可以做多、做空;支持T+0交易等等),同时杠杆也更大,回撤大,风险高,风险收益可能也高。
个人的感觉,期货是一个负和博弈市场,赢得收益主要来自市场中对手的失误,赢的只有少数信息优势的人。可能期货更适合行业人员,需要敏锐地捕捉行业的机遇。再者通过期现套利对冲实业经营的风险也是很不错的手段。
3、量化交易常见策略
量化策略的方法有五花八门的,搞简单点可以通过基本面、技术面分析获得一些因子进行交易(比如股票猛涨并且近期有所收缓,利用相关指标简单设定一个 RSI大于80就抛出股票),复杂点还可以利用各种各样数据,结合人工智能分析预测、高频交易什么的。
这里我按照个人不深刻的理解,如下归类大概量化策略:
A. 多因子选股模型:用“因子”来识别股票和市场的特征,在因子的帮助下评估价格,买入价格偏低的,卖出价格偏高的股票。比如根据RSI设计一个反转因子,RSI非常高,过度高涨,后面可能就容易跌。再根据过去时间T内的加权平均涨幅设计动量因子,通过结合多个因子做打分/回归建模预测未来收益。
常见的因子有:
价值因子:市盈率、市净率、现金流等财务指标(估值低的票容易涨);
成长因子:过去三年期间的净利润和营收的复合增长率(高增长的票容易涨);
动量因子:过去时间T内的加权平均涨幅(趋势是否确立);
波动率因子:如果股票的波动率偏低,它后续往往会涨(市场风险偏好);
流动性因子:如果股票的换手率偏低,它后续往往会涨(缩量筑底);
情绪因子:如果统计分析显示,市场参与者普遍偏乐观,一般会涨;
资金流因子:如果大盘、板块、个股持续有资金流入,往往会涨;
板块因子:如果一个板的热点股票涨了,往往整个板块的股票都会涨;
盘口因子:在十档盘口上,如果买挂单比卖挂单强势,短期往往会涨;
反转因子,通俗地说,就是涨多了的股票可能要跌,跌多了的股票可能要涨。
来源:幻方量化18问
市场常见的多因子模型有:
B. 价值投资策略:通过基本面分析,如市盈率、市净率、现金流、净利润和营收的复合增长率等财务指标,分析公司的盈利模式是否可靠,预估未来价值,在价格较低的时候考虑买入。
C. 事件驱动策略:及时根据政策变化(货币政策、外汇、行业政策)、自然因素变化制定对应策略,这个应该是炒股、期货必知策略。比如:当有加息计划,大家就会考虑把股票的钱存银行,获得更多无风险利益,可能要适当减持些股票;当有自然灾害,可能农作物期货价值就会上升,可以做多。
D. 对冲策略:通过投资组合的多样化来降低市场风险的策略。对冲策略的核心思想是利用不同资产之间的价格波动来抵消彼此的风险,从而降低整体投资组合的风险。对冲策略的具体操作方式有很多种,包括配对交易、套利交易、期权交易、alpha对冲等。比如经典的配对交易对冲策略,当两个合约有很强的相关性时,可能存在相似的变动关系,两种合约之间的价差会维持在一定的水平上。当市场出现变化时,两种合约之间的价差会偏离均衡水平。此时,可以买入其中一份合约同时卖出其中一份合约,当价差恢复到正常水平时平仓,获取收益。
E. 高频交易策略:其核心思想是利用市场价格的短期波动来获取利润。通过高频数据分析和预测,投资者可以快速地买入和卖出股票、期货和其他金融产品,以捕捉微小的价格差异和波动。这种策略通常依赖于高速交易系统和算法,以在毫秒或更短的时间内执行交易决策,具有较高的交易频率和风险,但同时也具有较高的潜在收益。
F. 量化择时策略:通过分析历史数据、市场趋势、投资者情绪等因素,预测未来的市场走势,做为投资决策。常用的有趋势择时、市场情绪择时、牛熊线、神经网络预测、统计套利等方法。比如经典的双均线趋势跟踪策略,当近短期上升趋势比之前有所突破就可以考虑入手,反之可以考虑抛出。如下附上经典的双均线策略示例:
#encoding:gbk
import pandas as pd
import numpy as np
import datetime
"""
示例说明:
当短期均线由上向下穿越长期均线时做空
当短期均线由下向上穿越长期均线时做多
策略讲解:https://www.myquant.cn/docs/python_strategyies/153
"""
class a():
pass
A = a() #创建空的类的实例 用来保存委托状态
#ContextInfo对象在盘中每次handlebar调用前都会被深拷贝, 如果调用handlebar的分笔不是k线最后分笔 ContextInfo会被回退到深拷贝的内容 所以ContextInfo不能用来记录快速交易的信号
def init(C):
# 回测代码
A.acct = '88'
A.acct_type= "STOCK"
A.stock= C.stockcode + '.' + C.market #品种为模型交易界面选择品种
#A.acct= account #账号为模型交易界面选择账号
#A.acct_type= accountType #账号类型为模型交易界面选择账号
A.amount = 10000 #单笔买入金额 触发买入信号后买入指定金额
A.line1=5 #快线周期
A.line2=20 #慢线周期
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.line1},{A.line2}实盘示例{A.stock} {A.acct} {A.acct_type} 单笔买入金额{A.amount}')
def handlebar(C):
#跳过历史k线
if not C.is_last_bar() : #回测
print('is last null')
return
now = datetime.datetime.now()
now_time = now.strftime('%H%M%S')
#跳过非交易时间
if now_time < '093000' or now_time > "150000":
print('非交易时间')
return
# 获取账户信息
#print(get_trade_detail_data(A.acct, A.acct_type, "account"))
#print(get_trade_detail_data(A.acct, A.acct_type, "ACCOUNT"))
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')
print('wait-orders',A.waiting_list,orders)
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]
A.waiting_list = [] #回测修改为0
if A.waiting_list:
print(f"当前有未查到委托 {A.waiting_list} 暂停后续报单")
return
holdings = get_trade_detail_data(A.acct, A.acct_type, 'position')
#print('holdings',holdings)
holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nCanUseVolume for i in holdings}
#print('holdings',holdings)
####核心逻辑代码
# 获取行情数据 1d
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)
量化策略设计开发中,Python编程的入门并不难(可以参考-Python人工智能学习路线的Python学习建议),前期编程只要入门够用就行了,只有交易的思路才是始终的核心!我们除了积累交易经验、学习经典策略,还可以研究各大公司的研报,学习前沿的策略设计,才比较有可能跟得上市场。(有时找ChatGPT聊聊策略,激发些思路也是不错~)
特别地,对于新手而言,个人觉得先学习写一个止盈止损策略是门必修课,先学会如何控制好风险是首要的,其次才是折腾怎么盈利。
4、完整量化交易的流程
可能很多文章讲到量化策略就戛然而止,对于新手很不友好。梳理下量化主要的流程:开通证券账号→搭建量化交易系统及开通实盘交易→设计量化策略→数据获取及处理→开发策略→策略回测→调试优化→实盘交易。
入门量化其实较大的门槛是搭建并开通好量化交易环境,然后才是开发策略代码。
搭建量化交易系统及开通实盘交易
量化交易系统环境的准备,个人不建议在没有较多量化经验的基础就从头折腾交易系统,诸如 编写交易的框架(还有个折中方案,可以折腾下开源的框架)、回测框架、穿透测试、对接实盘接口及调试bugs等等的会很耗费精力。(当然技术过硬的有兴趣折腾的人还是可以试试。)
前期,我们可以直接使用现成量化交易框架,现成的软件可以方便 数据获取,回测验证效果,交易,可以专攻量化策略的实现及优化。先达成效果,再过度优化,也会有比较有效率。
比较常用的量化交易系统有:云核、iquant、迅投QMT、GTrade、极智量化、文
华、TB开拓者、聚宽等,这些平台也大都支持股票、ETF、期货、期权交易。(笔者用的是iquant,目前感觉够用。具体文末微信群咨询。)
策略实盘交易
实盘过程主要还是注意控制风险,设定好止损及合理的仓位,开发好的策略需要梳理好逻辑以及充足的回测,调试好再上实盘交易会比较稳妥,根据实盘表现,定期复盘,改进交易策略,尝试新的交易思路和方法,不断精进交易策略。另外的,最好将前期的资金投入控制少一点,即使已经过充足的回测可以盈利,但回测结果也可能是过拟合,所以实盘前期投入点先试试水也是很有必要的!
我个人是直接先入个几百块做股票量化:实盘买些便宜且稳定的ETF股票(买一手也就100来块),既可以手动交易下熟悉下股票交易流程,也可以挂机跑些简单策略,晚上下班在分析下策略运行结果,做一些调整优化。小资金实盘交易试水,过段时间看下策略效果及市场行情稳定后,再投入较大资金。个人实践表明这样的量化入门效率是比较高的。
文末免责声明:本文观点仅供参考,不作为投资建议哈
编辑:王菁