【量化交易笔记】10.建立最简单的交易策略

概述

量化说得简单一些用策略进行股票交易,在实施交易之前,需要制定策略,并回测试共效果
为了把交易说明清楚,将这个过程,能简单,就简单,总之,简单,简单再简单。
以下主要以代码为主。

获取数据

按照惯例用baostock 数据

# 加载相应的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import baostock as bs
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False
加载数据

仍以sh.60000为例,从今年【2023年1月1日 到至今天(2023-10-19)】数据为演示。

lg = bs.login()
#指定一下获取股票数据的起始日期和截止日期
#这里就用2023年1月1日至今日的数据
start_date = '2023-01-01'
end_date = '2023-10-19'
#创建数据表,这里选择下载的股票代码为600000rs=bs.query_history_k_data_plus('600000.sh', "date,open,high,low,close,volume",start_date=start_date, end_date=end_date,
frequency="d", adjustflag="3")
# .get_data()
#下面来检查一下数据表的前5行
data=rs.get_data()
data.head()

数据见下表

		date	open	high	low	close	volume
0	2023-01-03	7.2700	7.2800	7.1700	7.2300	25892521
1	2023-01-04	7.2700	7.3500	7.2300	7.3100	30947081
2	2023-01-05	7.3700	7.3800	7.3000	7.3500	30162154
3	2023-01-06	7.3500	7.3800	7.3100	7.3400	20312881
4	2023-01-09	7.3800	7.3800	7.3000	7.3400	19612260
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 191 entries, 0 to 190
Data columns (total 6 columns):#   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 0   date    191 non-null    object1   open    191 non-null    object2   high    191 non-null    object3   low     191 non-null    object4   close   191 non-null    object5   volume  191 non-null    object
dtypes: object(6)
memory usage: 9.1+ KB
  • 特别说明一下,这里有个坑,baostock 采集的数据均是字符串,无法进行数值计算 可以通info() 函数查看
数据处理
  1. 转化为数值型和日期,并建立以日期为索引
    你也可以不用建议索引,不过,建立以日期为索引的好处在于作图时,横坐标会显示日期,定位也很方便。
cols=["open","high","low","close","volume"]
data[cols]=data[cols].astype('float')
data['date']=pd.to_datetime(data['date'])
data.set_index('date',inplace=True)
  1. 增加一列价格变化
#给新的字段命名为diff,代表difference
#用.diff()方法来计算每日股价变化情况
data['diff'] = data['close'].diff()
  1. 增加交易信号
#创建交易信号字段,命名为Signal 
#如果diff值大于0,则Signal为1 卖出,否则为0 买入
data['signal'] = np.where(data['diff'] > 0, 1, 0)

作图查看

#设置画布的尺寸为12*8
plt.figure(figsize = (12,8))
#使用折线图绘制出每天的收盘价
data['close'].plot(linewidth=2, color='k', grid=True)
#如果当天股价上涨,标出卖出信号,用倒三角表示
plt.scatter(data['close'].loc[data.signal==1].index,data['close'][data.signal==1],marker = 'v', s=80, c='g')
#如果当天股价下跌给出买入信号,用正三角表示
plt.scatter(data['close'].loc[data.signal==0].index,data['close'][data.signal==0],marker = '^', s=80, c='r')
#将图像进行展示
plt.show()

plt

回测

为了更加清晰的看到回测结果,删除不参加计算的列,只保留相关的列。

df = data.copy()
df.rename(columns={"close": "price"}, inplace=True)
df.drop(columns=['open','high','low','volume'], inplace=True)
df=df.fillna(0)
#一般情况下,在A股市场,买入或卖出至少为100股,即1手
df['order'] = df['signal'].diff()*100
df.head()
	        price	diff	signal	order
date				
2023-01-03	7.23	0.00	0	NaN
2023-01-04	7.31	0.08	1	100.0
2023-01-05	7.35	0.04	1	0.0
2023-01-06	7.34	-0.01	0	-100.0
2023-01-09	7.34	0.00	0	0.0

回测的逻辑:
根据买卖信号,进行买卖操作,每次操作相应的数量。对于这里的股票,只有做多,即只能是买进后,才能卖出。
特别要说明的的一个函数cumsum(),即累加。

