如何通过市场数据 API 计算 RSI、MACD 与移动平均线MA

news/2026/1/25 21:51:11/文章来源:https://www.cnblogs.com/forexLable/p/19530565

在量化交易和技术分析中,RSI(相对强弱指数)、MACD(移动平均收敛发散指标)和移动平均线(MA)是三个最经典且广泛应用的技术指标。它们能帮助交易者识别市场趋势、动量和潜在的反转点。本文将详细介绍如何通过常见的市场数据 API 获取高质量的金融数据,并使用 Python 手动计算这些核心指标,为你构建量化策略打下坚实基础。
如何通过市场数据API计算RSI、MACD与移动平均线.png

一、数据获取与指标计算

1. 环境准备与数据获取

安装必要的 Python 库并获取 K 线数据。

# 安装必要的库
# pip install requests pandas numpy matplotlibimport requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 设置API请求头(所有iTick接口通用)
headers = {"accept": "application/json","token": "你的API_Token"  # 请替换为你的实际Token
}def fetch_kline_from_itick(symbol='700.HK', region='HK', k_type=8, limit=100):"""从iTick API获取历史K线数据参数:symbol: 标的代码,如‘700.HK’代表腾讯控股region: 市场区域,如‘HK’(港股)、‘US’(美股)、‘CN’(A股)k_type: K线周期,1=1分,2=5分,...,8=日线limit: 获取的K线数量"""url = f"https://api.itick.org/stock/kline?region={region}&code={symbol}&kType={k_type}&limit={limit}"try:response = requests.get(url, headers=headers)data = response.json()if data["code"] == 0:  # 请求成功kline_list = data["data"]df = pd.DataFrame(kline_list)# 重命名和格式化列df.rename(columns={'t': 'timestamp', 'o': 'open', 'h': 'high','l': 'low', 'c': 'close', 'v': 'volume'}, inplace=True)df['datetime'] = pd.to_datetime(df['timestamp'], unit='s')df.set_index('datetime', inplace=True)df.sort_index(inplace=True)  # 确保按时间排序print(f"成功获取 {symbol} 的 {len(df)} 条K线数据")return df[['open', 'high', 'low', 'close', 'volume']]else:print(f"请求失败: {data['msg']}")return Noneexcept Exception as e:print(f"获取数据时发生错误: {e}")return None# 示例:获取腾讯控股(0700.HK)的日线数据
df = fetch_kline_from_itick(symbol='700.HK', region='HK', k_type=8, limit=200)
print(df.head())

2. 计算移动平均线 (MA)

移动平均线是最基础的趋势指标,用于平滑价格数据。

def calculate_ma(df, windows=[5, 10, 20]):"""计算简单移动平均线 (SMA)"""for window in windows:df[f'MA_{window}'] = df['close'].rolling(window=window).mean()return df# 计算5日、10日、20日移动平均线
df = calculate_ma(df, [5, 10, 20])
print(df[['close', 'MA_5', 'MA_10', 'MA_20']].tail())

3. 计算指数平滑移动平均线 (EMA) 与 MACD

MACD 是一个趋势动量指标,由快线(DIF)、慢线(DEA)和柱状图(MACD Histogram)组成。

def calculate_ema(series, period):"""计算指数移动平均线 (EMA)"""return series.ewm(span=period, adjust=False).mean()def calculate_macd(df, fast=12, slow=26, signal=9):"""计算MACD指标标准参数通常为:快线周期12,慢线周期26,信号线周期9"""# 计算快慢EMAdf['EMA_Fast'] = calculate_ema(df['close'], fast)df['EMA_Slow'] = calculate_ema(df['close'], slow)# 计算DIF(差离值)df['DIF'] = df['EMA_Fast'] - df['EMA_Slow']# 计算DEA(信号线,即DIF的EMA)df['DEA'] = calculate_ema(df['DIF'], signal)# 计算MACD柱状图 (通常表示为2*(DIF-DEA))df['MACD_Hist'] = 2 * (df['DIF'] - df['DEA'])return df# 计算MACD
df = calculate_macd(df)
print(df[['close', 'DIF', 'DEA', 'MACD_Hist']].tail())

4. 计算相对强弱指数 (RSI)

