利用akshare、pandas、ta库实现常用技术分析方法识别市场趋势

技术分析是交易者和投资者用来评估金融市场趋势的重要工具。这里我将介绍6种常用的技术分析方法,并使用Python实现这些方法。这里使用pandasta库来计算各种技术指标。

以贵州茅台(股票代码:600519)举例, 分析今年至今的数据。

首先,让我们导入必要的库并获取股票数据:

import akshare as ak import pandas as pd

stock_code = "600519" # 贵州茅台的股票代码 start_date = "20240101" end_date = "20241018"

df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="qfq")

df['日期'] = pd.to_datetime(df['日期']) df.set_index('日期', inplace=True)

print(df.head())

现在,让我们逐一实现常用的技术分析方法:

我用的mac系统,字体采用STHeiti。如果你是windows系统,

字体可以采用SimHei 解决中文乱码。

  1. 快慢移动平均线

快慢移动平均线是一种简单而有效的趋势跟踪方法。我们将使用20日均线作为快线,50日均线作为慢线。

import akshare as ak import pandas as pd import matplotlib.pyplot as plt from ta.trend import SMAIndicator

plt.rcParams["font.sans-serif"] = ["STHeiti"] plt.rcParams["axes.unicode_minus"] = False

stock_code = "600519" start_date = "20240101" end_date = "20241018"

df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="qfq") df['日期'] = pd.to_datetime(df['日期']) df.set_index('日期', inplace=True)

df['SMA20'] = SMAIndicator(close=df['收盘'], window=20).sma_indicator() df['SMA50'] = SMAIndicator(close=df['收盘'], window=50).sma_indicator()

df['Signal'] = 0 df.loc[df['SMA20'] > df['SMA50'], 'Signal'] = 1 df.loc[df['SMA20'] < df['SMA50'], 'Signal'] = -1

plt.figure(figsize=(12, 6)) plt.plot(df.index, df['收盘'], label='收盘价') plt.plot(df.index, df['SMA20'], label='20日均线') plt.plot(df.index, df['SMA50'], label='50日均线') plt.title('贵州茅台 - 快慢移动平均线') plt.legend() plt.show()

print(df[df['Signal'] != df['Signal'].shift(1)])

在这个策略中,当20日均线上穿50日均线时产生买入信号,下穿时产生卖出信号。

  1. 移动平均线 + MACD

这种方法结合了趋势跟踪(移动平均线)和动量指标(MACD)。

import akshare as ak import pandas as pd import matplotlib.pyplot as plt from ta.trend import SMAIndicator, MACD

plt.rcParams["font.sans-serif"] = ["STHeiti"] plt.rcParams["axes.unicode_minus"] = False

stock_code = "600519" start_date = "20240101" end_date = "20241018"

df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="qfq") df['日期'] = pd.to_datetime(df['日期']) df.set_index('日期', inplace=True)

df['SMA50'] = SMAIndicator(close=df['收盘'], window=50).sma_indicator() macd = MACD(close=df['收盘']) df['MACD'] = macd.macd() df['MACD_Signal'] = macd.macd_signal()

df['Signal'] = 0 df.loc[(df['MACD'] > df['MACD_Signal']) & (df['收盘'] > df['SMA50']), 'Signal'] = 1 df.loc[(df['MACD'] < df['MACD_Signal']) & (df['收盘'] < df['SMA50']), 'Signal'] = -1

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

ax1.plot(df.index, df['收盘'], label='收盘价') ax1.plot(df.index, df['SMA50'], label='50日均线') ax1.set_title('贵州茅台 - 价格和50日均线') ax1.legend()

ax2.plot(df.index, df['MACD'], label='MACD') ax2.plot(df.index, df['MACD_Signal'], label='MACD信号线') ax2.bar(df.index, df['MACD'] - df['MACD_Signal'], label='MACD柱状图') ax2.set_title('MACD') ax2.legend()

plt.tight_layout() plt.show()

print(df[df['Signal'] != df['Signal'].shift(1)])

这个策略在MACD上穿信号线且价格在50日均线之上时产生买入信号,反之产生卖出信号。

  1. RSI + 快慢移动平均线

这种方法结合了超买超卖指标(RSI)和趋势跟踪(移动平均线)。

import akshare as ak import pandas as pd import matplotlib.pyplot as plt from ta.trend import SMAIndicator from ta.momentum import RSIIndicator

plt.rcParams["font.sans-serif"] = ["STHeiti"] plt.rcParams["axes.unicode_minus"] = False