#考虑到股价较低,我们初始1千元钱让去交易
initial_cash = 1000.00
#增加一个字段,代表交易的股票的市值
df['stock'] = df['order']*df['price']
#两次买卖的订单变化之差就是某一时刻仓位的变化情况
#持仓股票的数量变化乘以现价,就是代表交易产生的现金流
#用初始资金减去现金流变化的累加,就是剩余的现金
df['cash'] = initial_cash -\
(df['order'].diff()*df['price']).cumsum()
#而最股票的市值加上剩余的现金,就是的总资产
df['total'] = df['stock'] + df['cash']
#为了让直观看到自己的总资产变化
#我们用图形来进行展示
#设置图形的尺寸是10*6
plt.figure(figsize=(10,6))
#分别绘制总资产和持仓股票市值的变化
plt.plot(df['total'],label='总市值')
plt.plot(df['order'].cumsum()*df['price'],'--',label='股票市值')
#增加网格,调整一下图注的位置,就可以显示图像了
plt.grid()
plt.legend(loc='center right')
plt.show()


通过上图,可以看到上面蓝色的曲线为资产曲线,下面橙色的表示股票买卖的情况。

datepricediffsignalorderstockcashtotal
2023-01-037.230.000NaNNaNNaNNaN
2023-01-047.310.081100.0731.0NaNNaN
2023-01-057.350.0410.00.01735.01735.0
2023-01-067.34-0.010-100.0-734.02469.01735.0
2023-01-097.340.0000.00.01735.01735.0
2023-10-137.10-0.040-100.0-710.02514.01804.0
2023-10-167.07-0.0300.00.01807.01807.0
2023-10-177.090.021100.0709.01098.01807.0
2023-10-187.05-0.040-100.0-705.02508.01803.0
2023-10-196.84-0.2100.00.01824.01824.0

191 rows × 7 columns

小结

查看数据表,我们惊奇的发现居然盈利了。资产由原来的1000元,变成1824元。
以上的仅仅是一个策略的制定和回测的过程,盈利并不代表什么,不能直接用于实践。
有了这个简单的策略,我们了解策略是什么,回测是什么,分别是如何实现的。在以后的章节,我们将一步地进行研究和说明。

在此警告:文章中的所有内容,不能给你构成投资的理由。

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

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

相关文章

unity NPR 卡通渲染

文章目录 一、 介绍二、 素材准备三、 步骤四、 shader代码五、工程链接 一、 介绍 NPR是计算机图形学中的一类&#xff0c;即非真实感绘制(Non-photorealistic rendering)&#xff0c;主要用于模拟艺术式的绘制风格&#xff0c;也用于发展新绘制风格&#xff0c;形式一般是卡…

owasp top 10

1、访问控制的崩溃&#xff1a; 通过身份验证的用户可以访问其他用户的信息&#xff0c;越权 达成方式&#xff1a;通过修改url、内部应用程序状态或html页面绕过 防范&#xff1a;除了公有资源外&#xff0c;默认情况下拒绝访问&#xff0c;严格判断权限&#xff0c;记录失败的…

冰蝎默认加密的流量解密

破解冰蝎的默认加密 流量包分析 上传的冰蝎流量包 POST /web-zh/DVWA/vulnerabilities/upload/ HTTP/1.1 Host: 192.168.197.111 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0 Accept: text/html,application/xhtmlxml,a…

Ansible定义各类变量,引用变量方式介绍及注册变量和vars_prompt的用法示例

目录 一.Ansible定义变量 1.用途 2.定义规则 3.变量优先级 二.命令行定义变量 三.定义主机和主机组变量 1.主机变量 &#xff08;1&#xff09;内置主机变量 &#xff08;2&#xff09;简单示例 2.主机组变量 四.定义playbook变量 1.通过vars表示定义变量&#xff…

HTML 实现 点击按钮切换 整张界面 点击按钮切换局部界面

点击按钮实现页面切换 点击按钮切换全局界面方法一&#xff1a; 使用a标签进行跳转连接 href方法二&#xff1a;在button标签中加上onclick属性&#xff0c;赋值为Javascript方法三&#xff1a;触发一个函数跳转方法四&#xff1a;表单的action定向提交跳转 点击按钮切换局部界…

shell条件测试与条件测试操作符

shell条件测试与条件测试操作符 条件测试变量#&#xff1f;test与条件测试语句方括号测试表达式字符串测试操作符逻辑测试操作符整数测试操作符双小括号的整数测试操作符与含义文件测试操作符条件测试举例 条件测试 条件测试是可以根据某个特定条件是否满足&#xff0c;来选择…

vscode调试container(进行rocksdb调试)+vscode比较git项目不同分支和fork的哪个分支

vscode调试container&#xff08;进行rocksdb调试&#xff09; 参考链接&#xff1a; https://blog.csdn.net/qq_29809823/article/details/128445308#t5 https://blog.csdn.net/qq_29809823/article/details/121978762#t7 使用vscode中的插件dev containners->点击左侧的…

zmq封装

