吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11318|回复: 98
收起左侧

[Python 原创] [AI辅助生成代码]python获取股票数据,并发deepseek分析。【分析仅供参考】

    [复制链接]
ypcgamelife 发表于 2025-5-6 15:52
本帖最后由 ypcgamelife 于 2025-5-6 15:54 编辑

利用python程序,获取股票数据并发给deepseek分析,将股票分析结果放word文件。
将股票代吗放mystock.txt文件中,一个股票代码一行。也可在程序界面中录入股票代码,点保存将股票存入mystock.txt中。
大家讲api-key替换成自己的申请的。ai分析结果仅供参考,后果自行负责。
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import akshare as ak
import pandas as pd
import datetime
import os
from docx import Document
from openai import OpenAI
import json

# 设置OpenAI API配置
client = OpenAI(
    base_url="https://api.deepseek.com/v1",
    api_key="sk-000000000000"
)

def load_stock_codes():
    if os.path.exists('mystock.txt'):
        with open('mystock.txt', 'r') as f:
            return f.read().strip().split('\n')
    return []

def save_stock_codes(codes):
    with open('mystock.txt', 'w') as f:
        f.write('\n'.join(codes))

def prepare_stock_data(df, code):
    # 获取股票名称
    stock_info = ak.stock_info_a_code_name()
    stock_name = stock_info[stock_info['code'] == code]['name'].iloc[0] if not stock_info[stock_info['code'] == code].empty else '未知'
    
    # 计算技术指标
    ma5 = df['收盘'].rolling(5).mean()
    ma10 = df['收盘'].rolling(10).mean()
    ma20 = df['收盘'].rolling(20).mean()
    ma60 = df['收盘'].rolling(60).mean()
    
    # 计算RSI
    delta = df['收盘'].diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
    rs = gain / loss
    rsi = 100 - (100 / (1 + rs))
    
    # 计算MACD
    exp1 = df['收盘'].ewm(span=12, adjust=False).mean()
    exp2 = df['收盘'].ewm(span=26, adjust=False).mean()
    macd = exp1 - exp2
    signal = macd.ewm(span=9, adjust=False).mean()
    
    # 计算布林带
    middle_band = df['收盘'].rolling(20).mean()
    std = df['收盘'].rolling(20).std()
    upper_band = middle_band + (std * 2)
    lower_band = middle_band - (std * 2)
    
    # 准备分析数据,将所有数值转换为Python原生类型
    analysis_data = {
        '股票代码': code,
        '股票名称': stock_name,
        '最新收盘价': float(df['收盘'].iloc[-1]),
        '近5日涨跌幅': f"{df['收盘'].pct_change().iloc[-5:].mean() * 100:.2f}%",
        '成交量': int(df['成交量'].iloc[-1]),
        '成交额': float(df['成交额'].iloc[-1]),
        '换手率': float(df['换手率'].iloc[-1]),
        '技术指标': {
            'MA5': float(ma5.iloc[-1]),
            'MA10': float(ma10.iloc[-1]),
            'MA20': float(ma20.iloc[-1]),
            'MA60': float(ma60.iloc[-1]),
            'RSI': float(rsi.iloc[-1]),
            'MACD': float(macd.iloc[-1]),
            'MACD信号线': float(signal.iloc[-1]),
            '布林带上轨': float(upper_band.iloc[-1]),
            '布林带中轨': float(middle_band.iloc[-1]),
            '布林带下轨': float(lower_band.iloc[-1])
        }
    }
    return analysis_data

