如何制定一条量化交易的学习路线?

计算机专业在校大学生,从零开始,想要使自己在量化交易这方面能够做出点成绩,请问合理有限的学习路线该如何制定?怎样才能一步步掌握?希望能得到指点以及相关…
关注者
78
被浏览
34,988

9 个回答

题主是计算机专业的,那就再好不过了,至少编程这个拦路虎就可以轻松迈过去了,那我根据个人之前的量化学习经验,腆着脸给你推荐一条快速简洁的量化交易学习路线吧,认可的话可以参考一下,如下:


投资想法 -> 量化基础 -> 量化平台 -> 量化策略


这是抽象的概括,下文会把每个步骤详细讲讲,这里需要确定快速入门的学习原则: 适度学习,够用就行

2021版《新华字典》中,收录了13000多个汉字,而日常生活中只需要用到其中3000多个,也就是说,不用啃完编程书籍等大部头才可以开始,按常用按需学习就行。

一、投资想法

很多人做量化,都是因为自己有初始的投资想法,想验证正确性提高交易胜率,或想解放双手追求效率,全自动程序化盯盘交易,量化跟人工智能AI一样,都是手段,用来实现自己想要的目的,不是为了量化或AI本身而学习。

有初始的投资想法,在开始学习的时候有一个好处,就是可以在学习量化时有的放矢,听到相关的知识点的时候,脑子就会在想,我想要的功能能不能这样实现。 比如,你想实现均线交易策略,那么你在学习pandas模块时,听到rolling和 mean函数 ,就会有“确认过眼神,找到对的人”的赶脚。

如果在投资想法这边还是没有感觉,没初始思路的话可以看看我之前的文章,里面很多策略想法都是从交易书籍、研报论文和市场观察中发现的。

股票&ETF相关策略:

《Barra太复杂,唠一个适合萌新Quant上手的量化基本面多因子模型F-Score》

从股价上涨驱动力出发,构建分析师一致预期成长量化策略

《ETF轮动策略在阻力支撑相对强度RSRS指标加持下起飞》

《两个简单的GARP因子,帮这位量化基金经理,跻身同类Top10(含复现)》

《跟踪『聪明钱』,巧用北向资金进行大盘择时》

《量化萌新向ETF择时策略:当北上资金遇上布林带》

《跟着“基金一哥”张坤量化选股的快乐,你想象不到!》

《小市值因子已然凉凉,绩优小市值依旧狂浪》

《中国版“漂亮50”量化策略》

《鱼身策略懒人爱,量化内卷别乱买》

《手把手教你,利用机器学习模型,构建量化择时策略(附全流程代码)》


商品期货相关策略:

《唠一唠曾在全球量化策略热榜上排名第9的TrendModelSys策略》

《又来唠一唠曾在全球量化策略热榜上排名第6的RUMI策略》

《又来唠一个另类异质量化策略:20后的Trendflex策略》

《『导数』在量化策略中的妙用:日内波动极值vs低阶多项式拟合策略》

《K线标准化结构图:构建一个趋势策略,就是那么朴实无华》

《CTA策略中的Alpha:期限结构之展期收益率策略》

《量化本无妙手,背后都是坚实的本手:波动率不对称性RSJ量化策略》

《兄弟家量化策略很多,拿一个『波动率收敛突破策略』盘一下》

《兄弟家量化策略很多,又拿一个『操盘手策略』盘一下》

《动物庄园:商品期货跨品种套利策略》

《量化同质越来越严重,如何保持策略的长久优势?(附异质化另类量化策略)》

《唠一唠指标之王MACD的另类用法:高低形态短线量化策略》

《股指期货除了无脑吃贴水之外,还有更卷的量化操作策略吗?》


二、量化基础

这里面主要包含两大部分,一个是量化通识,另一个是编程基础。

关于量化通识,看量化故事类的书籍都可以有所了解,以前我也列过一个书单。

《量化投资书单推荐(20本)》

如果没有那么多时间,想快速了解量化投资的方方面面,开始的时候只看这本就够了。

《萌新量化投资入门的第一本书》

关于编程基础,因为不同量化平台的编程语言都不一样,这里只好拿在量化界广泛使用的Python举例。

对于Python的快速学习,墙裂推荐 廖雪峰 老师的Python教程 ,不仅免费写得非常简单易懂,而且每个小节之后,都有编程互动小题目给你即时反馈,非常有趣,不用再想着自己啃完编程大部头再去编写策略,教程链接:

liaoxuefeng.com/wiki/10

廖老师的教程非常详尽,连Web开发都讲了,但是再次重申咱的快速入门学习原则:不贪多,够用就行。对于量化基础而言,学到“错误、调试和测试”章节就可以了,后面等有时间再看。

