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

news2024/11/27 0:51:35

引言

在股票交易的世界中,技术分析是投资者们用来预测市场动向的重要工具。布林带(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.coloradmin.cn/o/1803131.html

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

相关文章

【动态规划-BM79 打家劫舍(二)】

题目 BM79 打家劫舍(二) 描述 你是一个经验丰富的小偷&#xff0c;准备偷沿湖的一排房间&#xff0c;每个房间都存有一定的现金&#xff0c;为了防止被发现&#xff0c;你不能偷相邻的两家&#xff0c;即&#xff0c;如果偷了第一家&#xff0c;就不能再偷第二家&#xff0c;如…

鸿蒙低代码开发一个高频问题

在版本是DevEco Studio 3.1.1 Release&#xff0c;SDK是3.1.0(API9)。 创建和设计的visual文件经常会遇到无法渲染的情况&#xff0c;或者自定义组件在Custom列表中突然不见了的情况。 有以下报错信息的&#xff1a; JSON schema validation error: data/visualModel/value/…

【python报错】TypeError: dict.get() takes no keyword arguments

【Python报错】TypeError: dict.get() takes no keyword arguments 在Python中&#xff0c;字典&#xff08;dict&#xff09;是一种非常灵活的数据结构&#xff0c;用于存储键值对。dict.get()方法是用来从字典中获取与给定键&#xff08;key&#xff09;相关联的值&#xff0…

opera打不开网页最简单的解决办法

如果以上为解决问题&#xff0c;继续下面操作 检查网络连接&#xff1a; 确认您的电脑已连接到互联网。 检查网络连接是否稳定&#xff0c;网络速度慢或链路拥堵可能会导致网页加载失败。 修改Local State文件&#xff1a; 关闭Opera浏览器。 定位到Opera浏览器的配置…

Acrobat Pro DC 2023 for Mac/Win:全平台PDF编辑器的终极解决方案

对于需要处理PDF文档的个人和企业用户来说&#xff0c;Adobe Acrobat Pro DC 2023是一款不可或缺的工具。作为全球领先的PDF编辑器&#xff0c;Acrobat Pro DC 2023在Mac和Windows平台上提供了丰富的功能和令人印象深刻的性能&#xff0c;使其成为用户编辑、转换和管理PDF文档的…

idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法

问题现象 今天同事喊我过去看一个问题&#xff0c;项目正常启动的时候没问题&#xff0c;debug模式就卡住了&#xff0c;很久不动。我推测是哪个断点导致的&#xff0c;一看断点果然有情况。在方法上打了断点。 解决方式(Android Studio一样的解决&#xff09; 1、View Brea…

分享一个用python的本地WIFI密码查看器

本章教程&#xff0c;主要分享一个本地wifi密码查看器&#xff0c;用python实现的&#xff0c;感兴趣的可以试一试。 具体代码 import subprocess # 导入 subprocess 模块&#xff0c;用于执行系统命令 import tkinter as tk # 导入 tkinter 模块&#xff0c;用于创建图形用…

Typescript 中 tsconfig.json 无法写入文件,因为它会覆盖输入文件

先来看看问题 在开发ts项目的时候&#xff0c;包错提示无法写入文件 tsconfig.json无法写入文件"url"因为它会覆盖输入文件 这是tsconfig.json文件配置问题&#xff0c;需要加入下面的配置就好了&#xff1a; {"compilerOptions": {"outDir": …

Android开机动画关闭流程

一步一图项目上要加一个开机动画结束的回调&#xff0c;我这边看下如何加 好&#xff0c;老规矩&#xff0c;如何启动动画&#xff1f;动画是谁启动的&#xff1f;怎么关闭的&#xff1f;谁通知关闭的 带着问题看源码 动画的启动流程 开机动画的主入口在哪&#xff1f; 这个…

ChatGPT-4o体验demo

OpenAI 最近推出了其最新的人工智能语言模型——GPT-4O。该模型是在原有 GPT-4 的基础上进行优化而成&#xff0c;旨在提升生成质量和响应速度。GPT-4O 采用了更加高效的架构设计&#xff0c;使其在处理复杂文本时表现出更快的速度和更高的准确性。GPT-4O 在训练过程中融入了最…

【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR_EL0 | CLIDR | CCSIDR | CSSELR 使用详解 1】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Cache 常用寄存器Cache CSSELR 寄存器Cache CSSELR 使用场景Cache CSSELR 操作示例 Cache CLIDR 寄存器LoUU 介绍LoUU 使用 LoUIS 介绍CLIDR 使用 Cache CCSIDR 寄存器Cache CTR_EL0 C…

手把手教你实现条纹结构光三维重建(1)——多频条纹生成

关于条纹结构光三维重建的多频相移、格雷码、格雷码相移、互补格雷码等等编码方法&#xff0c;我们在大多数平台上&#xff0c;包括现在使用语言大模型提问&#xff0c;都可以搜到相关的理论&#xff0c;本人重点是想教会你怎么快速用代码实现。 首先说下硬件要求&#xff0c;…

【NI国产替代】500 MSPS 采样率,14 bit 分辨率数据采集盒子

• 双高速高精度数据采集通道 • 支持内外精准触发采样模式 • 丰富的总线控制接口 • 抗干扰能力强 高速采集盒子是一款双通道&#xff0c;具有 500 MSPS 采样率&#xff0c;14 bit 分辨率的高速高精度数据采集设备&#xff0c;其模拟输入带宽为 200 MHz&#xff0c;…

【MySQL】常见可执行程序

本文使用的版本是MySQL8&#xff0c;5.7可能会有所不同。 MySQL提供了一些重要的程序用来管理和操作数据库。这里会介绍一些常用的程序及其使用。对于MySQL程序的使用&#xff0c;可以查看官方帮助手册来学习。 MySQL :: MySQL 8.0 Reference Manual :: 6 MySQL Programs 程序…

SM201,SM203主控模块备件

SM201,SM203主控模块备件。MACSV软件安装&#xff1b;二、软件组成及各部分功能&#xff1b;三、组态流程&#xff1b;四、组态详解SM201,SM203主控模块备件&#xff08;组态各部分的操作过程及基本原理&#xff09;。一、MACSV系统软件安装软件安装——计算机角色在每台计算机…

基于STM32智能小车

一、前置准备 前置知识&#xff1a;需要学习stm32&#xff0c;建议去b站看江科大的视频&#xff0c;讲的很详细&#xff0c;学完串口那一块就可以制作了&#xff0c;软件用的是Keil5&#xff0c;开发语言C语言&#xff0c;手机连接蓝牙模块软件是蓝牙调试器。 需要准备的器件…

How To: Localize Bar and Ribbon Skin Items

您可以使用Localizer对象自定义皮肤菜单&#xff0c;而不是迭代每个条形皮肤子菜单项和功能区皮肤库项容器来手动修改这些项。此方法允许您同时自定义所有现有栏子菜单和功能区库中的外观项目。 创建BarLocalizer类的派生类并重写XtraLocalizer.GetLocalizedString方法。 pub…

HTTP-web服务器

web服务器 web服务器实现了http和相关的tcp连接处理&#xff0c;负责管理web服务器提供的资源&#xff0c;以及对服务器的配置&#xff0c;控制以及拓展等方面的管理 web服务器逻辑实现了http协议&#xff0c;并负责提供web服务器的管理功能&#xff0c;web服务器逻辑和操作系…

springboot + Vue前后端项目(第十五记)

项目实战第十五记 写在前面1.后端接口实现1.1 用户表添加角色字段1.2 角色表增加唯一标识字段1.3 UserDTO1.4 UserServiceImpl1.5 MenuServiceImpl 2. 前端实现2.1 User.vue2.2 动态菜单设计2.2.1 Login.vue2.2.2 Aside.vue 2.3 动态路由设计2.3.1 菜单表新增字段page_path2.3.…

开源规则引擎LiteFlow项目应用实践

本文介绍基于开源规则引擎LiteFlow&#xff0c;如何开发规则设计器&#xff0c;在低代码平台中集成规则引擎&#xff0c;并在项目中实现应用的效果。由于低代码平台使用规则引擎实现了逻辑编排的需求&#xff0c;所以本文中的叫法为“逻辑设计”、“逻辑编排”、“逻辑流引擎”…