def analyze_stocks(codes):
    today = datetime.datetime.now().strftime('%Y%m%d')
    doc = Document()
    doc.add_heading(f'股票分析报告 {today}', 0)
    
    for code in codes:
        try:
            df = ak.stock_zh_a_hist(symbol=code, period="daily", start_date="20240101", adjust="qfq")
            if df is not None and len(df) > 0:
                # 准备分析数据
                analysis_data = prepare_stock_data(df, code)
                
                # 构建提示词
                prompt = f"""请分析以下股票数据,给出详细的分析报告和投资建议:
{json.dumps(analysis_data, ensure_ascii=False, indent=2)}

请从以下几个方面进行分析:
1. 基本面分析
2. 技术面分析
3. 市场情绪分析
4. 风险提示
5. 投资建议
6. 预测下一个交易日涨幅

请用专业、客观的语言进行分析,并给出具体的操作建议。"""
                
                # 调用deepseek-chat模型
                response = client.chat.completions.create(
                    model="deepseek-chat",
                    messages=[
                        {"role": "system", "content": "你是一位专业的股票分析师,请对股票数据进行深入分析并提供投资建议。"},
                        {"role": "user", "content": prompt}
                    ],
                    temperature=0.7,
                    max_tokens=2000
                )
                
                # 获取分析结果
                analysis_result = response.choices[0].message.content
                
                # 添加到文档
                doc.add_heading(f'股票代码: {code} ({analysis_data["股票名称"]})', level=1)
                doc.add_paragraph(analysis_result)
                
        except Exception as e:
            doc.add_heading(f'股票代码: {code}', level=1)
            doc.add_paragraph(f'分析失败: {str(e)}')
    
    doc.save(f'stock_analysis_{today}.docx')
    messagebox.showinfo("分析完成", f"分析结果已保存到 stock_analysis_{today}.docx")


class StockAnalysisApp:
    def __init__(self, root):
        self.root = root
        self.root.title("股票分析程序")
        self.root.geometry("600x400")

        self.stock_codes = load_stock_codes()
        self.stock_text = scrolledtext.ScrolledText(root, height=10, width=50)
        self.stock_text.pack(pady=10)
        self.stock_text.insert(tk.END, '\n'.join(self.stock_codes))

        self.save_button = tk.Button(root, text="保存股票代码", command=self.save_codes)
        self.save_button.pack(pady=5)

        self.analyze_button = tk.Button(root, text="分析股票", command=self.analyze)
        self.analyze_button.pack(pady=5)

    def save_codes(self):
        codes = self.stock_text.get(1.0, tk.END).strip().split('\n')
        save_stock_codes(codes)
        messagebox.showinfo("保存成功", "股票代码已保存到mystock.txt")

    def analyze(self):
        codes = self.stock_text.get(1.0, tk.END).strip().split('\n')
        if not codes:
            messagebox.showerror("错误", "请先输入股票代码!")
            return
        analyze_stocks(codes)

if __name__ == "__main__":
    root = tk.Tk()
    app = StockAnalysisApp(root)
    root.mainloop()

免费评分

参与人数 16吾爱币 +17 热心值 +14 收起 理由
chen152 + 1 + 1 我很赞同!
happyjack + 1 谢谢@Thanks!
TheSSS + 1 + 1 谢谢@Thanks!
st1717 + 1 + 1 我很赞同!
WUJI02 + 1 + 1 我很赞同!
chunjun_yao + 1 + 1 热心回复!
hzk777 + 1 我很赞同!
我爱柠檬汁 + 1 + 1 谢谢@Thanks!
wzk520520 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Foreverday + 1 谢谢@Thanks!
w81587679 + 1 + 1 谢谢@Thanks!
lcg2014 + 1 牛人
nywthy + 2 + 1 谢谢@Thanks!
15126819695 + 1 + 1 最近正好在做类似的日报功能,有你这个我可以直接修改谢谢
jtjt68 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

makejon 发表于 2025-5-17 15:39
PixPin_2025-05-17_15-37-30.jpg PixPin_2025-05-17_15-37-44.jpg
[Asm] 纯文本查看 复制代码
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import akshare as ak
import pandas as pd
import datetime
import os
from docx import Document
from openai import OpenAI
import json

# 设置OpenAI API配置
client = OpenAI(
    base_url="https://api.deepseek.com/v1",
    api_key="sk-00000000000"
)


def load_stock_codes():
    if os.path.exists('mystock.txt'):
        with open('mystock.txt', 'r') as f:
            return f.read().strip().split('\n')
    return []


def save_stock_codes(codes):
    with open('mystock.txt', 'w') as f:
        f.write('\n'.join(codes))


def load_analysis_history():
    if os.path.exists('analysis_history.csv'):
        return pd.read_csv('analysis_history.csv')
    return pd.DataFrame(columns=['股票代码', '股票名称', '分析日期'])