遗憾的是,里面没有讲到量化常用的numpy和pandas模块,这个可以在学了廖老师课程之后,再单独度娘学习一下。


三、量化平台

对于量化初学者而言,不建议自己搭建量化框架/平台,应该以实现量化策略为主,把数据获取清洗、回测框架搭建和对接实盘接口等工作交给专业团队打理, 因此强烈建议使用现成的第三方量化平台,这里给大家推荐一些。

如果你打算做股票量化交易,可以选择以下5个量化平台,在他们的官网的“帮助中心”里面,都可以找到对应的上手教程和策略模板。

聚宽JoinQuant

joinquant.com

优矿Uqer

uqer.datayes.com

米筐RiceQuant

ricequant.com

掘金量化

myquant.cn

迅投QMT

thinktrader.net


如果你打算做期货/期权/大饼的量化交易,可以选择以下5个量化平台。

交易开拓者TB

tradeblazer.net

vn.py

vnpy.com

文华

wenhua.com.cn

金字塔

weistock.com

MultiCharts

multicharts.cn


TB研究策略和回测什么的都是免费,只有开启实盘时才会在基础手续费上加收一些,以个人观察,现存的很多系列源码,都是以TB居多。

vn.py是一款基于Python的开源量化交易系统开发框架,后来更名为VeighNa,不过大伙儿还是习惯地称之为 vn.py 。由知乎量化大V『用Python的交易员』开发,定位是量化交易平台,提供从交易API对接到策略自动交易的完整解决方案,对接了国内外诸多不同类型的金融市场:证券、期货、期权、外汇、数字货币等。

后面三个就都是收费的了,优点就是编程相对简单一些,缺点就是贵,大家也可以去看看。


四、量化策略

有了编程基础,又选定了量化平台,恭喜你,你终于有能力实现自己最初的投资想法了,量化策略是投资想法的逻辑化和程序化展现。

由于每个人的投资想法不尽相同,只好举一个简单的双均线交易策略为例进行描述,因为“双均线”这是一个接触到投资交易,都基本会听过的词儿,“专家”告诉你在金叉的时候买,在死叉的时候卖,那实际效果到底是怎么样的呢?

在聚宽JoinQuant量化平台上,拿 茅台 作为交易标的,咱定义5日均线和20日均线在出现金叉的时候,第二天一开盘就全仓买入,出现死叉时,就把所有持仓全部卖出,策略代码如下。

如果已经看完廖老师的前几章课程,这代码就大概能看懂七七八八了,剩下的再结合平台的API说明就能全部弄清楚了。

大概的实现流程就是,在初始化函数initialize中设置了交易标的、策略参数和交易费率,以及定义了一个每天在开盘运行的函数stock_trade,并且开启了“防未来函数”功能。在 stock_trade函数 里面,计算昨天和前天的5日均线和20日均线,如果金叉就买入,死叉就卖出。

# 导入函数库
from jqdata import *
# 初始化函数,设定基准等等
def initialize(context):
    # 交易的股票
    g.stock = '600519.XSHG'
    # 长短均线参数
    g.short_len = 5
    g.long_len = 20
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 过滤掉order系列API产生的比error级别低的log
    log.set_level('order', 'error')
    # 打开防未来函数
    set_option('avoid_future_data', True)
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    # 开盘时运行
    run_daily(stock_trade, time='open', reference_security='000300.XSHG')
## 开盘时运行函数
def stock_trade(context):
    stock = g.stock
    short_len = g.short_len
    long_len = g.long_len
    # 获取股票的收盘价
    # 当取日线数据时, 不包括当天的, 即使是在收盘后,没有未来
    data = attribute_history(stock, long_len+1, '1d', ['close'])
    # 计算双均线数据
    data['ma5'] = data['close'].rolling(short_len).mean()
    data['ma20'] = data['close'].rolling(long_len).mean()
    # 昨日MA5和MA20数值
    ma5 = data['ma5'].iloc[-1]
    ma20 = data['ma20'].iloc[-1]
    # 前日MA5和MA20数值
    pre_ma5 = data['ma5'].iloc[-2]
    pre_ma20 = data['ma20'].iloc[-2]
    # 取得当前的可使用的资金
    cash = context.portfolio.available_cash
    # 如果昨日出现金叉,则今日开盘买入
    if (pre_ma5 < pre_ma20) and (ma5 > ma20) and (cash > 0):
        # 用所有资金买入股票
        order_value(stock, cash)
        # 输出买入信息
        log.info(">>> %s 买入 %d 股 %s" % (str(context.current_dt), 
        context.portfolio.positions[stock].today_amount, stock))
    # 如果昨日出现死叉,则今日开盘全部卖出