十行代码带你量化交易入门

论坛 期权论坛 期权     
期权匿名问答   2022-1-11 14:27   15910   20
更新20180814,建议零基础新手直接看这个最新的
量化交易零基础入门教程
特点


  • 从零开始教编程。 靠谱的量化交易学习资源稀少,且具有不讲编程、代码较难、过多等不适合新手等问题,本教程中则会从零开始教编程,解决量化入门过难过编程门槛这一问题。
  • 量化与编程相结合。本教程不仅会教编程,而且会尽量结合量化情景,减少“我要做量化交易为什么要看这些用来培训程序员的东西”的愤懑。
  • 简易精炼,快速入门。尽量只讲最核心最常用的知识,助你快速摆脱想学习量化却处处陌生不知所措的茫然的新手阶段。
------
【更新】新手入门系列文章:特点是通过一个个简单的策略为例,手把手教你实践,并在过程中介绍基础的编程与量化知识,在知乎上累计获赞3500+(本文章加上一个同内容的2500+回答)。强烈推荐。
【新手入门教程】十行代码带你量化交易入门 - JoinQuant-TWist
【新手入门教程】多股票策略 - JoinQuant-TWist
【新手入门教程】简单市值轮动策略 - JoinQuant-TWist
【新手入门教程】市值轮动策略2.0 - JoinQuant-TWist
【新手入门教程】市值轮动策略3.0 - JoinQuant-TWist
-------------------
说起量化交易入门,很多时候得到的答案都是长长的书单,让人望而却步。
这里,就为新手准备了这篇文章--十行代码带你量化交易入门
数据获取,策略回测,行情链接,交易信号,直接体验整个量化交易的核心流程,立刻学会并跟着做起来!
这里,就为新手准备了这篇文章--十行代码带你量化交易入门
学习内容:


  • 学会写一个简单的量化交易策略
  • 理解策略的基本框架
  • 学会建立连接实盘的模拟交易,并使其自动发送交易的信号到微信

首先,进入JoinQuant,点击导航栏我的策略,新建策略,进入策略编辑画面,如图。
左侧是编写策略代码,右侧是策略运行结果。我们就在左侧写策略代码。


下面教你用10行代码写个量化交易策略——单股票均线策略

1 确定策略内容与框架

若昨日收盘价高出过去20日平均价今天开盘买入股票
若昨日收盘价低于过去20日平均价今天开盘卖出股票
只操作一只股票,很简单对吧,但怎么用代码说给计算机听呢?
想想人是怎么操作的,应该包括这样两个部分

  • 既然是单股票策略,事先决定好交易哪一个股票。
  • 每天看看昨日收盘价是否高出过去20日平均价,是的话开盘就买入,不是开盘就卖出。每天都这么做,循环下去
对应代码也是这两个部分
def initialize(context):
    用来写最开始要做什么的地方
def handle_data(context,data):
    用来写每天循环要做什么的地方
答疑与延伸:


  • def后面的空格和最后的冒号不能少!
  • 符号都要用英文输入法!
  • 为什么这么写?就这么规定的,先别管了。
  • handle_data 按天循环时,如此处,其中的操作都是在9:30执行。
  • 毫无编程基础?,丝毫不懂变量,函数,if else的,还是先到量化课堂的编程部分学习下python语言吧。
几乎所有策略都基于这个基本的策略框架:先初始化,然后循环操作
1 初始化,即最开始要做的事情,如选定股票,设置变量、参数等等
2 周期循环:即每个周期要做的事情,如计算指标,买入卖出等,周期可能是分钟,天等,本文策略的周期是一天。当你要做一些盘中短线操作的时候,周期就要调成分钟,先别着急会遇到的。
2 初始化

我们要写设置要交易的股票的代码,比如 兔宝宝(002043)
def initialize(context):
    g.security = '002043.XSHE'# 存入兔宝宝的股票代码
答疑与延伸:


  • “g.”是什么?全局变量前都要写”g.”,全局变量就是全局都能用的变量,一般变量只能在该函数下使用。如security不加”g.”,只能在第一部分即initialize里用,不能在第二部分handle_data里用。不懂什么是变量的,到量化课堂的python编程里学习下基础内容,或者问问度娘。
  • “XSHE”是什么? 股票代码使用时要加后缀,深交所股票代码后缀为 “.XSHE “,上交所股票代码后缀为 “.XSHG”。
  • 代码中“#”是什么?”#“后的内容都是注释,是为代码做说明的,不会被计算机当做代码处理。