def save_analysis_history(data):
    df = pd.DataFrame(data)
    df.to_csv('analysis_history.csv', index=False)


def prepare_stock_data(df, code):
    # 获取股票名称
    stock_info = ak.stock_info_a_code_name()
    stock_name = stock_info[stock_info['code'] == code]['name'].iloc[0] if not stock_info[
        stock_info['code'] == code].empty else '未知'

    # 计算技术指标
    ma5 = df['收盘'].rolling(5).mean()
    ma10 = df['收盘'].rolling(10).mean()
    ma20 = df['收盘'].rolling(20).mean()
    ma60 = df['收盘'].rolling(60).mean()

    # 计算RSI
    delta = df['收盘'].diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
    rs = gain / loss
    rsi = 100 - (100 / (1 + rs))

    # 计算MACD
    exp1 = df['收盘'].ewm(span=12, adjust=False).mean()
    exp2 = df['收盘'].ewm(span=26, adjust=False).mean()
    macd = exp1 - exp2
    signal = macd.ewm(span=9, adjust=False).mean()

    # 计算布林带
    middle_band = df['收盘'].rolling(20).mean()
    std = df['收盘'].rolling(20).std()
    upper_band = middle_band + (std * 2)
    lower_band = middle_band - (std * 2)

    # 准备分析数据,将所有数值转换为Python原生类型
    analysis_data = {
        '股票代码': code,
        '股票名称': stock_name,
        '最新收盘价': float(df['收盘'].iloc[-1]),
        '近5日涨跌幅': f"{df['收盘'].pct_change().iloc[-5:].mean() * 100:.2f}%",
        '成交量': int(df['成交量'].iloc[-1]),
        '成交额': float(df['成交额'].iloc[-1]),
        '换手率': float(df['换手率'].iloc[-1]),
        '技术指标': {
            'MA5': float(ma5.iloc[-1]),
            'MA10': float(ma10.iloc[-1]),
            'MA20': float(ma20.iloc[-1]),
            'MA60': float(ma60.iloc[-1]),
            'RSI': float(rsi.iloc[-1]),
            'MACD': float(macd.iloc[-1]),
            'MACD信号线': float(signal.iloc[-1]),
            '布林带上轨': float(upper_band.iloc[-1]),
            '布林带中轨': float(middle_band.iloc[-1]),
            '布林带下轨': float(lower_band.iloc[-1])
        }
    }
    return analysis_data


def analyze_stocks(codes, history_callback=None):
    today = datetime.datetime.now()
    today_str = today.strftime('%Y%m%d')
    time_str = today.strftime('%H%M')

    # 加载历史记录
    history = load_analysis_history().to_dict('records')

    # 用于保存新的分析记录
    new_records = []

    for code in codes:
        try:
            df = ak.stock_zh_a_hist(symbol=code, period="daily", start_date="20240101", adjust="qfq")
            if df is not None and len(df) > 0:
                # 准备分析数据
                analysis_data = prepare_stock_data(df, code)
                stock_name = analysis_data["股票名称"]

                # 构建提示词
                prompt = f"""请分析以下股票数据,给出详细的分析报告和投资建议:
{json.dumps(analysis_data, ensure_ascii=False, indent=2)}

请从以下几个方面进行分析:
1. 基本面分析
2. 技术面分析
3. 市场情绪分析
4. 风险提示
5. 投资建议
6. 预测下一个交易日涨幅

请用专业、客观的语言进行分析,并给出具体的操作建议。"""

                # 调用deepseek-chat模型
                response = client.chat.completions.create(
                    model="deepseek-chat",
                    messages=[
                        {"role": "system",
                         "content": "你是一位专业的股票分析师,请对股票数据进行深入分析并提供投资建议。"},
                        {"role": "user", "content": prompt}
                    ],
                    temperature=0.7,
                    max_tokens=2000
                )

                # 获取分析结果
                analysis_result = response.choices[0].message.content

                # 保存为Word文档
                doc = Document()
                doc.add_heading(f'股票分析报告', 0)
                doc.add_heading(f'股票代码: {code} ({stock_name})', level=1)
                doc.add_paragraph(analysis_result)

                # 使用指定格式保存文件
                file_name = f"{code}_{stock_name}_{today_str}{time_str}.docx"
                doc.save(file_name)

                # 记录分析历史
                record = {
                    '股票代码': code,
                    '股票名称': stock_name,
                    '分析日期': today.strftime('%Y-%m-%d %H:%M:%S'),
                    '文件路径': file_name
                }
                new_records.append(record)

        except Exception as e:
            print(f"分析股票 {code} 时出错: {str(e)}")

    # 添加新记录到历史
    history = new_records + history  # 新记录在前

    # 保存历史记录
    save_analysis_history(history)

    # 更新历史表格
    if history_callback:
        history_callback(history)

    if new_records:
        messagebox.showinfo("分析完成", f"分析结果已保存为 {new_records[0]['文件路径']} 等文件")
    else:
        messagebox.showerror("分析失败", "未能成功分析任何股票")


