设为首页 收藏本站
查看: 1378|回复: 0

[经验分享] Python零基础该如何学习

[复制链接]

尚未签到

发表于 2018-8-8 11:43:07 | 显示全部楼层 |阅读模式
  这篇文章经过叙述 [单股市均线战略] 在 Ricequant 量化渠道的完成,了解渠道并迅速入门、创立自个的量化战略代码。
  难易度:入门级
  那么以下咱们就先从 [单股市均线战略] 的代码完成及进行日等级回测讲起吧。
1 确定框架:
  [单股票均线策略] 的主要策略框架: 5 日均线高于 30 天均线,则全仓买入股票 5 日均线低于 30 天均线,则卖出所持股票
  从我们日常交易的角度,一般交易者的行为可以拆分以下两部分:
  1 选择标的(初始化):
  在交易之前,我们通常会先选定要交易的股票池或者单个股票
  2 交易(每天盯盘)
  我们会观察该股票的五日均线和 30 日均线,并进行比较 如果该股票的五日均线在 30 天均线以上,则全仓买入股票 如果该股票的五日均线在 30 天均线以下,则全仓卖出(空仓)
  那么程序中,我们是怎么做的呢?
  先看看 Ricequant 平台中对应的代码框架会是怎么样的吧:
  definit(context):#程序的初始化,预设股票池、设置参数和变量。 只运行一次defhandle(context, bar_dict):#从回测的开始日期至结束日期,根据选择的频率(日、分钟)循环运行
  对照策略思路 及 Ricequant 代码框架,你会发现我们可以很轻松地把 两者结合起来
  以上框架也是 Ricequant 平台的最基本也最主要的框架,也就是

  •   初始化
  •   循环 - 根据选择的频率(日、分钟)循环运行
2 初始化:
  选择标的:本策略的交易股票设定为 300059 ”东方财富“。
  definit(context):   context.stock ="300059.XSHE" # 存入目标股票 [东方财富 ]
  延伸阅读:
  1 在 init 中实现程序的初始化,例如存入目标股票池,设置滑点、基准等参数以及设置其它变量。 context 是一个全局的容器,你可以通过它设置任何全局变量并初始化:如 context.stock 将会在后面代码所被调用到。
  2 代码中 # 代表注释,作为代码说明,执行时会被跳过而不为程序所运行。
  3 如何填写股票代码:你会发现策略代码中 股票代码后带有后缀,那么它们分别代表什么呢?
  后缀为

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

  •   300059.XSHE 为深交所上市的东方财富
  •   600000.XSHG 为上交所上市的浦发银行
  我们的代码编辑器还提供了非常便利的股票代码自动寻找和补全功能,在 Windows 中你可以用 ctrl+i , Mac 系统你可以用 cmd+i 激活证券代码自动补全功能。如下图:
DSC0000.jpg

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 判断买卖条件:
  获得均价数据之后,我们就可以进行一个判断决定是否买卖了:
  iffast>slow:# 若快线在慢线之上则用所有现金买入该股票         #买入操作                 eliffast<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 策略回测
  以上,我们用几行代码就把策略的框架完整地搭建起来了,最终的完整代码为:
  definit(context): #初始化   context.stock ="300059.XSHE"       #存入要交易的股票代码defhandle_bar(context, bar_dict):       #每日循环运行  #获取 30 日均线    slow = bar_dict[context.stock].mavg(30, frequency=&apos;day&apos;)  #获取 5 日均线    fast = bar_dict[context.stock].mavg(5, frequency=&apos;day&apos;)      cash = context.portfolio.cash                  #获取持有现金金额    iffast>slow:                                  #判定买入条件        order_value(context.stock, cash)        #买入目标股票    eliffast<slow:        order_target_percent(context.stock,0)  #卖出目标股票
  写完了策略,那么我们接下去做什么呢? 先对我们的策略进行一次历史回测,看看它的历史表现是如何吧。
  在策略编辑页面右上方,选择从 2015 年 1 月 4 日至 2016 年 10 月 4 日,用资金 10 万元进行日回测吧,请点击 运行回测
DSC0001.jpg

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

  我们可以看到回测详情中有精致的图表,详细的各项风险收益指标、以及持仓、落单等详情辅助你进一步了解你的策略的表现。
  到这里,一个完整的从 [构建策略思路] 到 [策略代码编写] 到 [回测结果检验] 的流程就结束了。
7 从日回测到分钟回测:
  在循环部分, handle 函数根据选择的频率(日、分钟)循环运行,在以上的日回测中, handle 内的代码会每日被触发一次
  defhandle(context, bar_dict):
  如果是进行分钟回测或模拟实盘,那么这个 handle 里的代码就会被每分钟触发一次;
  因此,我们的代码逻辑也势必要进行一定的改进,使得策略按照我们的逻辑正常地运行。
  我们先把修改好的代码贴上来:
  definit(context):   context.stock ="300059.XSHE"# 每日开盘前运行一次,可以进行选股、设置参数等行为    defbefore_trading(context):   # 设定并重置 context.fired 的值为 0   context.fired =0   #从回测的开始日期至结束日期,根据选择的频率(日、分钟)循环运行defhandle_bar(context, bar_dict):   # 判定今日是否有下过单,若未下单则进行下列代码的操作   if(context.fired ==0):        slow = bar_dict[context.stock].mavg(30, frequency=&apos;day&apos;)        fast = bar_dict[context.stock].mavg(5, frequency=&apos;day&apos;)        cash = context.portfolio.cash                iffast>slow:            order_value(context.stock, cash)        eliffast < slow:            order_target_percent(context.stock,0)        # 设置 fired 等于 1 ,表示执行完毕                 context.fired =1
  可以看到这里改动并不多,
  这里需要介绍到框架中常用到的函数 before_trading :
  # 每日开盘前运行一次,可以进行选股、设置参数等行为    defbefore_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 万元进行分钟回测吧,请点击 运行回测 DSC0003.jpg
8 模拟交易:
  模拟交易通过实时的分钟切片数据进行撮合,也就是 handle 函数会每分钟被触发一次循环。在开启你的策略的模拟交易之前,你必须要对它进行一次分钟回测,才可以开启模拟交易。 在上面分钟回测之后,你可以在策略回测详情页面点击 开启模拟交易。然后你将在模拟交易列表中看到进行中的策略。
DSC0004.jpg

9 开启微信通知,接收交易信号:
  点击导航栏中的 [我的策略] ,可以在 [模拟交易] 一栏看到创建的模拟交易,如下图:
DSC0005.jpg

  点击右边的微信通知开关,将 OFF 调至 ON ,并按照指示扫描二维码,绑定微信,就能通过微信接收交易信号了。
  当该策略进行买卖操作,你的微信会收到类似下图的信号提醒。微信推送的延迟非常小,使得你能根据信号进行及时的下单操作。
DSC0006.jpg

  是不是很轻松,数行代码就可以把你的出资战略成为代码,我们都来试试吧!
  原文链接:http://www.magedu.com/71651.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548622-1-1.html 上篇帖子: 使用python编写一个登录接口 下篇帖子: 常用的python模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表