3 获取收盘价与均价

首先,获取昨日股票的收盘价
# 用法:变量 = data[股票代码].close
last_price = data[g.security].close# 取得最近日收盘价,命名为last_price
然后,获取近二十日股票收盘价的平均价
# 用法:变量 = data[股票代码].mavg(天数,‘close’)
# 获取近二十日股票收盘价的平均价,命名为average_price
average_price = data[g.security].mavg(20, 'close')
答疑与延伸:


  • data是什么?
  • data[股票代码]后面除了平均价.mavg还能接什么?
4 判断是否买卖

数据都获取完,该做买卖判断了
# 如果昨日收盘价高出二十日平均价, 则买入,否则卖出
if last_price > average_price:
    买入
elif last_price < average_price:
    卖出
问题来了,现在该写买卖下单了,但是拿多少钱去买我们还没有告诉计算机,所以每天还要获取账户里现金量。
# 用法:变量 = context.portfolio.cash
cash = context.portfolio.cash# 取得当前的现金量,命名为cash
答疑与延伸:


  • context.portfolio 是什么?
这句看着有点复杂,先记住吧。然后我们看看买入卖出怎么写。
5 买入卖出

# 用法:order_value(要买入股票股票的股票代码,要多少钱去买)
order_value(g.security, cash)# 用当前所有资金买入股票
# 用法:order_target(要买卖股票的股票代码,目标持仓金额)
order_target(g.security, 0)# 将股票仓位调整到0,即全卖出
答疑与延伸:


  • 为什么没有指定交易价格?此策略是按天回测进行的且使用的较为简单的市价单下单方法,交易价格为开盘价(加上滑点)
  • 无法交易的情况?涨跌停,停牌,T+1制度等无法交易的情况,系统会自动使下单不成交并在日志中发出警告。
  • 滑点是什么?
  • 下单方法有哪些?

6 策略代码写完,进行回测

把买入卖出的代码写好,策略就写完了,如下
def initialize(context):#初始化
    g.security = '002043.XSHE'# 股票名:兔宝宝
def handle_data(context, data):#每日循环
    last_price = data[g.security].close# 取得最近日收盘价
    # 取得过去二十天的平均价格
    average_price = data[g.security].mavg(20, 'close')
    cash = context.portfolio.cash# 取得当前的现金
    # 如果昨日收盘价高出二十日平均价, 则买入,否则卖出。
    if last_price > average_price:
        order_value(g.security, cash)# 用当前所有资金买入股票
    elif last_price < average_price:
        order_target(g.security, 0)# 将股票仓位调整到0,即全卖出
现在,在策略回测界面右上部,设置回测时间从20140101到20160601,设置初始资金100000,设置回测频率,然后点击运行回测。


答疑与延伸:


  • 什么是回测?回测是量化交易策略研究中的关键,是指给定一段时间的历史数据(如此处是20140101到20160601的每日数据),计算机按照所编写的策略进行模拟仿真交易,以测试策略效果好坏。
如果你代码没有问题,就会顺利的进行回测,回测结果如下图:


至此,你就完成了一个简单策略的回测了。
答疑与延伸:


  • 如何根据回测结果评价策略好坏?很初级地讲,有三:

  • 盈利能力:策略收益与年化收益高,则说明盈利能力强。盈利能力不行说啥都没用。
  • 盈利稳定性:最大回撤要低。最大回撤是指最大亏损幅度,50%则意味着历史上看最大亏损率为50%。
  • 回测可靠性:交易次数要多。交易次数越多意味着经历了越多次的检验,回测的结果也越可靠。
    更多说明见:风险指标说明


  • 这个策略回撤大,交易次数少,只交易一只股票,并不靠谱。但是结构简单适合新手入门理解整个流程。

7 建立模拟交易,使策略和行情实时连接自动运行

策略写好,回测完成,点击回测结果界面(如上图)右上部红色模拟交易按钮,新建模拟交易如下图。


写好交易名称,设置初始资金,数据频率,此处是每天,设置好后点提交。
答疑与延伸:


  • 模拟交易创建成功后,需要等待A股至少开盘一次,才能查看模拟交易结果。
8 开启微信通知,接收交易信号

点击聚宽导航栏我的交易,可以看到创建的模拟交易,如下图。


点击右边的微信通知开关,将OFF调到ON,按照指示扫描二维码,绑定微信,就能微信接收交易信号了。
当策略买卖操作,微信会收到信号提醒类似下图。


