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

news2024/11/6 19:22:28

概述

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

获取数据

按照惯例用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'
#创建数据表,这里选择下载的股票代码为600000

rs=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    object
 1   open    191 non-null    object
 2   high    191 non-null    object
 3   low     191 non-null    object
 4   close   191 non-null    object
 5   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.coloradmin.cn/o/1115154.html

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

相关文章

NodeJS的初使用,以及引入第三方插件和安装淘宝镜像的教程

NodeJs 命令 npm init -y 生成package.json文件npm i jquery --save–dev 开发依赖(jQuery后面还可以跟模块,可以有多个)npm i jquery --save 生产依赖npm i jquery --D 开发依赖npm uninstall jquery 卸载删除npm i 把删掉的模块,全部重新加载回来 1.介绍 1.什么是NodeJs?…

SystemVerilog Assertions应用指南 Chapter 1.16“ended”结构

1.16“ended”结构 到目前为止,定义的序列都只是用了简单的连接( concatenation)的机制。换句话说,就是将多个序列以序列的起始点作为同步点,来组合成时间上连续的检查。SVA还提供了另种使用序列的结束点作为同步点的连接机制。这种机制通过给序列名字追加上关键词“ ended”来…

python二次开发Solidworks:修改实体尺寸

立方体原始尺寸&#xff1a;100mm100mm100mm 修改后尺寸&#xff1a;10mm100mm100mm import win32com.client as win32 import pythoncomdef bin_width(width):myDimension Part.Parameter("D1草图1")myDimension.SystemValue width def bin_length(length):myDime…

OpenGL —— 2.6、绘制一个正方体并贴图(附源码,glfw+glad)

源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库&#xff0c;该库只有一个头文件。 具体代码&#xff1a; vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _viewMatrix; u…

手帐怎么做?推荐这10款手帐达人都在用的好用软件!

手帐是一种强大的可视化方式&#xff0c;可以记录你的观察、日常的思考&#xff0c;并随时间的推移来衡量你的进步。在各种手帐软件的帮助下&#xff0c;创建并完全自定义你的手帐变得比以往任何时候都更容易。 有无数的手帐软件可供选择&#xff0c;满足各种需求。但在众多的…

基于Java的勤工助学管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

京东数据分析:2023年9月京东洗烘套装品牌销量排行榜!

鲸参谋监测的京东平台9月份洗烘套装市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年9月份&#xff0c;京东平台洗烘套装的销量为7100&#xff0c;环比下降约37%&#xff0c;同比增长约87%&#xff1b;销售额为6000万&#xff0c;环比下降约48%&#…

使用Spyder进行动态网页爬取:实战指南

导语 知乎数据的攀爬价值在于获取用户观点、知识和需求&#xff0c;进行市场调查、用户画像分析&#xff0c;以及发现热门话题和可能的新兴领域。同时&#xff0c;知乎上的问题并回答也是宝贵的学习资源&#xff0c;用于知识图谱构建和自然语言处理研究。爬取知乎数据为决策和…

如何在3DMAX中使用tyFlow粒子模拟插件创建样条线网格模型

3DMAX粒子模拟插件tyFlow是3dMAX上一款粒子模拟插件&#xff0c;3dMax的粒子流的非官方替代品&#xff0c;类似于Particle Flow插件&#xff0c;但是功能上更加强大&#xff0c;模拟粒子流动、汇聚破碎等各种效果。 tyFlow不仅仅是对粒子流的升级——相反&#xff0c;它是从头…

介绍drawio和图表使用场景

图表介绍 drawio是一个基于Web技术的草图、简图和图表的解决方案。 drawio支持在线编辑器&#xff0c;app.diagram.net.并支持不同的操作系统的桌面版离线安装版本。如&#xff1a;windows, linux, macOS。 对于个人或者团队&#xff0c;把图表绘制的安全放到第一位&#xff…

【马蹄集】—— 概率论专题:第二类斯特林数

概率论专题&#xff1a;第二类斯特林数 目录 MT2224 矩阵乘法MT2231 越狱MT2232 找朋友MT2233 盒子与球MT2234 点餐 MT2224 矩阵乘法 难度&#xff1a;黄金    时间限制&#xff1a;5秒    占用内存&#xff1a;128M 题目描述 输入两个矩阵&#xff0c;第一个矩阵尺寸为 l…

Python-嗨格式 之音频转换,ncm转mp3

缘由&#xff1a;本想下载一些歌到车机播放&#xff0c;发现大部分是ncm格式的。 查了下才知道是音乐软件限制了&#xff0c;会员下载的音频文件为.ncm格式&#xff0c;目前只能在网易云音乐APP上播放&#xff0c;不支持在其他音频播放软件或音频设备使用。 百度转换软件&…

Python词语转拼音

使用python写的图形汉语词语转拼音小工具 1)安装库 pip install flet 2)代码 # 声母列表 initial_consonant_list [b, p, m, f, d, t, n, l, g, k, h, j, q, x, zh, ch, sh, r,z, c, s, y, w] # 韵母列表 list_of_vowels [a, o, e, i, u, , ai, ei, ui, ao, ou, iu, ie, e…

MIKE水动力笔记18_如何将dfsu流场模拟结果的数据导出成txt文件

本文目录 前言Step 1 前置工作Step 2 导出相应数据 前言 MIKE的模拟结果dfsu文件的数据是可以导出的&#xff0c;导出格式为xyz&#xff0c;我们也可以将其改后缀改为txt文本格式&#xff0c;其中包含了某一时刻下所有网格坐标点的数据。 Step 1 前置工作 首先&#xff0c;在…

【驱动开发】控制stm32mp157a开发板三盏灯的亮灭

编写应用程序控制三盏灯的亮灭 head.h&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t;//LED灯的寄存器地址 #define …

unity脚本_力 c#

创建一个脚本 将代码挂载到物体上 取消物体的重力 运行即向z轴运动 加力之后 是否停止是由阻力影响 如果阻力为零 则会一直运动 如果希望就算有阻力也让物体一直动就将加力代码放在Update函数里 using UnityEngine; public class Power : MonoBehaviour{ Rigidbody rigidBo…

SpringBoot 打包与运行

一、SpringBoot 程序打包 1、在Springboot工程 pom文件中&#xff0c;引入 spring-boot-maven-plugin 插件。 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifact…

基于鹈鹕优化的BP神经网络(分类应用) - 附代码

基于鹈鹕优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于鹈鹕优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.鹈鹕优化BP神经网络3.1 BP神经网络参数设置3.2 鹈鹕算法应用 4.测试结果&#xff1a;5.M…

基于蛇优化优化的BP神经网络(分类应用) - 附代码

基于蛇优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于蛇优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蛇优化优化BP神经网络3.1 BP神经网络参数设置3.2 蛇优化算法应用 4.测试结果&#x…

二零二三充能必读 | 1024程序员狂欢节 —— 掌握前沿技术,探索未知领域

文章目录 I T 技术 ( I T T e c h n o l o g y ) IT技术(IT Technology) IT技术(ITTechnology)▊《 速学Linux&#xff1a;系统应用从入门到精通》▊《Python网络爬虫入门到实战》 人工智能 ( A r t i f i c i a l I n t e l l i g e n c e ) 人工智能(Artificial Intelligence…