RSI 是动量振荡器,用于衡量价格变动的速度和幅度,判断超买或超卖状态。

def calculate_rsi(df, window=14):"""计算相对强弱指数 (RSI)"""# 计算价格变化delta = df['close'].diff()# 分离上涨和下跌gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()# 计算相对强度 (RS) 和 RSIrs = gain / lossdf[f'RSI_{window}'] = 100 - (100 / (1 + rs))return df# 计算14日RSI
df = calculate_rsi(df, window=14)
print(df[['close', 'RSI_14']].tail())

二、 数据可视化

计算完成后,将价格和指标可视化能更直观地进行分析。

def plot_indicators(df, symbol='700.HK'):"""绘制价格、移动平均线、MACD和RSI图表"""fig, axes = plt.subplots(3, 1, figsize=(14, 12), gridspec_kw={'height_ratios': [3, 2, 2]})# 子图1:价格与移动平均线axes[0].plot(df.index, df['close'], label='Close Price', linewidth=1.5, color='black')colors = ['blue', 'orange', 'green']for i, period in enumerate([5, 10, 20]):if f'MA_{period}' in df.columns:axes[0].plot(df.index, df[f'MA_{period}'], label=f'MA{period}', alpha=0.8, color=colors[i])axes[0].set_title(f'{symbol} - Price & Moving Averages')axes[0].set_ylabel('Price')axes[0].legend(loc='upper left')axes[0].grid(True, alpha=0.3)# 子图2:MACDaxes[1].plot(df.index, df['DIF'], label='DIF', color='blue', linewidth=1.5)axes[1].plot(df.index, df['DEA'], label='DEA', color='red', linewidth=1.5)# 用柱状图表示MACD Histogram,绿色为正,红色为负colors_hist = ['green' if x >= 0 else 'red' for x in df['MACD_Hist']]axes[1].bar(df.index, df['MACD_Hist'], color=colors_hist, alpha=0.5, width=0.8, label='MACD Hist')axes[1].axhline(y=0, color='grey', linestyle='--', linewidth=0.8)axes[1].set_ylabel('MACD')axes[1].legend(loc='upper left')axes[1].grid(True, alpha=0.3)# 子图3:RSIaxes[2].plot(df.index, df['RSI_14'], label='RSI 14', color='purple', linewidth=1.5)axes[2].axhline(y=70, color='red', linestyle='--', alpha=0.7, label='Overbought (70)')axes[2].axhline(y=30, color='green', linestyle='--', alpha=0.7, label='Oversold (30)')axes[2].axhline(y=50, color='grey', linestyle='--', alpha=0.5)axes[2].set_ylabel('RSI')axes[2].set_ylim(0, 100)axes[2].legend(loc='upper left')axes[2].grid(True, alpha=0.3)axes[2].set_xlabel('Date')plt.tight_layout()plt.show()# 绘制图表
plot_indicators(df, '700.HK')

三、 进阶:构建简单的交易信号

基于计算出的指标,我们可以生成基础的交易信号。

def generate_signals(df):"""基于MACD和RSI生成简单的交易信号"""df['signal'] = 0  # 初始化信号列# 规则1:RSI超卖(<30)且MACD金叉(DIF上穿DEA)作为潜在买入信号rsi_oversold = df['RSI_14'] < 30macd_golden_cross = (df['DIF'] > df['DEA']) & (df['DIF'].shift(1) <= df['DEA'].shift(1))df.loc[rsi_oversold & macd_golden_cross, 'signal'] = 1  # 买入信号# 规则2:RSI超买(>70)且MACD死叉(DIF下穿DEA)作为潜在卖出信号rsi_overbought = df['RSI_14'] > 70macd_death_cross = (df['DIF'] < df['DEA']) & (df['DIF'].shift(1) >= df['DEA'].shift(1))df.loc[rsi_overbought & macd_death_cross, 'signal'] = -1  # 卖出信号return dfdf_with_signals = generate_signals(df)
signal_points = df_with_signals[df_with_signals['signal'] != 0]
print("交易信号点:")
print(signal_points[['close', 'RSI_14', 'DIF', 'DEA', 'signal']])

四、 总结与应用建议

