Python量化交易策略及回测系统

目录

  • 前言:行文思路
  • 1、模块导入
  • 2、数据获取
  • 3、股票数据类型转换
  • 4、回测系统编写
  • 5、策略编写
  • 6、实例化策略
  • 非面向对象的编程
  • 分析总结


2022.12.3更新:由于一些因素不得不将文章中的大部分代码进行删除,但行文思路还是完整的,大家可以根据自己的想法思考形成独特的交易策略填充到省略号部分,如需以前的代码可私信了解


前言:行文思路

由于本文篇幅较长,而且文中关于python数据分析的知识点、python金融量化的知识点较多,因此在文章的开头先给出本文整体思路,以便读者能够拥有较为清晰的脉络通读全文。
第一部分:模块导入,主要是将后面需要用到的模块进行导入(简单,非重点)
第二部分:数据获取,鉴于在网络上股票数据不易找到,Wind金融终端等数据库数据收费,通过多方查找,终于让我找到了能够免费下载股票数据的模块,建议大家收藏(简单,非重点)
第三部分:将股票数据转化为新的数据类型,通过上面的方法下载下来的数据类型是我们常见的DataFrame,虽然pandas的功能已经很强大了,但是为了加入新的数据指标以及方便下一步操作,最好还是将DataFrame数据转化为一种新的数据类型(较难,非重点)
第四部分:策略编写,也就是利用代码将我们在股票市场中的交易原则表达出来(较难,重点)
第五部分:回测系统编写,股票回测即是基于历史已经发生过的真实行情数据,在历史上某一段时间内,模拟真实金融市场中股票的买入、卖出,得出这个时间段内的盈利率等数据(较难,重点)
第六部分:实例化策略并回测得到收益,继承一个策略类,得到一个实际的例子,利用股票数据回测得出结果(简单,重点)

1、模块导入

import akshare as ak
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
......

akshare:用于下载股票的交易数据(前复权)
collections:对基本数据类型做进一步处理,实现特定的数据类型
abc:主要定义了基本类和最基本的抽象方法,可以为子类定义共有的接口API,不需要具体实现

2、数据获取

# 获取某一只股票一段时间的数据
stock_sz300750_df = ak.stock_zh_a_daily(symbol="sz300750", start_date="20200103", end_date="20211231", adjust="qfq")
# list_date = list(stock_sz300750_df['date'])
# stock_sz300750_df.index = list_date
stock_sz300750_df.head()

在这里插入图片描述
函数ak.stock_zh_a_daily()用于获取A股股票数据
symbol为股票代码,sh为上交所股票,sz为深交所股票;strat_date、end_date分别为股票数据开始时间、结束时间;adjust默认为不复权的数据, qfq是返回前复权后的数据,hfq是 返回后复权后的数据

3、股票数据类型转换

由于后面写了两个量化交易策略,而且策略中的有部分指标不相同,所以在这一部分以及下面回测系统两部分面向对象编程,有部分函数只用于策略一,有部分只用于策略二。

# 将股票数据转化为新的数据类型
class StockTradeDays(object):def __init__(self, price_array, date_array=None):。。。。。。

相同指标:date、price、change
策略一:s_short、s_long分别为5日移动平均线和30日移动平均线;可以根据自己的需求更改参数数据
策略二:函数filter_stock(),用于判断交易日股票是上涨还是下跌

最后将DataFrame数据转换为自定义数据类型OrderedDict

在这里插入图片描述

4、回测系统编写

class TradeStrategyBase(ABC, object):  def buy_strategy(self, *args, **kwargs):。。。。。。def sell_strategy(self, *args, **kwargs):。。。。。。
class TradeLoopBack(object):def __init__(self, trade_days, trade_strategy):。。。。。。def execute_trade(self):。。。。。。

execute_trade()函数中,利用循环遍历整一个交易时段,将获得的每日股票数据传给交易策略进行判断,最终确定是买入、卖出还是持有

5、策略编写

class TradeStrategy1(TradeStrategyBase):"""交易策略1: 利用5日移动平均线与30日移动平均线交叉点进行股票买卖当5日移动平均线从下往上穿过30日移动平均线时,买入股票并持有当5日移动平均线从上往下穿过30日移动平均线时,卖出股票"""def buy_strategy(self, trade_ind, trade_day, trade_days):。。。。。。def sell_strategy(self, trade_ind, trade_day, trade_days):。。。。。。

移动平均线是将一定时期内的股票价格加以平均,把不同时间的平均值连接起来形成一根MA,利用长短期的移动平均线交叉点观察股票价格变动趋势的一种技术指标。因此,只有到了第30天才可以获得30日移动平均值,才可能进行买卖。
判断买入条件:当短期移动平均线从下往上穿过长期移动平均线时,可以认为短期内股价的趋势向上,股价可能会上涨
判断卖出条件:当短期移动平均线从上往下穿过长期移动平均线时,可以认为短期内股价的趋势向下,股价可能会下跌

class TradeStrategy2(TradeStrategyBase):"""交易策略2: 追涨杀跌策略,当股价连续两个交易日上涨且上涨幅度超过阀值默认s_buy_change_threshold(),买入股票并持有当股价连续两个交易日下跌且下跌幅度超过阀值默认s_sell_change_threshold(),卖出股票"""def buy_strategy(self, trade_ind, trade_day, trade_days):。。。。。。def sell_strategy(self, trade_ind, trade_day, trade_days):。。。。。。

策略二可以认为是非理性人在股票市场中交易时,遇到多日上涨且上涨幅度较大时,会认为股票有继续上涨的趋势,为了获利所以买入股票;但当某一股票连续下跌且下跌幅度超过心理预期时,会认为股票又继续下跌的趋势,为了止损卖出股票。
策略二中买入股票条件为:当股价连续两个交易日上涨且上涨幅度超过0.05,买入股票并持有
卖出条件为:当股价连续两个交易日下跌且下跌幅度超过-0.05,卖出股票
相关参数可以根据需求修改

6、实例化策略

经过前面的所有步骤之后,就可以实例化一个交易策略,利用交易数据进行回测,可得到相应的结果:
在这里插入图片描述
结果:
在这里插入图片描述

非面向对象的编程

由于对面向对象编程不太擅长,所以我对两个策略又分别写了新的程序,以判断上文面向对象程序是否正确

changes_list_1 = []
flag = -1
for ind, day in enumerate(trade_days):short2 = day.s_shortlong2 = day.s_longshort1 = trade_days[ind - 1].s_shortlong1 = trade_days[ind - 1].s_longif pd.isna(long1):continueif flag == 1:changes_list_1.append(day.change)print("日期:{},持有中".format(day.date))if short2 > long2 and short1 < long1:flag = 1print("日期:{},买入策略执行".format(day.date))if short2 < long2 and short1 > long1:flag = 0print("日期:{},卖出策略执行".format(day.date))print('回测策略1总盈亏为:{}%'.format(reduce(lambda a, b: a + b, changes_list_1) * 100))
plt.plot(np.array(changes_list_1).cumsum())

结果:
在这里插入图片描述

# 策略2
changes_list_2 = []
flag = 0
for ind, day in enumerate(trade_days):today_down = day.changeyesterday_down = trade_days[ind - 1].changeif flag > 0:changes_list_2.append(day.change)print("日期:{},持有中".format(day.date))if today_down > 0 and yesterday_down > 0 and today_down + yesterday_down > 0.01:flag += 1print("日期:{},买入策略执行".format(day.date))if today_down < 0 and yesterday_down < 0 and today_down + yesterday_down < -0.01:flag = 0print("日期:{},卖出策略执行".format(day.date))print('回测策略2总盈亏为:{}%'.format(reduce(lambda a, b: a + b, changes_list_2) * 100))
plt.plot(np.array(changes_list_2).cumsum())

结果:
在这里插入图片描述

分析总结

以上策略只用于量化分析,并不适合用于实际交易,之所以有较高的盈利,得益于宁王领衔的新能源板块的强势,大家也可以试试其他的股票,比如药明康德(代码:SH603259)
在这里插入图片描述
在这里插入图片描述
可以看出策略对该股票进行回测交易时,获得的盈利并不客观,甚至出现较大的亏损,因此,需要对相关策略进行参数调整修改,或者发掘其他更为有效的策略……

最后,大家如果觉得文章写的不错的话,可以点赞、收藏、关注三连哦~文中出现的所有代码已经打包上传至我的资源了,可以下载下来研究分析和运行查看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/53649.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我用Python做一个量化指数增强策略,爽了 !附代码!

这是邢不行第 84 期量化小讲堂的分享 作者 | 邢不行、密斯锌硒 A股是一个神奇的地方&#xff0c;它最大的特点就是多年不涨和永远的3000点。 正因如此&#xff0c;调侃A股的段子层出不穷。 甚至连中国男足这么烂的行业都有人跑来Diss&#xff0c;讽刺A股比国足更差。 我想说的是…

我在创业公司的开发经验总结

本文是流船原创授权本公号分享的他在创业公司的开发经验&#xff0c;小公司同样有牛人&#xff0c;大公司同样有混日子的&#xff0c;不用羡慕在大厂的&#xff0c;好好蛰伏&#xff0c;自然有一天你的努力会产生回报&#xff0c;如果没有回报&#xff0c;能力在手&#xff0c;…

多次成功创业经验总结-我如何打造新品类战略公式

创业经验总结-我如何打造一个新品类的战略公式 前言开创一个新品类&#xff0c;我有一个公式。01 lessgo 药妆是 更强功能 更细场景 更新奇特 的 日化02 HeyJuice 排毒果蔬汁比其它 减肥方案 比如吃减肥药、抽脂、健身 更容易 更时尚03 原麦山丘软欧包 比 日式面包 更健康 更傻…

一个97年的IT人创业历程中的总结和感悟

感谢本文作者于霆霖的投稿&#xff0c;欢迎更多朋友投稿分享好文 作者博客&#xff1a;http://yutinglin.cn/ 我个人的经历在这里不多赘述。主要想谈谈过程中由一些坎坷所触发的体会。 1.创业者定位&#xff1a; 但凡把自己定位成产品经理或者是专注于技术的创业者都要么失败&a…

3.对经历过的创业项目的总结

在传统的计算机行业&#xff0c;做一个产品先做需求分析&#xff0c;然后做设计&#xff0c;划分里程碑&#xff0c;最后测试&#xff0c;上市。 但在移动互联网行业&#xff0c;这种做产品方法要不得。移动互联网变得太快了&#xff0c;有可能之前默默无闻&#xff0c;但忽然间…

最近交流创业-拉投资-谈合作的一些经验总结

正如年前和年后QQ动态所反映的那样&#xff0c;最近2个月在和若干个人&#xff0c;深入交流创业、投资和合作等事业型问题。 年后来武汉这几天&#xff0c;又和若干线上网友和线下朋友&#xff0c;进一步洽谈了若干问题。有一些经验之谈和看法&#xff0c;所以整理下&#xff0…

RuleApp1.4.0 文章社区客户端

简介&#xff1a; 可以打包成安卓&#xff0c;苹果&#xff0c;h5&#xff0c;小程序&#xff0c;全新的版本增加了私聊和群聊&#xff0c;动态模块等&#xff0c;还有自动和手动封禁机制。[滑稽][滑稽]主要模块&#xff1a;用户模块&#xff0c;文章模块&#xff0c;动态模块…

【高可用系统架构设计】SLA服务可用性4个9是什么意思?如何保证服务的高可用性 HA(High Availability)?...

如何保证服务的高可用性 HA(High Availability)? 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。方法论上,高可用是通过冗余+自动故障转移来实现的。 我们都知道,单点是系统高可用的大敌,单…

记一次失败的小程序反编译经历

起因与目标 最近想搞个自己的小程序&#xff0c;觉得最实用的就是去水印小程序&#xff0c;可以下载抖音、小红书的无水印视频和图片。要做这个&#xff0c;怎么去水印是关键。一种方法就是深究底层原理自己搞&#xff0c;这种对不是专业做逆向的我来说太困难了。还有一种就是…

《微SaaS创富周刊》第9期:如何把创业者访谈,变成年收入100万+美元的生意

导读 大家好&#xff01;第9期《微SaaS创富周刊》面世啦&#xff08;点击这里阅读第1期&#xff09;&#xff0c;感谢大家的关注和阅读&#xff01;本周刊面向独立开发者、早期创业团队&#xff0c;报道他们主要的产品形态——微SaaS如何变现的最新资讯和经验分享等。所谓微Sa…

QQ机器人---服务器超级简单的安装

废话不多说。 直接开工。 安装docker容器。 先卸载老版本&#xff0c;安装新版本。 sudo yum remove docker docker-client docker-client-latest sudo docker-common docker-latest docker-latest-logrotate docker-logrotate sudo docker-selinux docker-engine-selinux d…

nonebot2-2.0.0b4 QQ机器人详细教程

介绍 Nonebot2是基于go-cqhttp框架使用Python3制作的机器人框架&#xff0c;可以实现go-cqhttp能实现的QQ功能。使用异步开发更快&#xff0c;稳定。nonebot 一直在很久之前就在开发&#xff0c;现在是nonebot2之前的1版本已无法使用。但是nonebot2的旧版本依旧不影响&#xf…

使用腾讯云服务器+Nonebot2+go-cqhttp搭建QQ聊天机器人【保姆级教程 2023最新版】

文章目录 一、查看conda版本二、查看系统版本三、配置go-cqhttp1.请切换至同一网络下扫码2.打包Docker镜像 四、创建NoneBot环境安装脚手架 一、查看conda版本 二、查看系统版本 uname -a arch getconf LONG_BIT三、配置go-cqhttp 下载go-cqhttp 这里有不同版本的cqhttp,并且…

[QQ机器人]nonebot2 聊天插件

使用方法:将插件放入存放机器人插件的文件夹&#xff0c;并重新运行bot.py 使用命令:输入#加上你要问的问题 运行截图: 以下是源码: """ 作者:萌新源 时间:2022/3/30 操作系统:debian for raspberry pi 修改请保留本插件的版权 本插件版权属于萌新源 要发布请…

Nonebot QQ机器人插件七:智能聊天机器人

QQ机器人插件七&#xff1a;智能聊天机器人 1. 使用智能聊天api 搜索青云客网络青云客智能聊天机器人API (qingyunke.com)&#xff0c;点击人工智能聊天。(实测智能回复问题不大&#xff0c;就是反应可能慢一点&#xff0c;而且如果一次给他发几条消息最多回复一条&#xff0…

快速搭建 QQ 聊天机器人--聊天机器人框架安装及搭建教程

使用到的工具 Deno&#xff1a;现代的 JavaScript 和 TypeScript 运行时。 Yoeth&#xff1a;一个轻巧、易用的 Deno 聊天机器人框架&#xff0c;支持 OneBot 12标准。 Walle-Q&#xff1a;一个 QQ 平台的 OneBot 协议实现端。 前期准备 安装 Deno&#xff08;使用 PowerS…

windows上QQ机器人搭建教程

我们的这个qq机器人是用Python来搭建的。 所以说&#xff0c;先打开我们的Pycharm 然后新建一个文件夹&#xff0c;再打开终端&#xff0c;先来装点库 pip install pydantic loguru pygtrie httpx python-dotenv uvicorn fastapi requests selenium aiocqhttp ffmpeg aiohttp …

最新版QQ机器人搭建保姆教程,保熟【最新beta2版本】

前面写了不少文章关于机器人&#xff0c;后来小伙伴说不能用了&#xff0c;因为你版本与我不一样&#xff0c;隔了几个月了&#xff0c;版本更新了&#xff0c;变化比较大&#xff0c;所以特此更新一篇2022/3/25的QQ机器人搭建教程&#xff0c;有空更新插件。 声明&#xff1a;…

【qq机器人】机器人发语音

文章目录 前言一.演示二.完整源码前言 前提你已经按照我的 教程 搭建好环境 一.演示 二.完整源码 from nonebot.adapters.cqhttp import Message from nonebot import on_command from nonebot.typing import T_State from nonebot.adapters import Bot, Event import reque…

【最新】QQ机器人插件

QQ机器人 前言QQ机器人功能展示一、如何白嫖&#xff08;用别人的插件&#xff09;二、如何自力更生&#xff08;自己写&#xff09; 前言 本文旨在如何为你的QQ机器人添加插件&#xff0c;也就是添加机器人的功能。添加插件的方法有两种&#xff0c;一种是用别人写好的插件&a…