100个实用小工具第3——股票分析系统

图片[1] - 100个实用小工具第3——股票分析系统 - 宋马
股票分析系统技术文档

项目概述

本项目是一个基于Python的桌面股票分析应用,使用PySide6作为GUI框架,pyqtgraph进行图表绘制,baostock作为数据源。该应用支持股票数据下载、技术指标计算(MACD、KDJ、WR)、图表显示、主题切换等功能。

技术架构

核心技术栈
GUI框架: PySide6 (Qt for Python)
图表库: pyqtgraph
数据源: baostock
数据存储: SQLite
技术指标计算: talib
配置管理: QSettings
项目结构
plaintext


stock_analysis_app/
├── main.py                 # 应用入口
├── config.py               # 配置管理
├── requirements.txt        # 依赖包列表
├── ui/
│   ├── main_window.py      # 主窗口界面
│   ├── navigation_panel.py # 导航面板
│   ├── parameter_panel.py  # 参数面板
│   ├── chart_layout.py     # 图表布局
│   ├── download_dialog.py  # 下载对话框
│   └── stylesheet_manager.py # 样式表管理
├── logic/
│   ├── baostock_client.py  # Baostock客户端封装
│   └── indicators.py       # 指标计算
├── widgets/
│   ├── custom_chart.py     # 自定义图表组件
│   └── custom_date_axis.py # 自定义日期坐标轴
└── data/
    ├── stock.db            # SQLite数据库
    └── cache/              # 缓存目录

核心功能实现

1. 数据下载与缓存

应用使用Baostock作为数据源,通过多线程下载股票数据并存储到SQLite数据库中。为了提高性能,系统实现了数据缓存机制:
python

在DownloadThread中实现数据预处理和缓存


def run(self):
# 下载数据
rs = bs.query_history_k_data_plus(
self.code,
“date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM,isST”,
start_date=self.start_date,
end_date=self.end_date,
frequency=“d”,
adjustflag=“3”
)


# 按年份分组处理并缓存
df['year'] = pd.to_datetime(df['date']).dt.year
years = df['year'].unique()

for year in years:
    year_data = df[df['year'] == year].copy()
    if not year_data.empty:
        # 计算技术指标
        year_data = calc.calculate_all_indicators(year_data)
        
        # 保存处理好的数据到缓存文件
        self.client.save_processed_data(self.code, year, year_data)


2. 技术指标计算



使用talib库计算MACD、KDJ、WR等技术指标:
python
class IndicatorCalculator:
    def calculate_macd(self, data, short=12, long=26, signal=9):
        """计算MACD指标"""
        close_prices = np.array(data['close'], dtype=float)
        macd, signal_line, hist * 2 = talib.MACD(
            close_prices, 
            fastperiod=short, 
            slowperiod=long, 
            signalperiod=signal
        )
        return macd, signal_line, hist
    
    def calculate_kdj(self, data, n=9, m1=3, m2=3):
        """计算KDJ指标"""
        high_prices = np.array(data['high'], dtype=float)
        low_prices = np.array(data['low'], dtype=float)
        close_prices = np.array(data['close'], dtype=float)
        
        k, d = talib.STOCH(
            high_prices, low_prices, close_prices,
            fastk_period=n, 
            slowk_period=m1, 
            slowk_matype=0,
            slowd_period=m2, 
            slowd_matype=0
        )
        j = 3 * k - 2 * d
        return k, d, j
    
    def calculate_wr(self, data, n=14):
        """计算威廉指标"""
        high_prices = np.array(data['high'], dtype=float)
        low_prices = np.array(data['low'], dtype=float)
        close_prices = np.array(data['close'], dtype=float)
        
        wr = talib.WILLR(high_prices, low_prices, close_prices, timeperiod=n)
        return wr

3. 图表显示

使用pyqtgraph绘制K线图和技术指标图表:
python


class CustomChart(QWidget):
    def plot_candlestick(self, x_data, open_data, high_data, low_data, close_data):
        """绘制K线图"""
        for i in range(len(x_data)):
            x = x_data[i]
            high = high_data[i]
            low = low_data[i]
            open_price = open_data[i]
            close_price = close_data[i]
            
            # 影线
            self.plot_widget.plot([x, x], [low, high], pen=pg.mkPen(color='k', width=1))
            
            # 实体
            if close_price > open_price:
                # 阳线(上涨)
                color = 'g'
            else:
                # 阴线(下跌)
                color = 'r'
                
            self.plot_widget.plot([x, x], [open_price, close_price], 
                                pen=pg.mkPen(color=color, width=3))

4. 主题切换

实现了深色和浅色主题切换功能:
python


class StyleSheetManager:
    def apply_theme(self, theme):
        """应用主题"""
        app = QApplication.instance()
        if theme == "dark":
            app.setStyleSheet(self.dark_stylesheet)
        elif theme == "light":
            app.setStyleSheet(self.light_stylesheet)

5. 年份跳转

实现了年份选择和跳转功能,支持在不同年份间快速切换数据:
python


def sync_year_spinboxes(self, year):
    """同步两个年份选择器的值"""
    # 阻止信号循环触发
    self.param_panel.year_spinbox.blockSignals(True)
    self.chart_layout.year_spinbox.blockSignals(True)
    
    # 同步值
    if self.sender() == self.param_panel.year_spinbox:
        self.chart_layout.year_spinbox.setValue(year)
    elif self.sender() == self.chart_layout.year_spinbox:
        self.param_panel.year_spinbox.setValue(year)
        
    # 恢复信号
    self.param_panel.year_spinbox.blockSignals(False)
    self.chart_layout.year_spinbox.blockSignals(False)

性能优化

数据缓存: 预处理后的数据保存到缓存文件,避免重复计算
多线程: 数据下载使用独立线程,避免阻塞UI
防抖动: 参数调整使用防抖动机制,避免频繁刷新
使用说明
安装依赖: pip install -r requirements.txt
运行应用: python main.py
首次使用会提示下载默认股票数据
可通过参数面板调整技术指标参数
支持深色/浅色主题切换

总结

本项目展示了如何使用Python构建一个功能完整的股票分析应用,涵盖了数据获取、处理、可视化和用户交互等各个方面。通过合理的架构设计和性能优化,提供了流畅的用户体验。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容