通过市场 API,我们可以便捷地获取高质量的金融数据,并利用 Python 的强大计算能力,从底层实现 RSI、MACD 和移动平均线等核心指标的计算。这为你自主开发、测试和优化量化策略提供了极大的灵活性和透明度。

几点关键建议:

  1. 理解指标本质:不要盲目使用指标。理解 RSI 的超买超卖、MACD 的金叉死叉以及均线排列背后的市场含义至关重要。
  2. 多指标结合:单个指标可能存在缺陷(如 RSI 在强趋势中的钝化)。结合趋势指标(如 MA)和动量指标(如 RSI, MACD)进行综合判断,可以提高信号的可靠性。
  3. 参数优化与回测:指标的周期参数(如 RSI 的周期、MACD 的快慢线)并非一成不变。你需要针对不同的市场和标的,进行严格的回测来寻找更优的参数组合。
  4. 风险管理:任何技术指标都不能保证 100%的准确。在实际应用中,务必结合严格的资金管理和止损策略。

温馨提示:本文仅供代码参考,不构成任何投资建议。市场有风险,投资需谨慎

参考文档:https://blog.itick.org/rsi-strategy-hands-on-guide-with-itick-data-python
GitHub:https://github.com/itick-org/

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

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

相关文章

Python Dash数据分析实战

你想知道如何用Python Dash把数据分析和可视化结合起来,搭建出交互式的分析应用,核心是想掌握从数据处理到可视化展示、再到交互逻辑实现的完整流程。下面我会从实操角度,一步步教你用Dash完成数据分析与可视化的全…

解读大数据领域数据中台的价值与意义

解读大数据领域数据中台的价值与意义&#xff1a;从“数据孤岛”到“数据中枢”的进化 一、引言&#xff1a;为什么数据中台成为企业的“必选项”&#xff1f; 在数字经济时代&#xff0c;数据被称为“新石油”&#xff0c;但现实中很多企业面临着“有数据无价值”的困境&…

深入了解大数据领域Hive的HQL语言特性

深入了解大数据领域Hive的HQL语言特性 关键词&#xff1a;Hive、HQL、大数据查询、分区表、元数据、MapReduce、UDF 摘要&#xff1a;本文将带你像拆积木一样拆解大数据领域的“查询利器”HiveQL&#xff08;简称HQL&#xff09;。我们会从HQL的诞生背景讲起&#xff0c;用“图…

【BUG】【Python】【爬虫】爬取加载中的数据

示例网页链接&#xff1a;https://movie.douban.com/subject/36907263/ BUG 浏览器开发者模式可以看到所需信息有对应的HTML显式结构 但代码爬取时发现结构被hidden&#xff0c;需要二次加载 import requestsurl https://movie.douban.com/subject/36907263/ headers {Us…

【BUG】【Python】清除字符串空格问题

BUG strip()后依旧有空格DEBUG strip()只清除字符串前后的包括空格、制表符、换行符等&#xff09;&#xff0c;中间的不处理。这时使用replace即可

ParseNet: LOOKING WIDER TO SEE BETTER——拓宽视野以更好地理解 - 实践

ParseNet: LOOKING WIDER TO SEE BETTER——拓宽视野以更好地理解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

Python Dash 快速搭建交互式Web应用

Dash 是 Plotly 公司推出的一款基于 Python 的低代码 Web 开发框架,无需前端(HTML/CSS/JavaScript)基础,就能快速构建高颜值、交互式的数据可视化 Web 应用。本文从环境搭建到实战案例,全程手把手教学,适合Pytho…

22-5. PLC的程序控制指令(子程序)

22-5. PLC的程序控制指令&#xff08;子程序&#xff09;在 PLC&#xff08;可编程逻辑控制器&#xff09;编程中&#xff0c;子程序指令是一种用于结构化编程的核心指令。它的核心思想是“模块化”&#xff1a;将复杂的程序分解成若干个独立的功能块&#xff0c;按需调用。简单…

先过滤后关联的优化经验分享

1、问题语句 最近遇到一个问题&#xff0c;发现开发人员比较喜欢单一的将表放一块一起做关联。如果有了先过滤后关联的思维&#xff0c;大部分语句的性能会获得提升。 以下是真实项目简化而来的例子 select * from ( select a.c1, a.mid, a.bcode,c.ttime ,row_number()over( p…

