以下是一个基于Python的股票三日趋势分析脚本,它能够分析指定股票在三天内的趋势变化情况。脚本主要依赖pandas
、numpy
、matplotlib
和yfinance
等库。分析内容包括收盘价的涨跌趋势、成交量变化,并生成可视化图表来帮助用户更好地理解短期趋势。
脚本的分析原理
三日趋势分析主要是基于以下几个原则:
-
三日趋势的定义:
- 通过比较三天内的收盘价,判断趋势是上涨、下跌还是横盘:
- 上涨趋势:若当前日收盘价高于前两日,则为上涨趋势。
- 下跌趋势:若当前日收盘价低于前两日,则为下跌趋势。
- 横盘趋势:若当前日收盘价与前两日变化不大,则为横盘趋势。
- 通过比较三天内的收盘价,判断趋势是上涨、下跌还是横盘:
-
成交量的影响:
- 分析成交量在三天内的变化,如果某一天成交量显著放大,则可能暗示趋势可能发生变化,或者该趋势有较强的动量。
-
结合技术指标分析:
- 可引入一些短期技术指标,如三日均线或三日相对强弱指数(RSI),来辅助判断当前的三日趋势。
代码实现
以下是一个基于上述原理的三日趋势分析脚本。该脚本通过yfinance
库下载指定股票的历史数据,并通过比较三天内的价格和成交量变化来分析短期趋势,并绘制相应的趋势图表。
# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
# 设定 matplotlib 的风格和字体
plt.style.use('seaborn')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 显示负号
# 定义股票三日趋势分析类
class ThreeDayTrendAnalysis:
def __init__(self, ticker, start_date, end_date):
"""
初始化股票分析类
:param ticker: 股票代码,例如 "AAPL"(苹果公司)
:param start_date: 数据开始日期
:param end_date: 数据结束日期
"""
self.ticker = ticker
self.start_date = start_date
self.end_date = end_date
self.data = self.download_data()
def download_data(self):
"""
下载指定股票的历史数据
"""
print(f"正在下载 {self.ticker} 的历史数据...")
data = yf.download(self.ticker, start=self.start_date, end=self.end_date)
data.dropna(inplace=True) # 删除缺失数据
return data
def calculate_trend(self):
"""
计算三日内的涨跌趋势
"""
# 创建趋势列,用于存储三日趋势
self.data['Three_Day_Trend'] = np.nan
# 计算三日趋势:与前两日比较
for i in range(2, len(self.data)):
# 当前日收盘价、前一日收盘价、前两日收盘价
today_close = self.data['Close'].iloc[i]
day_before_close = self.data['Close'].iloc[i - 1]
two_days_before_close = self.data['Close'].iloc[i - 2]
# 判断三日内的价格趋势
if today_close > day_before_close > two_days_before_close:
self.data['Three_Day_Trend'].iloc[i] = 1 # 上涨趋势
elif today_close < day_before_close < two_days_before_close:
self.data['Three_Day_Trend'].iloc[i] = -1 # 下跌趋势
else:
self.data['Three_Day_Trend'].iloc[i] = 0 # 横盘趋势
def plot_trend(self):
"""
绘制收盘价及三日趋势图表
"""
plt.figure(figsize=(14, 8))
# 绘制收盘价
plt.plot(self.data.index, self.data['Close'], label='收盘价', color='blue')
# 标记趋势:1为上涨,-1为下跌,0为横盘
plt.scatter(self.data.index, self.data['Close'], c=self.data['Three_Day_Trend'],
cmap='coolwarm', marker='o', s=50, label='三日趋势')
# 标注趋势文字
for i in range(len(self.data)):
if not np.isnan(self.data['Three_Day_Trend'].iloc[i]):
trend_label = '上涨' if self.data['Three_Day_Trend'].iloc[i] == 1 else (
'下跌' if self.data['Three_Day_Trend'].iloc[i] == -1 else '横盘')
plt.text(self.data.index[i], self.data['Close'].iloc[i], trend_label, fontsize=9, ha='center')
plt.title(f'{self.ticker} 三日趋势分析')
plt.xlabel('日期')
plt.ylabel('收盘价')
plt.legend()
plt.grid()
plt.show()
def run_analysis(self):
"""
运行完整的趋势分析,包括下载数据、计算指标和绘图
"""
print(f"开始分析股票 {self.ticker} 从 {self.start_date} 到 {self.end_date} 的三日趋势。")
self.calculate_trend()
self.plot_trend()
print("分析完成!")
# 使用示例
if __name__ == "__main__":
# 定义股票代码(例如“MSFT”代表微软)和分析区间
stock = ThreeDayTrendAnalysis(ticker="AAPL", start_date="2023-01-01", end_date="2023-10-01")
stock.run_analysis()
代码详解
-
类的初始化 (
__init__
):- 初始化类时,传入股票代码、开始和结束日期,并调用
download_data()
方法下载指定股票的历史数据。
- 初始化类时,传入股票代码、开始和结束日期,并调用
-
数据下载 (
download_data
):- 使用
yfinance
库获取指定股票的历史数据,并删除缺失数据。返回的data
是一个包含Open
、High
、Low
、Close
、Volume
等字段的DataFrame
。
- 使用
-
计算三日趋势 (
calculate_trend
):- 使用循环遍历数据,计算三日内的涨跌趋势。通过比较三天内的收盘价,判断是否为上涨、下跌或横盘趋势,并将结果存储在
Three_Day_Trend
列中。
- 使用循环遍历数据,计算三日内的涨跌趋势。通过比较三天内的收盘价,判断是否为上涨、下跌或横盘趋势,并将结果存储在
-
绘制趋势图表 (
plot_trend
):- 绘制收盘价和三日趋势图表,并使用不同颜色标记三日趋势(红色表示下跌,蓝色表示上涨)。在趋势点上添加趋势标签,以便更直观地查看。
-
运行完整分析 (
run_analysis
):- 调用
run_analysis()
方法,运行整个分析过程,包括数据下载、趋势计算和图表绘制。
- 调用
进一步扩展
该三日趋势分析脚本还可以进一步扩展,如:
- 引入成交量变化分析,判断成交量的放大或缩小是否对趋势有影响。
- 添加其他短期技术指标,如短期均线、三日RSI、三日布林带等,以辅助分析短期趋势。
- 结合机器学习模型,预测短期趋势的变化概率。
通过这些扩展,可以使分析更加全面和准确,为投资决策提供更多的依据。
//python 因为爱,所以学
print("Hello, Python!")
关注我,不迷路,共学习,同进步
关注我,不迷路,共学习,同进步