stock_code = "600519" start_date = "20240101" end_date = "20241018"

df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="qfq") df['日期'] = pd.to_datetime(df['日期']) df.set_index('日期', inplace=True)

df['SMA20'] = SMAIndicator(close=df['收盘'], window=20).sma_indicator() df['SMA50'] = SMAIndicator(close=df['收盘'], window=50).sma_indicator() df['RSI'] = RSIIndicator(close=df['收盘']).rsi()

df['Signal'] = 0 df.loc[(df['SMA20'] > df['SMA50']) & (df['RSI'] < 70), 'Signal'] = 1 df.loc[(df['SMA20'] < df['SMA50']) & (df['RSI'] > 30), 'Signal'] = -1

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

ax1.plot(df.index, df['收盘'], label='收盘价') ax1.plot(df.index, df['SMA20'], label='20日均线') ax1.plot(df.index, df['SMA50'], label='50日均线') ax1.set_title('贵州茅台 - 价格和移动平均线') ax1.legend()

ax2.plot(df.index, df['RSI'], label='RSI') ax2.axhline(y=70, color='r', linestyle='--') ax2.axhline(y=30, color='g', linestyle='--') ax2.set_title('RSI') ax2.legend()

plt.tight_layout() plt.show()

print(df[df['Signal'] != df['Signal'].shift(1)])

这个策略在20日均线上穿50日均线且RSI低于70时产生买入信号,在20日均线下穿50日均线且RSI高于30时产生卖出信号。

  1. 布林线和RSI

布林线提供了价格波动的范围,而RSI则提供了动量信息。

import akshare as ak import pandas as pd import matplotlib.pyplot as plt from ta.volatility import BollingerBands from ta.momentum import RSIIndicator

plt.rcParams["font.sans-serif"] = ["STHeiti"] plt.rcParams["axes.unicode_minus"] = False

stock_code = "600519" start_date = "20240101" end_date = "20241018"

df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="qfq") df['日期'] = pd.to_datetime(df['日期']) df.set_index('日期', inplace=True)

bollinger = BollingerBands(close=df['收盘']) df['BB_High'] = bollinger.bollinger_hband() df['BB_Low'] = bollinger.bollinger_lband() df['BB_Mid'] = bollinger.bollinger_mavg() df['RSI'] = RSIIndicator(close=df['收盘']).rsi()

df['Signal'] = 0 df.loc[(df['收盘'] < df['BB_Low']) & (df['RSI'] < 30), 'Signal'] = 1 df.loc[(df['收盘'] > df['BB_High']) & (df['RSI'] > 70), 'Signal'] = -1

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

ax1.plot(df.index, df['收盘'], label='收盘价') ax1.plot(df.index, df['BB_High'], label='布林上轨') ax1.plot(df.index, df['BB_Low'], label='布林下轨') ax1.plot(df.index, df['BB_Mid'], label='布林中轨') ax1.set_title('贵州茅台 - 价格和布林带') ax1.legend()

ax2.plot(df.index, df['RSI'], label='RSI') ax2.axhline(y=70, color='r', linestyle='--') ax2.axhline(y=30, color='g', linestyle='--') ax2.set_title('RSI') ax2.legend()

plt.tight_layout() plt.show()

print(df[df['Signal'] != df['Signal'].shift(1)])

这个策略在价格触及布林下轨且RSI低于30时产生买入信号,在价格触及布林上轨且RSI高于70时产生卖出信号。

  1. ADX与快慢移动平均线

ADX(平均趋向指标)用于衡量趋势的强度,而不是趋势的方向。

import akshare as ak import pandas as pd import matplotlib.pyplot as plt from ta.trend import ADXIndicator, SMAIndicator

plt.rcParams["font.sans-serif"] = ["STHeiti"] plt.rcParams["axes.unicode_minus"] = False

stock_code = "600519" start_date = "20240101" end_date = "20241018"

df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="qfq") df['日期'] = pd.to_datetime(df['日期']) df.set_index('日期', inplace=True)

df['SMA20'] = SMAIndicator(close=df['收盘'], window=20).sma_indicator() df['SMA50'] = SMAIndicator(close=df['收盘'], window=50).sma_indicator() adx = ADXIndicator(high=df['最高'], low=df['最低'], close=df['收盘']) df['ADX'] = adx.adx()

df['Signal'] = 0 df.loc[(df['SMA20'] > df['SMA50']) & (df['ADX'] > 25), 'Signal'] = 1 df.loc[(df['SMA20'] < df['SMA50']) & (df['ADX'] > 25), 'Signal'] = -1

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

