1. 首页
  2. 未分类

十分钟学会用Python交易股票

“u003Cdivu003Eu003Cpu003Eu003Cstrongu003E本文通过讲述 [单股票均线策略] 在 Ricequant 量化平台的实现,熟悉平台并快速入门、创建自己的量化策略代码。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E难易度:入门级u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E那么以下我们就先从 [单股票均线策略] 的代码实现及进行日级别回测讲起吧。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E1 确定框架:u003Cu002Fpu003Eu003Cpu003E[单股票均线策略] 的主要策略框架: 5 日均线高于 30 天均线,则全仓买入股票 5 日均线低于 30 天均线,则卖出所持股票u003Cu002Fpu003Eu003Cpu003E从我们日常交易的角度,一般交易者的行为可以拆分以下两部分:u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E1 选择标的(初始化):u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003E 在交易之前,我们通常会先选定要交易的股票池或者单个股票u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrongu003E2 交易(每天盯盘)u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003E我们会观察该股票的五日均线和 30 日均线,并进行比较u003Cbru003E如果该股票的五日均线在 30 天均线以上,则全仓买入股票u003Cbru003E如果该股票的五日均线在 30 天均线以下,则全仓卖出(空仓) u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E那么程序中,我们是怎么做的呢?u003Cu002Fpu003Eu003Cpu003E先看看 Ricequant 平台中对应的代码框架会是怎么样的吧:u003Cu002Fpu003Eu003Cpreu003Edef init(context):u003Cbru003E#程序的初始化,预设股票池、设置参数和变量。 只运行一次u003Cbru003Edef handle(context, bar_dict):u003Cbru003E#从回测的开始日期至结束日期,根据选择的频率(日、分钟)循环运行u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E对照策略思路 及 Ricequant 代码框架,你会发现我们可以很轻松地把 两者结合起来u003Cu002Fpu003Eu003Cpu003E以上框架也是 Ricequant 平台的最基本也最主要的框架,也就是u003Cu002Fpu003Eu003Culu003Eu003Cliu003E初始化u003Cu002Fliu003Eu003Cliu003E循环 – 根据选择的频率(日、分钟)循环运行u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E2 初始化:u003Cu002Fpu003Eu003Cpu003E选择标的:本策略的交易股票设定为 300059 ”东方财富“。u003Cu002Fpu003Eu003Cpreu003Edef init(context):u003Cbru003E context.stock = “300059.XSHE” # 存入目标股票 [东方财富 ] u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E延伸阅读:u003Cu002Fpu003Eu003Cpu003E1 在 init 中实现程序的初始化,例如存入目标股票池,设置滑点、基准等参数以及设置其它变量。 context 是一个全局的容器,你可以通过它设置任何全局变量并初始化:如 context.stock 将会在后面代码所被调用到。u003Cu002Fpu003Eu003Cpu003E2 代码中 # 代表注释,作为代码说明,执行时会被跳过而不为程序所运行。u003Cu002Fpu003Eu003Cpu003E3 如何填写股票代码:你会发现策略代码中 股票代码后带有后缀,那么它们分别代表什么呢?u003Cu002Fpu003Eu003Cpu003E后缀为u003Cu002Fpu003Eu003Culu003Eu003Cliu003EXSHE 代表在深交所上市交易的股票u003Cu002Fliu003Eu003Cliu003EXSHG 在上交所上市交易的股票u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E例子:u003Cu002Fpu003Eu003Culu003Eu003Cliu003E300059.XSHE 为深交所上市的东方财富u003Cu002Fliu003Eu003Cliu003E600000.XSHG 为上交所上市的浦发银行u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E我们的代码编辑器还提供了非常便利的股票代码自动寻找和补全功能,在 Windows 中你可以用 ctrl+i , Mac 系统你可以用 cmd+i 激活证券代码自动补全功能。如下图:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F3b86ceaa55ca4338a2889f37f29a7c23″ img_width=”1320″ img_height=”602″ alt=”十分钟学会用Python交易股票” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E3 获取均价:u003Cu002Fpu003Eu003Cpu003E我们分别获取该股票 5 日和 30 日的均价u003Cu002Fpu003Eu003Cpreu003E# 用法:变量 = bar_dict[股票代码].mavg(天数, frequency=’day’)u003Cbru003E# 获取近五日股票收盘价均价,命名为 fastu003Cbru003E fast = bar_dict[context.stock].mavg(5, frequency=’day’)u003Cbru003E# 同上,获取近二十日的收盘价均价,命名为 slow :u003Cbru003E slow = bar_dict[context.stock].mavg(30, frequency=’day’)u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E4 判断买卖条件:u003Cu002Fpu003Eu003Cpu003E获得均价数据之后,我们就可以进行一个判断决定是否买卖了:u003Cu002Fpu003Eu003Cpreu003E if fast>slow: # 若快线在慢线之上则用所有现金买入该股票u003Cbru003E #买入操作u003Cbru003E u003Cbru003E elif fast<slow:# 若慢线在快线之上则清空所持股票u003Cbru003E #卖出操作u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E在判断之前,我们还漏了一步,那是什么呢?就是要知道我们有多少现金,那么在程序中是如何获得现金的呢?我们使用以下代码u003Cu002Fpu003Eu003Cpreu003E# 用法:变量 = context.portfolio.cashu003Cbru003Ecash = context.portfolio.cash #取得当前的现金量,命名为 cashu003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E延伸阅读: portfolio 中 包含所有的投资组合的信息,请参考文档 – Portfolio 对象u003Cu002Fpu003Eu003Cpu003E5 买入 u002F卖出:u003Cu002Fpu003Eu003Cpu003E在判定买卖的条件成立之后,我们会对股票进行买入或者卖出的操作:u003Cu002Fpu003Eu003Cpreu003E#用法 order_value(股票代码,买卖金额) 金额为正则为买入,负数则为卖出u003Cbru003E#将所有现金买入 300059 东方财富u003Cbru003Eorder_value(context.stock, cash) u003Cbru003E#用法: order_target_value(股票代码,目标持仓比例) 比例在 1 与 0 之间u003Cbru003E#此处将持仓比例调整为 0 ,则等同于全部卖出u003Cbru003Eorder_target_percent(context.stock, 0) u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E6 策略回测u003Cu002Fpu003Eu003Cpu003E以上,我们用几行代码就把策略的框架完整地搭建起来了,最终的完整代码为:u003Cu002Fpu003Eu003Cpreu003Edef init(context): #初始化u003Cbru003E context.stock = “300059.XSHE” #存入要交易的股票代码u003Cbru003Edef handle_bar(context, bar_dict): #每日循环运行 u003Cbru003E#获取 30 日均线u003Cbru003E slow = bar_dict[context.stock].mavg(30, frequency=’day’) u003Cbru003E#获取 5 日均线u003Cbru003E fast = bar_dict[context.stock].mavg(5, frequency=’day’) u003Cbru003E cash = context.portfolio.cash #获取持有现金金额u003Cbru003E if fast>slow: #判定买入条件u003Cbru003E order_value(context.stock, cash) #买入目标股票u003Cbru003E elif fast<slow:u003Cbru003E order_target_percent(context.stock, 0) #卖出目标股票 u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E写完了策略,那么我们接下去做什么呢? 先对我们的策略进行一次历史回测,看看它的历史表现是如何吧。u003Cu002Fpu003Eu003Cpu003E在策略编辑页面右上方,选择从 2015 年 1 月 4 日至 2016 年 10 月 4 日,用资金 100 万元进行日回测吧,请点击 运行回测。u003Cu002Fpu003Eu003Cpu003E如代码没有问题,在数秒之后,我们就会拿到该策略的历史表现结果:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F5d59a6eed64c4dbc8fff504d29560132″ img_width=”2724″ img_height=”1546″ alt=”十分钟学会用Python交易股票” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E我们可以看到回测详情中有精致的图表,详细的各项风险收益指标、以及持仓、落单等详情辅助你进一步了解你的策略的表现。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E到这里,一个完整的从 [构建策略思路] 到 [策略代码编写] 到 [回测结果检验] 的流程就结束了。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E7 从日回测到分钟回测:u003Cu002Fpu003Eu003Cpu003E在循环部分, handle 函数根据选择的频率(日、分钟)循环运行,在以上的日回测中, handle 内的代码会每日被触发一次u003Cu002Fpu003Eu003Cpreu003Edef handle(context, bar_dict): u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E如果是进行分钟回测或模拟实盘,那么这个 handle 里的代码就会被每分钟触发一次;u003Cu002Fpu003Eu003Cpu003E因此,我们的代码逻辑也势必要进行一定的改进,使得策略按照我们的逻辑正常地运行。u003Cu002Fpu003Eu003Cpu003E我们先把修改好的代码贴上来:u003Cu002Fpu003Eu003Cpreu003Edef init(context):u003Cbru003E context.stock = “300059.XSHE”u003Cbru003E# 每日开盘前运行一次,可以进行选股、设置参数等行为 u003Cbru003Edef before_trading(context):u003Cbru003E # 设定并重置 context.fired 的值为 0u003Cbru003E context.fired = 0u003Cbru003E u003Cbru003E#从回测的开始日期至结束日期,根据选择的频率(日、分钟)循环运行u003Cbru003Edef handle_bar(context, bar_dict):u003Cbru003E # 判定今日是否有下过单,若未下单则进行下列代码的操作u003Cbru003E if (context.fired == 0):u003Cbru003E slow = bar_dict[context.stock].mavg(30, frequency=’day’)u003Cbru003E fast = bar_dict[context.stock].mavg(5, frequency=’day’)u003Cbru003E cash = context.portfolio.cashu003Cbru003E u003Cbru003E if fast>slow:u003Cbru003E order_value(context.stock, cash)u003Cbru003E elif fast < slow:u003Cbru003E order_target_percent(context.stock, 0) u003Cbru003E # 设置 fired 等于 1 ,表示执行完毕 u003Cbru003E context.fired = 1u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E可以看到这里改动并不多,这里需要介绍到框架中常用到的函数 before_trading :u003Cu002Fpu003Eu003Cpreu003E# 每日开盘前运行一次,可以进行选股、设置参数等行为 u003Cbru003Edef before_trading(context):u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E我们在 before_trading 中设置一个变量命名为 fired ,赋值为 0u003Cu002Fpu003Eu003Cpreu003E # 设定并重置 context.fired 的值为 0u003Cbru003E context.fired = 0u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E由于 before_trading 是每天开盘前运行一次,所以 context.fired 会被每天重置为 0。在 handle 函数中,我们加入了判断,如 context.fired 为 0 ,则继续执行下面的代码,否则本次循环结束。u003Cu002Fpu003Eu003Cpreu003Et# 判定今日是否有下过单,若未下单则进行下列代码的操作u003Cbru003Etif (context.fired == 0):u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E并在执行完判断和买卖操作之后,设定 context.fired 的值等于 1 ,使得当日余下的分钟循环操作均被跳过。u003Cu002Fpu003Eu003Cpreu003Ettt# 设置 fired 等于 1 ,表示今天已下过单 u003Cbru003Etttcontext.fired = 1u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E在完成以上代码后,我们开始进行分钟回测吧: 在策略编辑页面右上方,选择从 2015 年 1 月 4 日至 2016 年 10 月 4 日,用资金 100 万元进行分钟回测吧,更新策略后点击运行回测 。u003Cu002Fpu003Eu003Cpu003E8 模拟交易:u003Cu002Fpu003Eu003Cpu003E模拟交易通过实时的分钟切片数据进行撮合,也就是 handle 函数会每分钟被触发一次循环。在开启你的策略的模拟交易之前,你必须要对它进行一次分钟回测,才可以开启模拟交易。 在上面分钟回测之后,你可以在策略回测详情页面点击 开启模拟交易。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E9 开启微信通知,接收交易信号:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E点击导航栏中的 [我的交易] ,可以在 [模拟交易] 一栏看到创建的模拟交易,如下图:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F83cc33c944eb40c4977877029d3b8958″ img_width=”2472″ img_height=”1152″ alt=”十分钟学会用Python交易股票” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E点击右边的微信通知开关,将 OFF 调至 ON ,并按照指示扫描二维码,绑定微信,就能通过微信接收交易信号了。u003Cu002Fpu003Eu003Cpu003E当该策略进行买卖操作,你的微信会收到类似下图的信号提醒。微信推送的延迟非常小,使得你能根据信号进行及时的下单操作。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Fd515d45e355e4298950688fec630349f” img_width=”720″ img_height=”1280″ alt=”十分钟学会用Python交易股票” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E是不是很轻松,数行代码就可以把你的投资策略变成代码,大家都来试试吧!u003Cu002Fpu003Eu003Cpu003E最后,小编想说:我是一名python开发工程师,整理了一套最新的python系统学习教程,想要这些资料的可以关注私信小编“01”即可,希望能对你有所帮助u003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:十分钟学会用Python交易股票

主题测试文章,只做测试使用。发布者:熱鬧獨處,转转请注明出处:http://www.cxybcw.com/18215.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code