Python零基础学习

作者:Wanxin Sun 来源: https://www.ricequant.com/community/topic/2095/?tum_source=tab

本文通过讲述 [单股票均线策略] 在 Ricequant 量化平台的实现,熟悉平台并快速入门、创建自己的量化策略代码。

难易度:入门级

那么以下我们就先从 [单股票均线策略] 的代码实现及进行日级别回测讲起吧。

1 确定框架:

[单股票均线策略] 的主要策略框架: 5 日均线高于 30 天均线,则全仓买入股票 5 日均线低于 30 天均线,则卖出所持股票

从我们日常交易的角度,一般交易者的行为可以拆分以下两部分:

1 选择标的(初始化):

 在交易之前,我们通常会先选定要交易的股票池或者单个股票

2 交易(每天盯盘)

我们会观察该股票的五日均线和 30 日均线,并进行比较
如果该股票的五日均线在 30 天均线以上,则全仓买入股票
如果该股票的五日均线在 30 天均线以下,则全仓卖出(空仓)  

那么程序中,我们是怎么做的呢?

先看看 Ricequant 平台中对应的代码框架会是怎么样的吧:

def init(context):#程序的初始化,预设股票池、设置参数和变量。 只运行一次def handle(context, bar_dict):#从回测的开始日期至结束日期,根据选择的频率(日、分钟)循环运行

对照策略思路 及 Ricequant 代码框架,你会发现我们可以很轻松地把 两者结合起来

以上框架也是 Ricequant 平台的最基本也最主要的框架,也就是

  • 初始化
  • 循环 - 根据选择的频率(日、分钟)循环运行

2 初始化:

选择标的:本策略的交易股票设定为 300059 ”东方财富“。

def init(context):
    context.stock = "300059.XSHE"   # 存入目标股票 [东方财富 ] 

延伸阅读:

1 在 init 中实现程序的初始化,例如存入目标股票池,设置滑点、基准等参数以及设置其它变量。 context 是一个全局的容器,你可以通过它设置任何全局变量并初始化:如 context.stock 将会在后面代码所被调用到。

2 代码中 # 代表注释,作为代码说明,执行时会被跳过而不为程序所运行。

3 如何填写股票代码:你会发现策略代码中 股票代码后带有后缀,那么它们分别代表什么呢?

后缀为

  • XSHE 代表在深交所上市交易的股票
  • XSHG 在上交所上市交易的股票

例子:

  • 300059.XSHE 为深交所上市的东方财富
  • 600000.XSHG 为上交所上市的浦发银行

我们的代码编辑器还提供了非常便利的股票代码自动寻找和补全功能,在 Windows 中你可以用 ctrl+i , Mac 系统你可以用 cmd+i 激活证券代码自动补全功能。如下图:

3 获取均价:

我们分别获取该股票 5 日和 30 日的均价

# 用法:变量 = bar_dict[股票代码].mavg(天数, frequency='day')# 获取近五日股票收盘价均价,命名为 fast
    fast = bar_dict[context.stock].mavg(5, frequency='day')#  同上,获取近二十日的收盘价均价,命名为 slow :
    slow = bar_dict[context.stock].mavg(30, frequency='day')

4 判断买卖条件:

获得均价数据之后,我们就可以进行一个判断决定是否买卖了:

    if fast>slow: # 若快线在慢线之上则用所有现金买入该股票
          #买入操作
              
    elif fast<slow:# 若慢线在快线之上则清空所持股票
             #卖出操作

在判断之前,我们还漏了一步,那是什么呢?就是要知道我们有多少现金,那么在程序中是如何获得现金的呢?我们使用以下代码

# 用法:变量 = context.portfolio.cashcash = context.portfolio.cash #取得当前的现金量,命名为 cash

延伸阅读: portfolio 中 包含所有的投资组合的信息,请参考文档 - Portfolio 对象

5 买入 /卖出:

在判定买卖的条件成立之后,我们会对股票进行买入或者卖出的操作:

#用法 order_value(股票代码,买卖金额)   金额为正则为买入,负数则为卖出#将所有现金买入 300059 东方财富order_value(context.stock, cash) 

#用法: order_target_value(股票代码,目标持仓比例)   比例在 1 与 0 之间#此处将持仓比例调整为 0 ,则等同于全部卖出order_target_percent(context.stock, 0) 

6 策略回测

以上,我们用几行代码就把策略的框架完整地搭建起来了,最终的完整代码为:

def init(context):  #初始化
    context.stock = "300059.XSHE"         #存入要交易的股票代码def handle_bar(context, bar_dict):        #每日循环运行  #获取 30 日均线    slow = bar_dict[context.stock].mavg(30, frequency='day')   
#获取 5 日均线    fast = bar_dict[context.stock].mavg(5, frequency='day')   
    cash = context.portfolio.cash                  #获取持有现金金额    if fast>slow:                                  #判定买入条件        order_value(context.stock, cash)         #买入目标股票    elif fast<slow:        order_target_percent(context.stock, 0)   #卖出目标股票  

写完了策略,那么我们接下去做什么呢? 先对我们的策略进行一次历史回测,看看它的历史表现是如何吧。

在策略编辑页面右上方,选择从 2015 年 1 月 4 日至 2016 年 10 月 4 日,用资金 10 万元进行日回测吧,请点击 运行回测

如代码没有问题,在数秒之后,我们就会拿到该策略的历史表现结果:

我们可以看到回测详情中有精致的图表,详细的各项风险收益指标、以及持仓、落单等详情辅助你进一步了解你的策略的表现。

到这里,一个完整的从 [构建策略思路] 到 [策略代码编写] 到 [回测结果检验] 的流程就结束了。

7 从日回测到分钟回测:

在循环部分, handle 函数根据选择的频率(日、分钟)循环运行,在以上的日回测中, handle 内的代码会每日被触发一次

def handle(context, bar_dict):

如果是进行分钟回测或模拟实盘,那么这个 handle 里的代码就会被每分钟触发一次;

因此,我们的代码逻辑也势必要进行一定的改进,使得策略按照我们的逻辑正常地运行。

我们先把修改好的代码贴上来:

def init(context):
    context.stock = "300059.XSHE"# 每日开盘前运行一次,可以进行选股、设置参数等行为    def before_trading(context):
    # 设定并重置 context.fired 的值为 0
    context.fired = 0
    #从回测的开始日期至结束日期,根据选择的频率(日、分钟)循环运行def handle_bar(context, bar_dict):
    # 判定今日是否有下过单,若未下单则进行下列代码的操作
    if (context.fired == 0):
        slow = bar_dict[context.stock].mavg(30, frequency='day')
        fast = bar_dict[context.stock].mavg(5, frequency='day')
        cash = context.portfolio.cash        
        if fast>slow:
            order_value(context.stock, cash)        elif fast < slow:
            order_target_percent(context.stock, 0) 
        # 设置 fired 等于 1 ,表示执行完毕           
        context.fired = 1

可以看到这里改动并不多,

这里需要介绍到框架中常用到的函数 before_trading :

# 每日开盘前运行一次,可以进行选股、设置参数等行为    def before_trading(context):

我们在 before_trading 中设置一个变量命名为 fired ,赋值为 0

    # 设定并重置 context.fired 的值为 0
    context.fired = 0

由于 before_trading 是每天开盘前运行一次,所以 context.fired 会被每天重置为 0

在 handle 函数中,我们加入了判断,如 context.fired 为 0 ,则继续执行下面的代码,否则本次循环结束。

# 判定今日是否有下过单,若未下单则进行下列代码的操作
	if (context.fired == 0):

并在执行完判断和买卖操作之后,设定 context.fired 的值等于 1 ,使得当日余下的分钟循环操作均被跳过。

# 设置 fired 等于 1 ,表示今天已下过单            
			context.fired = 1

在完成以上代码后,我们开始进行分钟回测吧: 在策略编辑页面右上方,选择从 2015 年 1 月 4 日至 2016 年 10 月 4 日,用资金 10 万元进行分钟回测吧,请点击 运行回测

8 模拟交易:

模拟交易通过实时的分钟切片数据进行撮合,也就是 handle 函数会每分钟被触发一次循环。在开启你的策略的模拟交易之前,你必须要对它进行一次分钟回测,才可以开启模拟交易。 在上面分钟回测之后,你可以在策略回测详情页面点击 开启模拟交易。然后你将在模拟交易列表中看到进行中的策略。

9 开启微信通知,接收交易信号:

点击导航栏中的 [我的策略] ,可以在 [模拟交易] 一栏看到创建的模拟交易,如下图:

点击右边的微信通知开关,将 OFF 调至 ON ,并按照指示扫描二维码,绑定微信,就能通过微信接收交易信号了。

当该策略进行买卖操作,你的微信会收到类似下图的信号提醒。微信推送的延迟非常小,使得你能根据信号进行及时的下单操作。

是不是很轻松,数行代码就可以把你的投资策略变成代码,大家都来试试吧!

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2017-05-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

同样是5年的开发经验,差距在哪里了?

我现在就职于一家中型的互联网企业,去年年底入职的薪资和待遇都很不错,但是总结起来说的好听就是全村人的希望,说的不好听就是一个人几乎干了一个项目组的事。

11860
来自专栏维恩的派VNPIE

vn.py多账户交易系统配置思路

本文主要介绍了一个‘如何利用多个账号同时进行交易’的思路。感谢‘图扬量化’在「维恩的派」论坛内的分享!(下为原贴)

27930
来自专栏FreeBuf

简谈渗透测试各阶段我常用的那些“神器”

本人所有文章都很用心的写作完成,并时常总结如何分享更有用的东西给朋友们。这篇更是如此,晚上准备到凌晨四点开始写作,为了需要的朋友而写,不喜欢的右上角点叉不要像上...

68530
来自专栏玄魂工作室

CTF实战21 CTF题目练习和讲解三(讲解部分)

该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

11820
来自专栏华章科技

600万密码泄露之后,我们该如何保护自己的密码?

近日,乌云网曝出大麦网(damai.com)用户密码数据库在网上公开售卖,涉及用户多达600余万!

7920
来自专栏Bug生活2048

这些数据库,你都用过吗

关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格...

18710
来自专栏领域驱动设计DDD实战进阶

领域驱动设计之体系架构模式交互过程与最佳实践

423110
来自专栏FreeBuf

币圈用户请小心!WebInjects可以清空你的加密货币账户

网络犯罪分子正在尝试各种各样的方法来将他们的“罪恶之手”伸向广大用户的加密货币钱包。研究人员发现,攻击者正在利用能够劫持浏览器(中间人攻击的一种)的恶意软件来劫...

29640
来自专栏Data Analysis & Viz

手把手教你完成一个数据科学小项目(1):数据爬取

请先阅读“中国年轻人正带领国家走向危机”,这锅背是不背? 一文,以对“手把手教你完成一个数据科学小项目”系列有个全局性的了解。

18920
来自专栏FreeBuf

防范数据窃取从了解其手法做起

数据窃取是针对组织攻击链中的最后一个阶段。攻击者窃取数据的技术可谓花样百出,网上也有大量关于数据窃取方面的技术文档以及工具。本文的目的就是尽可能的将这些技术整合...

7930

扫码关注云+社区

领取腾讯云代金券