ax1.plot(df.index, df['收盘'], label='收盘价') ax1.plot(df.index, df['SMA20'], label='20日均线') ax1.plot(df.index, df['SMA50'], label='50日均线') ax1.set_title('贵州茅台 - 价格和移动平均线') ax1.legend()

ax2.plot(df.index, df['ADX'], label='ADX') ax2.axhline(y=25, color='r', linestyle='--') ax2.set_title('ADX') ax2.legend()

plt.tight_layout() plt.show()

print(df[df['Signal'] != df['Signal'].shift(1)])

这个策略在20日均线上穿50日均线且ADX大于25时产生买入信号,在20日均线下穿50日均线且ADX大于25时产生卖出信号。

6. 移动平均线 + MACD + RSI

这种方法结合了趋势跟踪(移动平均线)、动量(MACD)和超买超卖(RSI)指标。

import akshare as ak import pandas as pd import matplotlib.pyplot as plt from ta.trend import SMAIndicator, MACD from ta.momentum import RSIIndicator

plt.rcParams["font.sans-serif"] = ["STHeiti"] plt.rcParams["axes.unicode_minus"] = False

stock_code = "600519" start_date = "20240101" end_date = "20241018"

df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="qfq") df['日期'] = pd.to_datetime(df['日期']) df.set_index('日期', inplace=True)

df['SMA50'] = SMAIndicator(close=df['收盘'], window=50).sma_indicator() macd = MACD(close=df['收盘']) df['MACD'] = macd.macd() df['MACD_Signal'] = macd.macd_signal() df['RSI'] = RSIIndicator(close=df['收盘']).rsi()

df['Signal'] = 0 df.loc[(df['MACD'] > df['MACD_Signal']) & (df['收盘'] > df['SMA50']) & (df['RSI'] < 70), 'Signal'] = 1 df.loc[(df['MACD'] < df['MACD_Signal']) & (df['收盘'] < df['SMA50']) & (df['RSI'] > 30), 'Signal'] = -1

fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(12, 15), sharex=True)

ax1.plot(df.index, df['收盘'], label='收盘价') ax1.plot(df.index, df['SMA50'], label='50日均线') ax1.set_title('贵州茅台 - 价格和50日均线') ax1.legend()

ax2.plot(df.index, df['MACD'], label='MACD') ax2.plot(df.index, df['MACD_Signal'], label='MACD信号线') ax2.bar(df.index, df['MACD'] - df['MACD_Signal'], label='MACD柱状图') ax2.set_title('MACD') ax2.legend()

ax3.plot(df.index, df['RSI'], label='RSI') ax3.axhline(y=70, color='r', linestyle='--') ax3.axhline(y=30, color='g', linestyle='--') ax3.set_title('RSI') ax3.legend()

plt.tight_layout() plt.show()

print(df[df['Signal'] != df['Signal'].shift(1)])

这个策略在MACD上穿信号线、价格在50日均线之上且RSI低于70时产生买入信号,在MACD下穿信号线、价格在50日均线之下且RSI高于30时产生卖出信号。

最后总结:

通过这六种技术分析方法,我们可以从不同角度来分析贵州茅台的股价走势。每种方法都有其优缺点,在实际交易中,通常需要结合多种指标,并配合基本面分析来做出决策。

需要注意的是,这些示例代码主要用于演示技术指标。在实际交易中,还需要考虑许多其他因素,如交易成本、滑点、风险管理等。建议在使用这些策略进行实际交易之前,先在模拟环境中进行充分的测试和优化。

本文由mdnice多平台发布

相关推荐
小瑞瑞acd19 分钟前
【小瑞瑞精讲】卷积神经网络(CNN):从入门到精通,计算机如何“看”懂世界?
人工智能·python·深度学习·神经网络·机器学习
火车叼位38 分钟前
也许你不需要创建.venv, 此规范使python脚本自备依赖
python
火车叼位1 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
孤狼warrior1 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Katecat996631 小时前
YOLO11分割算法实现甲状腺超声病灶自动检测与定位_DWR方法应用
python
玩大数据的龙威2 小时前
农经权二轮延包—各种地块示意图
python·arcgis
ZH15455891312 小时前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
belldeep2 小时前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手2 小时前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
喵手2 小时前
Python爬虫实战:京东/淘宝搜索多页爬虫实战 - 从反爬对抗到数据入库的完整工程化方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·京东淘宝页面数据采集·反爬对抗到数据入库·采集结果csv导出