class StockAnalysisApp:
    def __init__(self, root):
        self.root = root
        self.root.title("股票分析程序")
        self.root.geometry("800x600")

        # 加载历史记录
        self.history = load_analysis_history().to_dict('records')

        # 创建UI
        self.create_widgets()

        # 初始化历史表格
        self.update_history_table()

    def create_widgets(self):
        # 创建主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 股票代码输入区域
        ttk.Label(main_frame, text="分析股票代码:").grid(row=0, column=0, sticky=tk.W, pady=5)

        self.stock_text = scrolledtext.ScrolledText(main_frame, height=3, width=50)
        self.stock_text.grid(row=1, column=0, sticky=(tk.W, tk.E), pady=5)

        # 分析按钮
        self.analyze_button = ttk.Button(main_frame, text="分析股票", command=self.analyze)
        self.analyze_button.grid(row=1, column=1, padx=10, pady=5)

        # 历史记录表格
        ttk.Label(main_frame, text="分析历史记录:").grid(row=2, column=0, sticky=tk.W, pady=5)

        columns = ("股票代码", "股票名称", "分析日期")
        self.history_tree = ttk.Treeview(main_frame, columns=columns, show="headings", height=10)

        for col in columns:
            self.history_tree.heading(col, text=col)
            # 设置列宽
            width = 150 if col != "分析日期" else 200
            self.history_tree.column(col, width=width, anchor=tk.CENTER)

        self.history_tree.grid(row=3, column=0, columnspan=2, sticky=(tk.W, tk.E, tk.N, tk.S), pady=5)

        # 添加垂直滚动条
        scrollbar = ttk.Scrollbar(main_frame, orient=tk.VERTICAL, command=self.history_tree.yview)
        self.history_tree.configure(yscroll=scrollbar.set)
        scrollbar.grid(row=3, column=2, sticky=(tk.N, tk.S))

        # 绑定点击事件
        self.history_tree.bind("<<TreeviewSelect>>", self.on_history_select)

        # 设置网格权重,使表格可以扩展
        main_frame.grid_columnconfigure(0, weight=1)
        main_frame.grid_rowconfigure(3, weight=1)

    def update_history_table(self):
        # 清空表格
        for item in self.history_tree.get_children():
            self.history_tree.delete(item)

        # 填充表格(按日期倒序)
        for record in self.history:
            self.history_tree.insert("", tk.END, values=(
                record['股票代码'],
                record['股票名称'],
                record['分析日期']
            ))

    def on_history_select(self, event):
        # 获取选中的项
        selected_item = self.history_tree.selection()
        if not selected_item:
            return

        # 获取股票代码
        item = self.history_tree.item(selected_item[0])
        stock_code = item['values'][0]  # 股票代码在第一列

        # 填充到文本框
        self.stock_text.delete(1.0, tk.END)
        self.stock_text.insert(tk.END, stock_code)

    def analyze(self):
        codes = self.stock_text.get(1.0, tk.END).strip().split('\n')
        codes = [code.strip() for code in codes if code.strip()]

        if not codes:
            messagebox.showerror("错误", "请先输入股票代码!")
            return

        # 分析股票并更新历史记录
        analyze_stocks(codes, self.update_history_table_callback)

    def update_history_table_callback(self, history):
        self.history = history
        self.update_history_table()


if __name__ == "__main__":
    root = tk.Tk()
    app = StockAnalysisApp(root)
    root.mainloop()
2513002960 发表于 2025-5-6 16:21
ceskaiqiang 发表于 2025-5-6 18:59
本帖最后由 ceskaiqiang 于 2025-5-6 19:27 编辑

deepseek的api需要充值么
 楼主| ypcgamelife 发表于 2025-5-6 15:55
分析结果如下:
股票代码: 601399 (国机重装)
### 国机重装(601399)深度分析报告

#### 1. 基本面分析
- **股价水平**:当前股价2.82元,处于绝对低价区间,显示市场对其估值较低。
- **流动性指标**:单日成交额1.32亿元,换手率0.65%,流动性偏弱,属于典型的小盘股特征。
- **行业属性**:作为重型装备制造企业,其业绩与基建投资周期强相关,需关注国家基建政策动向。

#### 2. 技术面分析(关键指标解读)
- **均线系统**:呈现空头排列(MA5<MA10<MA20<MA60),所有均线构成压制,当前股价已跌破所有均线。
- **MACD指标**:DIF(-0.040)位于DEA(-0.024)下方,柱状体负值扩大,中期下跌动能增强。
- **RSI指标**:40.38处于弱势区间但未超卖,短期或有技术性反抽但力度有限。
- **布林带**:股价贴近下轨(2.736),通道呈开口状态,显示波动率可能加大。

#### 3. 市场情绪分析
- **量价关系**:近5日缩量下跌(-0.69%),显示资金参与度低,缺乏做多意愿。
- **筹码分布**:60日均线(2.968)成为强压力位,上方套牢盘沉重。
- **市场关注度**:换手率低于1%,属于冷门股范畴,需警惕流动性风险。

#### 4. 风险提示
- **系统性风险**:若大盘走弱,低价股容易加速下跌
- **流动性风险**:日均成交不足2亿元,大资金进出困难
- **业绩风险**:重型装备行业受经济周期影响显著
- **技术风险**:MACD死叉状态,短期可能延续调整

#### 5. 投资建议(分情景)
- **保守型投资者**:建议观望,等待出现以下信号再考虑介入:
  1) 连续三日站稳60日均线
  2) 单日换手率突破1.5%
  3) MACD形成金叉
- **激进型投资者**:若参与短线交易需严格设置止损:
  - 建仓位:2.75-2.80区间
  - 止损位:跌破2.72(布林下轨下方3%)
  - 目标位:2.95(20日均线附近)

#### 6. 下一交易日预测
- **大概率走势**:预计在2.75-2.88区间震荡(±2.3%)
- **关键点位**:
  - 压力位:2.864(5日均线)
  - 支撑位:2.736(布林下轨)
- **操作提示**:若早盘快速跌破2.78且15分钟未能收回,需警惕加速下跌风险

#### 附:技术指标权重评估
```mermaid
pie
    title 技术指标重要性权重
    "均线系统" : 35
    "MACD" : 25
    "成交量" : 20
    "RSI" : 15
    "布林带" : 5
```

(注:以上分析基于当前市场数据,投资者需根据自身风险承受能力决策。建议仓位控制不超过总资金的5%)
keep366 发表于 2025-5-6 16:00
太好了,试试
jtjt68 发表于 2025-5-6 16:07
谢谢楼主分享原创作品!请教一下如何用python来批量获取股票近十年的分红派息数据并保存到excel表格里
 楼主| ypcgamelife 发表于 2025-5-6 16:16
jtjt68 发表于 2025-5-6 16:07
谢谢楼主分享原创作品!请教一下如何用python来批量获取股票近十年的分红派息数据并保存到excel表格里


akshare包是获取股票数据的,你可以查询这个包的用法,或用ai帮你生成。
jtjt68 发表于 2025-5-6 16:26
ypcgamelife 发表于 2025-5-6 16:16
akshare包是获取股票数据的,你可以查询这个包的用法,或用ai帮你生成。

好吧,我琢磨一下,谢谢
alvin551018 发表于 2025-5-6 17:34
咋复制不了源码?
af8889 发表于 2025-5-6 17:45
感觉很强大,可惜不会有
ceskaiqiang 发表于 2025-5-6 18:35
看着玩还行,反正别买  哈哈
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-15 06:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表