ZmqBindlib zmq常用封装 使用方法 基本使用 1.简单请求回复 ZmqRequest request new ZmqRequest();request.RemoteAddress localaddes;request.PubClient "A";int num 0;while (true){// Thread.Sleep(1000);//string msg request.Request("hi"…

【微信小程序开发】小程序微信用户授权登录(用户信息手机号)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于小程序的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 授权流程讲解 一.用户信息授权登录 1.w…

MD-MTSP:粒子群优化算法PSO求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、多仓库多旅行商问题MD-MTSP 多旅行商问题&#xff08;Multiple Traveling Salesman Problem, MTSP&#xff09;是著名的旅行商问题&#xff08;Traveling Salesman Problem, TSP&#xff09;的延伸&#xff0c;多旅行商问题定义为&#xff1a;给定一个&#x1d45b;座城市…

LabVIEW中管理大型数据

LabVIEW中管理大数据 LabVIEW的最大优势之一是自动内存管理。这种内存管理允许用户轻松创建字符串、数组和集群&#xff0c;而无需C/C用户经常担心。但是&#xff0c;这种内存管理设计为绝对安全&#xff0c;因此数据被非常频繁地复制。这通常不会造成任何问题&#xff0c;但是…

vue3 列表页开发【选择展示列】功能

目录 背景描述&#xff1a; 开发流程&#xff1a; 详细开发流程&#xff1a; 总结&#xff1a; 背景描述&#xff1a; 这个功能是基于之前写的 封装列表页 的功能继续写的&#xff0c;加了一个选择展示列的功能&#xff0c;可以随时控制表格里展示那些列的数据&#xf…

【算法教程】排列与组合的实现

数据准备 在讲排列与组合之前&#xff0c;我们先定义数据元素类型Fruit class Fruit{constructor(name,price){this.name namethis.price price} }排列 对N个不同元素进行排序&#xff0c;总共有多少不同的排列方式&#xff1f; Step1: 从N个元素中取1个&#xff0c;共N种…

Pandas 数据处理分析系列1--SeriesDataFrame数据结构详解

Pandas 概述 Pandas 是一个开源的数据分析和数据处理库,是基于 NumPy 开发的。它提供了灵活且高效的数据结构,使得处理和分析结构化、缺失和时间序列数据变得更加容易。其在数据分析和数据处理领域广泛应用,在金融、社交媒体、科学研究等领域都有很高的使用率和广泛的应用场…

系列十一、Redis中分布式缓存实现

一、缓存 1.1、什么是缓存 内存就是计算机内存中的一段数据。 1.2、内存中的数据特点 读写快断电数据丢失 1.3、缓存解决了什么问题 提高了网站的吞吐量和运行效率减轻了数据库的访问压力 1.4、哪些数据适合加缓存 使用缓存时&#xff0c;一定是数据库中的数据极少发生改…

【Vue】Element开发笔记

Element开发笔记 前言 官网 https://element.eleme.cn/#/zh-CN/component/upload 其它项目网站 https://www.cnblogs.com/qq2806933146xiaobai/p/17180878.html 表格 序号列添加 <el-table-column type"index" :index"handleIndexCalc" label&qu…

深度强化学习 第 4 章 DQN 与 Q 学习

4.1 DQN 最优动作价值函数的用途 假如我们知道 Q ⋆ Q_⋆ Q⋆​&#xff0c;我们就能用它做控制。 我们希望知道 Q ⋆ Q_⋆ Q⋆​&#xff0c;因为它就像是先知一般&#xff0c;可以预见未来&#xff0c;在 t t t 时刻就预见 t t t 到 n n n时刻之间的累计奖励的期望。假如…

5G来临,迎客莱带你探索运营商大数据的应用

随着5G时代的来临&#xff0c;不仅在算力的基础上得到了加强和保障&#xff0c;同时也丰富了计算的方式和模式&#xff0c;如边缘计算、霾计算等。计算方式和模式的改变&#xff0c;对于运营商来说&#xff0c;意味着更丰富的数据维度&#xff0c;更鲜活的数据和更强大的数据处…

无人机航拍图像拼接与目标识别

一、简介 无人机用来做图像侦察是常见功能&#xff0c;现有技术基本是无人机对某片区域进行飞行&#xff0c;人工实时监控飞行图像&#xff0c;将图像录制成视频供事后回放。此方法对人员业务要求比较高、反应速度足够快、不利于信息收集、录制视频丢失空间信息、对于后期开展区…

Qt判断一个点在多边形内还是外(支持凸边形和凹变形)

这里实现的方法是转载于https://blog.csdn.net/trj14/article/details/43190653和https://blog.csdn.net/WilliamSun0122/article/details/77994526 来实现的&#xff0c;并且按照Qt的规则进行了调整。 以下实现方法有四种&#xff0c;每种方法的具体讲解在转载的博客中有说明&…