【视觉大模型论文精读】带你逐段解析 (持续更新)——总览

【视觉大模型论文精读】带你逐段解析 (持续更新)——总览 &#xff08;2021&#xff09;&#xff08;DINO&#xff09;Emerging Properties in Self-Supervised Vision Transformers论文精读&#xff08;逐段解析&#xff09; &#xff08;2023&#xff09;&#xff08;SAM&a…

「LUCKY STUN穿透」使用UptimeRobot使UPnP映射的TCP规则保持活跃

「LUCKY STUN穿透」使用UptimeRobot使UPnP映射的TCP规则保持活跃「LUCKY STUN穿透」使用UptimeRobot使UPnP映射的TCP规则保持活跃 2024.05.04 在之前的教程中我们通过UPnP映射 webhook等功能配合STUN穿透 实现了在无IP…

AI应用架构师详解:智能供应链预测系统模型服务化设计(TensorFlow Serving实践)

AI应用架构师详解:智能供应链预测系统的模型服务化设计——基于TensorFlow Serving的实践指南 一、引言:从"模型训练完成"到"生产可用"的最后一公里痛 作为AI应用架构师,我曾遇到过这样的场景: 数据科学家花了3个月训练出一个供应链销量预测模型——…

A. Perfect Root

time limit per test1 secondmemory limit per test256 megabytesA positive integer x is a perfect root if there exists an integer y such that y√x. For example, 5 is a perfect root because 25−−√5.For each test case, output n distinct perfect roots. Note th…

曲线Curve

曲线Curve1.setFromPoints .setFromPoints()是几何体BufferGeometry的一个方法,通过该方法可以把数组pointsArr中坐标数据提取出来赋值给几何体。具体说就是把pointsArr里面坐标数据提取出来,赋值给geometry.attribu…

「LUCKY STUN穿透」在Docker中使用MiniUPnP为BT客户端自动添加内外端口不同的映射规则

「LUCKY STUN穿透」在Docker中使用MiniUPnP为BT客户端自动添加内外端口不同的映射规则「LUCKY STUN穿透」在Docker中使用MiniUPnP为BT客户端自动添加内外端口不同的映射规则 2024.04.23 关于本教程 在之前的教程中我们…

【论文学习】重新审视面向持续图像分割的基于查询的 Transformer || 用于二分类图像分割的多视图聚合网络

Rethinking Query-based Transformer for Continual Image Segmentation 重新审视面向持续图像分割的基于查询的 Transformer 理解 针对 “持续图像分割” 任务&#xff0c;重新分析并优化 “基于查询的 Transformer” 模型的应用逻辑 基于查询的 Transformer&#xff1a;图…

基于STM32的智能停车场系统设计(实物设计)

基于STM32的智能停车场系统设计摘要随着城市化进程加快与汽车保有量激增&#xff0c;传统停车场管理c效率低下、信息不透明、安全隐患突出等问题日益显著。为解决上述痛点&#xff0c;本文设计了一套基于STM32微控制器的智能停车场系统&#xff0c;实现车辆出入计数、环境参数监…

Kafka与RabbitMQ相比有什么优势? - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

MiniMax的全球化之路:中国AI公司出海的新样本

MiniMax成立4年即实现73%海外收入&#xff0c;以Talkie、海螺AI为核心产品&#xff0c;凭借“生而全球化”战略&#xff0c;从底层架构适配全球市场&#xff0c;通过文化本地化运营和高效市场推广&#xff0c;在全球200多个国家及地区拥有2.12亿用户&#xff0c;为中国AI公司出…

C++工程师的前端之旅:前后端对话 - 实时通信篇 02 - WebSocket订阅(观察者模式实现)

日期 内容 1 20260125 初版 作为一名C++工程师,我们理解观察者模式的核心:当对象状态改变时,自动通知所有依赖它的对象。今天,我用最简单的例子——LED灯的开关状态,展示如何将这一经典模式应用于Web实时通信。 一:为什么需要订阅机制? 想象一个工厂有100个LED灯,每个…