答疑与延伸:


  • 能不能自动下单?【重磅】聚宽和一创、广发、国君都对接了实盘交易,实现全自动量化交易!目前自动化实盘已开放使用,添加小助手微信18141907163 领取实盘开启指引。

自测与自学

  • 能否理解整个策略框架。
  • 能否成功编写单股票均线策略,成功回测,建立模拟,开启微信通知。
  • 能否理解年化收益,最大回撤。
  • 浏览JoinQuant 导航栏-帮助-常见问题
之后的文章,将在本文的基础上,进行深入和扩展,比如多股票,指标获取,大盘择时等,旨在帮助对量化交易有兴趣的人快速入门,能够自主实现自己心中的想法与策略。
本篇文章和后续将收录到 量化交易&宽客 - 知乎专栏 , 敬请关注:)
更多进阶内容可以到 量化课堂 - JoinQuant 学习,特点是讲解细致,代码规范,可以在聚宽实践演练。
都看到这里了,不点个赞嘛:)

推荐阅读:
聚宽新手指南  - JoinQuant,干货,答疑,指路,一应俱全。
分享到 :
0 人收藏

20 个回复

倒序浏览
2#
期权匿名回答  16级独孤 | 2022-1-11 14:27:50 发帖IP地址来自 北京
也不一定。。。一来是文章里的策略太简单了,二来是JoinQuant提供了方便的量化工具,所以会方便非常多。
3#
期权匿名回答  16级独孤 | 2022-1-11 14:28:45 发帖IP地址来自 中国
被图片吸引进来。。想要原图( . )
4#
期权匿名回答  16级独孤 | 2022-1-11 14:29:30 发帖IP地址来自 北京
哪一个?
5#
期权匿名回答  16级独孤 | 2022-1-11 14:29:35 发帖IP地址来自 黑龙江哈尔滨
原来就是python
6#
期权匿名回答  16级独孤 | 2022-1-11 14:30:17 发帖IP地址来自 北京
!就是要这种入门贴 破除神秘感
7#
期权匿名回答  16级独孤 | 2022-1-11 14:30:26 发帖IP地址来自 中国
正在学习中。
8#
期权匿名回答  16级独孤 | 2022-1-11 14:31:01 发帖IP地址来自 北京
感觉好简单,量化巨塔的形象崩溃了,感觉公司里的量化部门是骗子...
9#
期权匿名回答  16级独孤 | 2022-1-11 14:31:45 发帖IP地址来自 北京
哈,好实用的赤脚矿工速成教材~
10#
期权匿名回答  16级独孤 | 2022-1-11 14:32:33 发帖IP地址来自 北京
老板最常说的一句话就是先跑起来,然后再慢慢改~
11#
期权匿名回答  16级独孤 | 2022-1-11 14:32:53 发帖IP地址来自 北京
赚也赚不了多少,还是要有基本功啊。
12#
期权匿名回答  16级独孤 | 2022-1-11 14:33:30 发帖IP地址来自 北京
谢谢分享
13#
期权匿名回答  16级独孤 | 2022-1-11 14:33:57 发帖IP地址来自 中国
好玩!
14#
期权匿名回答  16级独孤 | 2022-1-11 14:34:02 发帖IP地址来自 中国
非常好
15#
期权匿名回答  16级独孤 | 2022-1-11 14:34:22 发帖IP地址来自 中国
矿工的一天
16#
期权匿名回答  16级独孤 | 2022-1-11 14:35:22 发帖IP地址来自 北京
请问这个是什么语言实现呢?JAVA吗?
17#
期权匿名回答  16级独孤 | 2022-1-11 14:35:42 发帖IP地址来自 清华大学
python
18#
期权匿名回答  16级独孤 | 2022-1-11 14:36:13 发帖IP地址来自 中国
mark
19#
期权匿名回答  16级独孤 | 2022-1-11 14:37:09 发帖IP地址来自 首都经贸大学
如果我想选择市值最小,pe<100的怎么实现呢?
20#
期权匿名回答  16级独孤 | 2022-1-11 14:37:53 发帖IP地址来自 北京
以后应该会讲。当然,你也可以到JoinQuant网站自己学习下,看看帮助,社区的学习资源,量化课堂等,如果有编程基础应该很容易的。
21#
期权匿名回答  16级独孤 | 2022-1-11 14:38:48 发帖IP地址来自 北京
量化交易都是python写的吗?别的语言可以么?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:400157
帖子:80032
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP