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()
效果展示

相关文章:
Python在股票交易分析中的应用:布林带与K线图的实战回测
引言 在股票交易的世界中,技术分析是投资者们用来预测市场动向的重要工具。布林带(Bollinger Bands)作为一种动态波动范围指标,因其直观性和实用性而广受欢迎。本文将通过Python代码,展示如何使用布林带结合K线图来分…...
现代密码学-认证、消息认证码
什么是单向散列函数 单向散列函数(one way hash function):一个输入:消息(message),一个固定长度的输出(散列值,hash value),根据散列值检查消息完整性(integrity) 单向散列函数也称为消息摘要…...
在Java中为什么对a赋值为10,在进行a++时还是等于10呢
首先我们看这样一组代码 public class demo1 {public static void main(String[] args) {int a10;aa;System.out.println(a);} } 结果:10不是在第二步有a操作吗?为什么还是10呢? a的执行步骤如下: 保存当前a的值(即10…...
免费数据库同步软件
在信息化日益发展的今天,数据同步成为了企业和个人用户不可或缺的一部分。数据库同步软件作为数据同步的重要工具,能够帮助我们实现不同数据库系统之间的数据复制和同步,确保数据的一致性和完整性。本文将介绍几款免费数据库同步软件…...
如何轻松修改Windows远程连接的端口号
为了增强远程连接的安全性,最好修改默认的远程桌面协议(RDP)端口号。以下步骤将指导您如何修改Windows注册表中的端口设置,并相应地更新防火墙规则。 一、修改注册表中的端口号 打开注册表编辑器: 按下Win R键&#…...
Leetcode 54. 螺旋矩阵(二维数组移动坐标)
54. 螺旋矩阵 使用vis数组记录该位置是否已经被访问 定义一个int型dir来记录方向,0123分别代表右下左上 当越界或碰壁已访问的位置后,修改dir并计算下一个位置 否则根据原dir计算下一个位置 class Solution {public List<Integer> spiralOrder(i…...
深度图的方法实现加雾,Synscapes数据集以及D455相机拍摄为例
前言 在次之前,我们已经做了图像加雾的一些研究,这里我们将从深度图的方法实现加雾展开细讲 图像加雾算法的研究与应用_图像加雾 算法-CSDN博客 接下来将要介绍如何使用深度图像生成雾效图像的方法。利用Synscapes数据集,通过读取EXR格式的…...
QT: 读写ini配置文件(实现qml界面登录,修改)
目录 一.功能介绍 二.暴露属性 三.指定INI文件的路径和格式。 四.登录操作 1.检查INI文件中是否含有登录信息; 2.读取存储的ID; 3.读取存储的密码; 4.成功返回1;失败返回2; 五.修改账号 1.检查INI文件中是否含有登录信…...
DevOps 安全集成:从开发到部署,全生命周期安全守护
目录 一、DevOps 安全集成:为什么要做? 二、DevOps 安全集成:如何做? 三、DevOps 安全集成的优势 四、DevOps 安全集成:一些最佳实践 五、DevOps 安全集成:未来展望 六、思考与建议 七、总结 DevOps…...
R语言数据分析15-xgboost模型预测
XGBoost模型预测的主要大致思路: 1. 数据准备 首先,需要准备数据。这包括数据的读取、预处理和分割。数据应该包括特征和目标变量。 步骤: 读取数据:从CSV文件或其他数据源读取数据。数据清理:处理缺失值、异常值等…...
重构大学数学基础_week04_从点积理解傅里叶变换
这周我们来看一下傅里叶变换。傅里叶变换是一种在数学和许多科学领域中广泛应用的分析方法,它允许我们将信号或函数从其原始域(通常是时间域或空间域)转换到频域表示。在频域中,信号被表示为其组成频率的幅度和相位,这…...
Shell以及Shell编程
Shell的任务 ①分析命令; ②处理通配符、变量替换、命令替换、重定向、管道和作业控制; ③搜索命令并执行。 内部命令:内嵌在Shell中。 外部命令:存在于磁盘上的独立可执行文件。 #!/bin/bash #! 称为一个幻数&…...
从记忆到想象:探索AI的智能未来
引言 人工智能(AI)在信息处理、数据分析和任务自动化等方面展现了强大的能力。然而,在人类独有的记忆和想象力领域,AI仍然有很长的路要走。加利福尼亚大学戴维斯分校的心理学和神经科学教授查兰兰加纳特(Charan Ranga…...
“安全生产月”专题报道:AI智能监控技术如何助力安全生产
今年6月是第23个全国“安全生产月”,6月16日为全国“安全宣传咨询日”。今年全国“安全生产月”活动主题为“人人讲安全、个个会应急——畅通生命通道”。近日,国务院安委会办公室、应急管理部对开展好2024年全国“安全生产月”活动作出安排部署。 随着科…...
【转】ES, 广告索引
思考: 1)直接把别名切换到上一个版本索引 --解决问题 2)广告层级索引如何解决? -routing、join 3)查询的过程:query and fetch, 优化掉fetch 4)segment合并策略 5)全量写入时副…...
Unity学习要点
前言 学习Unity作为游戏开发的强大工具,对于初学者来说,掌握一些基础而实用的技巧是非常重要的。这不仅能帮助你更快地上手,还能在项目开发过程中提高效率。以下是一些Unity初学者的使用技巧,希望能为你的学习之旅提供帮助。 ##…...
简单使用phpqrcode 生成二维码图片
$path ROOT_PATH; //tp项目根路径 require_once $path.vendor/phpqrcode/phpqrcode.php; //加载phpqrcode库 $url http://.$_SERVER[HTTP_HOST]./home/index/detail?id.$param[id]; $value $url; //二维码内容 $errorCorrectionLevel L; //容错级别 $mat…...
软考架构-计算机网络考点
会超纲,3-5分 网络分类 按分布范围划分 局域网 LAN 10m-1000m左右 房间、楼宇、校园 传输速率高 城域网 MAN 10km 城市 广域网 WAN 100km以上 国家或全球(英特网) 按拓扑结构划分 总线型:利用率低、干…...
渗透测试之内核安全系列课程:Rootkit技术初探(三)
今天,我们来讲一下内核安全! 本文章仅提供学习,切勿将其用于不法手段! 目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。在…...
大模型日报2024-06-08
大模型日报 2024-06-08 大模型资讯 AI研究:通过消除矩阵乘法实现高效的大语言模型 摘要: 该AI研究探讨了通过消除矩阵乘法来实现高效且可扩展的大语言模型(LLMs)。此方法旨在提升模型性能,提供更快速和高效的计算方案。 AWS大力投…...
超实用!学生党第一把吉他怎么选?9款“低弦距神器”深度测评与避坑指南!
大家好,我是深耕音乐教育与乐器选购多年的好物推荐官,常年和学生党打交道,最常被问到的问题就是:“预算有限,怎么选到好弹又耐用的吉他?” 其实对学生而言,第一把吉他无需追求高端奢华ÿ…...
破解AutoDock Vina金属对接难题:3种专业方案实战深度解析
破解AutoDock Vina金属对接难题:3种专业方案实战深度解析 【免费下载链接】AutoDock-Vina AutoDock Vina 项目地址: https://gitcode.com/gh_mirrors/au/AutoDock-Vina AutoDock Vina作为最广泛使用的开源分子对接引擎之一,在处理含金属元素的蛋白…...
YOLOv11自定义数据集训练避坑指南:从data.yaml配置到模型选择(实测对比v8)
YOLOv11自定义数据集训练实战:从数据配置到模型调优的深度解析 在计算机视觉领域,目标检测技术的迭代速度令人目不暇接。作为YOLO系列的最新成员,YOLOv11凭借其优化的网络结构和训练策略,正在成为工业界和学术界的热门选择。然而&…...
Simulink新手必看:Enable和Trigger模块的5种实战用法(附模型下载)
Simulink新手必看:Enable和Trigger模块的5种实战用法(附模型下载) 在工业自动化、信号处理和控制系统设计中,Simulink作为一款强大的仿真工具,其子系统控制功能尤为重要。Enable和Trigger模块作为Simulink中的两大核心…...
实战指南:深入Terraria源码的5个核心模块与架构解析
实战指南:深入Terraria源码的5个核心模块与架构解析 【免费下载链接】Terraria-Source-Code 项目地址: https://gitcode.com/gh_mirrors/te/Terraria-Source-Code 你是否曾好奇一款2D沙盒游戏如何实现复杂的物理系统、网络同步和游戏逻辑?Terrar…...
阿里云轻量应用服务器上5分钟搞定EMQ X MQTT集群搭建(附性能调优技巧)
阿里云轻量应用服务器上5分钟构建高可用EMQ X MQTT集群 物联网应用的爆发式增长让MQTT协议成为设备连接的首选方案。对于需要处理海量设备连接的企业开发者而言,单节点MQTT服务器早已无法满足高并发和容灾需求。本文将带你在阿里云轻量应用服务器上快速部署EMQ X集群…...
从DVP到VGA:基于FPGA的OV7670图像采集与实时显示系统设计
1. OV7670摄像头与DVP接口基础 OV7670是一款经典的VGA分辨率图像传感器,在嵌入式视觉领域应用广泛。我第一次接触这款摄像头是在2015年的一个智能门铃项目上,当时就被它小巧的体积和简单的接口所吸引。这款传感器最大支持640x480分辨率,输出格…...
保姆级教程:在Windows上用Anaconda+Pycharm搞定YOLOv5环境(含CUDA12.1配置)
零失败指南:Windows下用AnacondaPycharm搭建YOLOv5全流程解析 1. 环境准备:从零开始的深度学习工作站 在个人电脑上搭建深度学习环境往往让初学者望而生畏,尤其是面对CUDA版本兼容性、虚拟环境管理等复杂问题。本文将手把手带你完成从Anaco…...
大数据核心知识全解(零基础到Hadoop专家路线)【20260324】001篇
文章目录 大数据核心知识全解(零基础到Hadoop专家路线) 一、为什么会出现大数据?(本质原因) 1. 数据来源爆炸 2. 传统技术扛不住 3. 需求倒逼 二、CNCF 是什么?(云原生核心组织) 它和大数据的关系 三、为什么 Hadoop 会流行?(3个核心原因) 1. 它解决了当时最痛的问题…...
从半加器到四位加法器:在Intel Quartus里玩转模块化设计与层次化视图
从半加器到四位加法器:Intel Quartus中的模块化设计实战 引言 在数字电路设计的浩瀚宇宙中,加法器就像是最基础的原子结构,简单却蕴含着无限可能。作为一名FPGA开发者,我常常思考如何让设计既高效又优雅。记得第一次在Quartus中完…...
