用Python编程借助现有量化平台编写股票交易策略和回测分析

Irene181
• 阅读 2188

一、简介

大家好,我是Snowball。今天给大家分享的内容是基于Python编程,实现股票交易相关功能开发,如果读者对股票或金融衍生物交易不太了解,又比较感兴趣的话可自行查询相关资料。

接下来笔者会给大家介绍股票交易中的常见几种交易策略实现思路和源码编写过程,如果大家听说过量化交易这个词语的话,对其中的交易策略或许了解过,大概意思就是在股票、加密货币或者金融衍生物在价格的波动过程中根据其交易策略进行不断的买入和卖出,不断的套利,降低持仓陈本,来达到收益最大化

常见的交易策略有很多种,例如趋势型,网格型,剥头皮,概率法则,高频交易等,今天主要给大家介绍2种低频的交易策略,高抛低吸网格交易策略、日内做T策略。其他的交易策略较复杂,读者可自行百度了解,笔者这里推荐一个量化交易网站,仅供参考,米筐量化:

https://www.ricequant.com/doc/quant/

二、需求分析&实现思路

每个交易日的股票都会上涨或者下跌,在这个过程中笔者们偶尔会想针对部分股票进行股价的涨跌幅进行监控,或者自动进行交易,在这个需求前提下,现有券商、股票分析软件都会带有机器人自动交易策略功能,大部分都需要收费或者部分策略不能满足自己的需求,笔者这边提供2种实现思路:

1、借助现有量化平台编写策略和回测分析,然后在券商软件层面进行策略执行。

2、自己编写功能代码来监控估价,对股价波动进行特殊处理满足特殊需求。

第一种实现成本较低,但功能受限于平台;第二种实现成本毋庸置疑相对较高,但是逻辑可以自己控制。

三、借助现有量化平台编写策略和回测分析

这里利用米筐量化实现和分析自己的交易策略,需要先注册个账号,然后进入到平台-笔者的策略中进行策略编写,平台的功能使用可以参考平台文档。

笔者这里贴出笔者自己写的2种策略代码,这个平台只支持使用Python脚本编写。

1)价差交易策略

平台截图:

用Python编程借助现有量化平台编写股票交易策略和回测分析

部分代码如下,详细代码可以自己手撸实现,也可以在文末进行获取:

`# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新``def handle_bar(context, bar_dict):``...` `if newPrice >= context.nextSellPrice:` `logger.info("执行高抛交易,对应价格:{}".format(newPrice))` `amount = context.portfolio.positions[context.s1].quantity` `if amount >= context.tradeNumber:` `logger.info("执行高抛交易,对应数量:{}".format(context.tradeNumber))` `order_shares(context.s1, -context.tradeNumber)` `plot("S", newPrice)` `elif amount >= 100:` `logger.info("执行高抛交易,对应数量:{}".format(amount))` `order_shares(context.s1, -amount)` `plot("S", newPrice)`` calc_next_trade_price(context,newPrice)` `obj = {` `"nextSellPrice":context.nextSellPrice,` `"nextBuyPrice":context.nextBuyPrice,` `"curTradePrice":context.curTradePrice` `}` `context.buyTradeList.append(obj)` `if newPrice <= context.nextBuyPrice:` `logger.info("执行低吸交易,对应价格:{}".format(newPrice))` `amount = int(context.portfolio.cash / newPrice / 100.0)  * 100` `if amount >= context.tradeNumber:` `logger.info("执行低吸交易,对应数量:{}".format(context.tradeNumber))` `order_shares(context.s1, context.tradeNumber)` `plot("B", newPrice)` `calc_next_trade_price(context,newPrice)` ` obj = {` `"nextSellPrice":context.nextSellPrice,` `"nextBuyPrice":context.nextBuyPrice,` `"curTradePrice":context.curTradePrice` `}` `context.sellTradeList.append(obj)` 

选择回测时间段,点击右侧平台右侧按钮运行回测,结果页面如下

用Python编程借助现有量化平台编写股票交易策略和回测分析

从结果中可以看到,对招商银行[600036]这只股票进行价差网格交易,其参数设置在上涨8%的时候卖出,下跌8%的时候买入,最大连续下跌买入次数为3次。

回测收益:13.628%

回测年化收益:17.096%

