Python在股票交易分析中的应用:布林带与K线图的实战回测

引言

在股票交易的世界中,技术分析是投资者们用来预测市场动向的重要工具。布林带(Bollinger Bands)作为一种动态波动范围指标,因其直观性和实用性而广受欢迎。本文将通过Python代码,展示如何使用布林带结合K线图来分析股票价格走势,并寻找可能的交易信号。

布林带指标简介

布林带由三部分组成:中轨(移动平均线),上轨(中轨加上两倍标准差),以及下轨(中轨减去两倍标准差)。它们可以帮助交易者识别股票的超买或超卖状态,从而发现潜在的买卖机会。

Python代码实现

以下是使用Python进行布林带计算和K线图绘制的完整示例代码:

1. 导入必要的库

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

2. 定义布林带计算函数

def bollinger_bands(close_prices, window=20, num_std=2):rolling_mean = close_prices.rolling(window=window).mean()rolling_std = close_prices.rolling(window=window).std()upper_band = rolling_mean + (rolling_std * num_std)lower_band = rolling_mean - (rolling_std * num_std)return upper_band, lower_band

3. 生成模拟数据示例数据

np.random.seed(0)
dates = pd.date_range(start='2022-01-01', end='2024-01-01', freq='D')
prices = np.random.normal(loc=100, scale=2, size=len(dates)) + np.sin(np.arange(len(dates)) * 0.05) * 10
opens = prices * np.random.uniform(0.98, 1.02, len(prices))
closes = prices * np.random.uniform(0.98, 1.02, len(prices))
df = pd.DataFrame({'Open': opens, 'Close': closes}).set_index(dates)

4. 计算涨跌幅和布林带

df['Color'] = np.where(df['Close'] > df['Open'], 'red', 'cyan')
upper_band, lower_band = bollinger_bands(df['Close'])

5. 标记买卖信号

buy_signals = df[df['Close'] < lower_band]
sell_signals = df[df['Close'] > upper_band]

6. 计算累计盈利

profit = 0
profits = []
for i in range(1, len(df)):if df['Close'][i] > df['Close'][i-1]:profit += df['Close'][i] - df['Close'][i-1]else:profit -= df['Close'][i] - df['Close'][i-1]profits.append(profit)
df['Cumulative_Profit'] = profits

7. 绘制K线图、布林带和累计盈利图

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10), sharex=True)

8.绘制K线图

for i in range(len(df)):color = df['Color'][i]ax1.plot(df.index[i:i+1], df['Open'][i:i+1], color=color, linewidth=1)ax1.plot(df.index[i:i+1], df['Close'][i:i+1], color=color, linewidth=1)

9.绘制布林带

ax1.plot(upper_band, color='red', linestyle='--', label='Upper Band')
ax1.plot(lower_band, color='green', linestyle='--', label='Lower Band')

9. 标记买卖信号

ax1.scatter(buy_signals.index, buy_signals['Close'], marker='^', color='blue', label='Buy Signal')
ax1.scatter(sell_signals.index, sell_signals['Close'], marker='v', color='red', label='Sell Signal')

9. 绘制累计盈利图

ax2.plot(df.index[1:], df['Cumulative_Profit'], color='blue', label='Cumulative Profit')

9.设置图表标题和标签

ax1.set_title('Stock Price with Bollinger Bands and Signals')
ax1.set_ylabel('Price')
ax2.set_title('Cumulative Profit Over Time')
ax2.set_ylabel('Profit')

9. 显示图例

ax1.legend()
ax2.legend()

9.显示图表

plt.tight_layout()
plt.show()

完整代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 计算布林带指标
def bollinger_bands(close_prices, window=20, num_std=2):rolling_mean = close_prices.rolling(window=window).mean()rolling_std = close_prices.rolling(window=window).std()upper_band = rolling_mean + (rolling_std * num_std)lower_band = rolling_mean - (rolling_std * num_std)return upper_band, lower_band# 生成示例数据
np.random.seed(0)
dates = pd.date_range(start='2022-01-01', end='2024-01-01', freq='D')
prices = np.random.normal(loc=100, scale=2, size=len(dates)) + np.sin(np.arange(len(dates)) * 0.05) * 10
opens = prices * np.random.uniform(0.98, 1.02, len(prices))
closes = prices * np.random.uniform(0.98, 1.02, len(prices))
df = pd.DataFrame({'Date': dates, 'Open': opens, 'Close': closes}).set_index('Date')# 计算涨跌幅
df['Color'] = np.where(df['Close'] > df['Open'], 'red', 'cyan')# 计算布林带
upper_band, lower_band = bollinger_bands(df['Close'])# 标记买卖信号
buy_signals = df[df['Close'] < lower_band]
sell_signals = df[df['Close'] > upper_band]# 计算累计盈利
profit = 0
profits = []
for i in range(1, len(df)):if df['Close'][i] > df['Close'][i-1]:profit += df['Close'][i] - df['Close'][i-1]else:profit -= df['Close'][i] - df['Close'][i-1]profits.append(profit)# 绘制K线图和信号图以及累计盈利图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10), sharex=True)# 绘制K线图
for i in range(len(df)):if df['Close'][i] > df['Open'][i]:ax1.plot([df.index[i], df.index[i]], [df['Open'][i], df['Close'][i]], color='red', linewidth=1)else:ax1.plot([df.index[i], df.index[i]], [df['Open'][i], df['Close'][i]], color='cyan', linewidth=1)ax1.set_title('Candlestick Chart and Signals')
ax1.set_ylabel('Price')
ax1.grid(True)# 绘制布林带
ax1.plot(upper_band.index, upper_band, label='Upper Bollinger Band', color='red', linestyle='--')
ax1.plot(lower_band.index, lower_band, label='Lower Bollinger Band', color='green', linestyle='--')# 标记买卖信号
ax1.scatter(buy_signals.index, buy_signals['Close'], marker='^', color='blue', label='Buy Signal')
ax1.scatter(sell_signals.index, sell_signals['Close'], marker='v', color='red', label='Sell Signal')# 绘制累计盈利图
ax2.plot(df.index[1:], profits, label='Cumulative Profit', color='blue')
ax2.set_title('Cumulative Profit')
ax2.set_xlabel('Date')
ax2.set_ylabel('Profit')
ax2.legend()
ax2.grid(True)plt.tight_layout()
plt.show()

效果展示

在这里插入图片描述

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

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

相关文章

【C++PCL】点云处理对称目标函数的ICP

作者:迅卓科技 简介:本人从事过多项点云项目,并且负责的项目均已得到好评! 公众号:迅卓科技,一个可以让您可以学习点云的好地方 重点:每个模块都有参数如何调试的讲解,即调试某个参数对结果的影响是什么,大家有问题可以评论哈,如果文章有错误的地方,欢迎来指出错误的…

(第29天)【leetcode题解】222、完全二叉树的节点个数 110、平衡二叉树 257、二叉树的所有路径

目录 222、完全二叉树的节点个数题目描述思路代码 110、平衡二叉树题目描述思路代码 257、二叉树的所有路径题目描述思路代码 总结 222、完全二叉树的节点个数 题目描述 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xf…

在windows下使用本地AI模型提供翻译、对话、文生图服务

文章目录 在windows下使用本地AI模型提供翻译、对话、文生图服务ollama简介下载安装配置环境变量模型安装目录服务监听地址跨域配置我的配置注意事项 开机自启 使用运行模型对话时的命令 查看本地已安装模型删除模型 查看ollama支持的模型 Docker Desktop简介下载安装配置开机自…

【C++】浅拷贝与深拷贝

在C中&#xff0c;浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是两种不同的对象拷贝方式。它们之间的主要区别在于对指针成员的处理方式&#xff1a; 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝在C中通常是指默认的拷贝构…

STM32智能小车学习笔记(避障、循迹、跟随)

我们使用的是STM32CubeMX软件和MDK5 芯片使用的是STM32F103C8T6 完成对STM32CubeMX的初始化后开始我们的第一步点亮一个LED灯 一、点亮LED灯 点亮PC13连接的灯 打开STM32CubeMX软件&#xff0c;pc13设置为输出模式 然后按照这样配置&#xff0c;user label 设置成这个IO口代…

FJSP:烟花算法(FWA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、烟花算法介绍 参考文献&#xff1a; Tan, Y. and Y. Zhu. Fireworks Algorithm for Optimization. in Advances in Swarm Intelligence. 2010. Berlin, Heidelberg: Springer Berlin Heidelberg. 二、烟花算法求解FJSP 2.1FJSP模型介绍 柔性作业车间调度问题(Flexible …

git 怎么让一个文件不提交

要让一个文件不被提交到Git仓库中&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;忽略文件 1. 在项目根目录下创建一个名为 “.gitignore” 的文件。 2. 打开该文件&#xff0c;在每一行写入一个要忽略的文件或文件夹的路径&#xff0c;可以使用通配符匹配多…

Spring-core-MethodParameter

MethodParameter这个类用于方法参数的抽象&#xff0c;例如下面这个方法&#xff0c;我们就可以说test方法包含了3个MethodParameter实例&#xff0c;一个是入参aa&#xff0c;一个是入参bb&#xff0c;还有一个是String类型的返回值 public class AController {public String…

ubuntu 用户名及密码忘记操作

1、重启系统&#xff0c;长按Shift键&#xff0c;直到出现菜单&#xff0c;选则高级设置。选择recovery mode&#xff0c;即恢复模式 2、选择root 3、# 后面敲入 sudo passwd 用户名 4、# passwd "用户名" 之后再敲两次密码就可以了。(如果提示修改失败可先执行&a…

在C++中用3种方法访问一个字符串

1&#xff0e;用字符数组存放一个字符串 编写程序&#xff1a; str是字符数组名&#xff0c;它代表字符数组的首元素的地址&#xff0c;输出时从str指向的字符开始&#xff0c;逐个输出字符&#xff0c;直至遇到\0为止。 2&#xff0e;用字符串变量存放字符串 编写程序&…

PaddleSpeech MFA:阿米娅中文音色复刻计划

PaddleSpeech&#xff1a;阿米娅中文音色复刻计划 本篇项目是对iterhui大佬项目[PaddleSpeech 原神] 音色克隆之胡桃的复刻&#xff0c;使用的PaddleSpeech的版本较新&#xff0c;也针对新版本的PaddleSpeech做了许多配置之上的更新并加入了自己对语音的对齐、配置、训练其它任…

Linux-常用命令-常用设置

1.帮助类命令 1.man命令-获得帮助信息 man [命令或配置文件]例&#xff1a;查看ls命令的帮助信息 man ls输入 ZZ 退出帮助2.服务管理类命令 1.centos7语法 1.1 临时开关服务命令 开启服务&#xff1a; systemctl start 服务名 关闭服务&#xff1a; systemctl stop 服务…

langchian_aws模块学习

利用langchain_aws模块实现集成bedrock调用模型&#xff0c;测试源码 from langchain_aws.chat_models import ChatBedrock import jsondef invoke_with_text(model_id, message):llm ChatBedrock(model_idmodel_id, region_name"us-east-1")res llm.invoke(messa…

STM32 printf 重定向到CAN

最近在调试一款电机驱动板 使用的是CAN总线而且板子上只有一个CAN 想移植Easylogger到上面试试easylogger的效果&#xff0c;先实现pritnf的重定向功能来打印输出 只需要添加以下代码即可实现 代码 #include <stdarg.h> uint8_t FDCAN_UserTxBuffer[512]; void FDCAN_p…

vue-router 源码分析——4.嵌套路由

这是对vue-router 3 版本的源码分析。 本次分析会按以下方法进行&#xff1a; 按官网的使用文档顺序&#xff0c;围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码&#xff0c;更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升&#xff0c;甚至面试时…

小程序 UI 风格魅力非凡

小程序 UI 风格魅力非凡

[创业之路-114] :互联网时代下的扁平化管理趋势与面临的挑战

目录 前言&#xff1a;扁平化管理的时代背景 一、扁平化管理的定义 二、扁平化管理的特点 三、扁平化管理的实施 四、扁平化管理的优势 五、偏平化管理的缺点 六、扁平化管理面临的挑战 七、扁平化管理条件和配套措施 7.1 扁平化管理的条件 7.2 扁平化管理的配套措施…

React Native采集数据离线存储、网络状态监控、加密上传、鉴权

在无网络环境下进行数据采集并在有网络时上传至服务器&#xff0c;同时确保数据的鉴权和加密&#xff0c;这一需求需要考虑多方面的实现细节。无论您选择原生开发还是使用React Native&#xff08;甚至Expo&#xff09;&#xff0c;以下是如何实现这一需求的具体步骤和建议。 …

【Vue】面经基础版-动态路由传参

实现步骤 改造路由动态传参在详情页获取参数 代码实现 改造路由 router/index.js ... {path: /detail/:id,component: ArticleDetail }\views\Article.vue <div class"article-item" v-for"item in articelList" :key"item.id" click&qu…

元音 (音标) 和元音字母的区别

元音 [音标] 和元音字母的区别 1. 音位 (phoneme)1.1. Correspondence between letters and phonemes 2. 元音 (vowel)3. 辅音 (consonant)3.1. Consonant sounds and consonant letters 4. 元音字母 (vowel letter)References 1. 音位 (phoneme) https://en.wikipedia.org/wi…