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

news/2025/2/15 16:26:35/

概述

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

获取数据

按照惯例用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.ppmy.cn/news/1168513.html

相关文章

计算机基础知识33

进程基础(操作系统中的概念) 进程它是操作系统总最重要的概念&#xff0c;线程也是 进程和线程都是有操作系统来调度使用的&#xff0c;我们程序员是不能控制的 # 进程和程序是两码事、完全不一样 程序&#xff1a;其实一个死的东西、一堆代码就是程序&#xff0c;它也没有生命…

智慧矿山矿山安全生产:皮带撕裂识别AI算法不用激光,能迅速识别皮带纵撕!

近些年来&#xff0c;智慧矿山在煤矿行业中发挥着越来越重要的作用。皮带的功能对于矿山运营至关重要&#xff0c;而皮带撕裂是造成生产中断、人身伤害等问题的重要原因之一。为了准确、及时地检测皮带撕裂的情况&#xff0c;AI算法的应用成为智慧矿山的关键。 ​​​​​​​…

Wireshark-win32-1.8.4 给winxp和win2003用

Index of /wireshark/win32/all-versions/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror https://mirrors4.tuna.tsinghua.edu.cn/wireshark/win32/all-versions/Wireshark-win32-1.12.1.exehttps://mirrors4.tuna.tsinghua.edu.cn/wireshark/win32/all-versions/W…

使用树莓派搭建文件共享服务器-samba服务器

局域网内部通过文件共享来传输文件是一种非常方便的方式&#xff0c;小米摄像头也支持用文件共享smb模式将视频备份到局域网中的文件服务器上。之前我一直使用荣耀pro路由器游戏版&#xff0c;是自带USB接口支持文件共享服务的&#xff0c;接上USB移动硬盘&#xff0c;小米摄像…

NewStarCTF 2023 公开赛道 WEEK2|WEB 游戏高手

app_v2.js就是游戏文件 右键“用调试器打开”&#xff1a; var gameScore 0; 就是当前分数&#xff0c; 打开控制台&#xff0c;输入 gameScore 1000000&#xff0c;回车 就可以得到flag

常用linux的命令(持续更新)

1.防火墙相关 centos7 防火墙 查状态&#xff1a;systemctl status firewalld.service 关闭&#xff1a;systemctl disable firewalld.service 重启生效 关闭&#xff1a;systemctl stop firewalld.service 马上生效 systemctl stop firewalld 临时关闭防火墙 systemctl disabl…

链表收尾(8.2)

例题解析 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 1.拷贝节点插入原节点的后面&#xff08;核心&#xff09; 这样做的目的是方便找 random 节点&#xff0c;知道原节点可以找 random&#xff0c;知道上一个 random 可以找下一个 random 。 struct Node…

Umi3实战教程

一、框架介绍 umi是蚂蚁金服的前端开发框架&#xff0c;它内置了路由、web/移动端UI库、数据流、权限控制、常用hooks库、构建、部署、测试、等等一些工具&#xff0c;几乎涵盖了正常前端开发要用到的所有工具。 二、环境准备 pnpm 相比npm、yarn&#xff0c;pnpm更小更快扁平…