比基准年化收益-6%高出非常之大,这是在股价波动的过程中可以进行执行该策略来不断的降低持仓成本。从交易详情面板来看,这个策略可以通过参数调节交易频率,在上涨下跌比率较大的情况下,其交易次数是能控制的相对较少,结果图如下:

用Python编程借助现有量化平台编写股票交易策略和回测分析

2)日内做T策略

同样的,只贴部分代码

# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
...
    if newPrice >= context.nextSellPrice:
        logger.info("执行高抛交易,对应价格:{}".format(newPrice))
        amount = context.portfolio.positions[context.s1].quantity
        if amount >= context.tradeNumber:
            logger.info("执行高抛交易,对应数量:{}".format(context.tradeNumber))
            order_shares(context.s1, -context.tradeNumber)
            plot("S", newPrice)
        elif amount >= 100:
            logger.info("执行高抛交易,对应数量:{}".format(amount))
            order_shares(context.s1, -amount)
            plot("S", newPrice) 

        calc_next_trade_price(context,newPrice)
        obj = {
            "nextSellPrice":context.nextSellPrice,
            "nextBuyPrice":context.nextBuyPrice,
            "curTradePrice":context.curTradePrice
        }
        context.buyTradeList.append(obj)

    if newPrice <= context.nextBuyPrice:
        logger.info("执行低吸交易,对应价格:{}".format(newPrice))
        amount = int(context.portfolio.cash / newPrice / 100.0)  * 100
        if amount >= context.tradeNumber:
            logger.info("执行低吸交易,对应数量:{}".format(context.tradeNumber))
            order_shares(context.s1, context.tradeNumber)
            plot("B", newPrice)

        calc_next_trade_price(context,newPrice)

        obj = {
            "nextSellPrice":context.nextSellPrice,
            "nextBuyPrice":context.nextBuyPrice,
            "curTradePrice":context.curTradePrice
        }
        context.sellTradeList.append(obj) 

总体来说,代码逻辑还是比较简单,就是对价格的涨跌进行处理,其参数设置在日内上涨2%的时候卖出,下跌2%的时候买入,初始买入资金比例7成,锁定最低仓位5成。然后运行回测,其结果如下

用Python编程借助现有量化平台编写股票交易策略和回测分析

回测收益:5.501%

回测年化收益:6.839%

基准收益:19.26%

可以看到日内做T这种高频交易,在长期来看收益可能并不高,适合在短期价格内运行。

四、总结

我是Snowball。这个量化平台在笔者的熟悉情况下,它可以很方便的回测你的交易策略,但是在股价盯盘上,或者自定义逻辑上支持的不是很完善,很多功能也是需要收费才能使用。本文基于Python,借助现有量化平台编写策略和回测分析,希望对大家的学习有所帮助。

最后需要本文代码的小伙伴,可以在后台回复“价差交易”关键词进行获取,觉得不错,记得三连支持噢~

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

用Python编程借助现有量化平台编写股票交易策略和回测分析

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/TLSbsxZnSHmAeNf8WgXN-w,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Irene181 Irene181
3年前
项目实战——打造一款股票区间交易盯盘系统
一、简介大家好,我是Snowball。今天给大家分享的内容是基于Java编程,实现股票交易相关功能开发,如果读者对股票或金融衍生物交易不太了解,又比较感兴趣的话可自行查询相关资料。在这篇文章里边,介绍了两个策略,,这篇文章,我们来实战个大的项目。常见的交易策略有很多种,例如趋势型,网格型,剥头皮,概率法则,高频交易等,今天主要给大家介绍2种低频的交易
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
Java日期时间API系列23
  有时候,往往需要统计某个时间区间的销量等问题,这就需要准确的起始时间,获取准确开始时间00:00:00,获取准确结束时间23:59:59。下面增加了一一些方法,获取当天起始时间,昨天起始时间,当前月第一天开始时间,当前月最后一天结束时间,上个月第一天开始时间,上个月最后一天结束时间,某个指定月的起始结束时间等等。其中月份最后一天往往因为月份不同和
Stella981 Stella981
2年前
Forrester机器学习报告发布,腾讯云跃居第一阵营
  !(https://nimg.ws.126.net/?urlhttp%3A%2F%2Fdingyue.ws.126.net%2F2020%2F1016%2Fecdc1f59j00qi98j7000od200u000fpg00it009u.jpg&thumbnail650x2147483647&quality80&typejpg)  A
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
6个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这