应用7:用小白量化智能体金融模块做一个股票选股工具

发布于:2025-08-08 ⋅ 阅读:(53) ⋅ 点赞:(0)

应用7:用小白量化智能体金融模块做一个股票选股工具
【小白量化智能体】包含有丰富的金融模块。可以让智能体写各种金融量化工具。
我用让小白量化智能体写一个股票选股工具。
我们给【小白量化智能体】一个程序生成话术。

帮我写一个 选股 的应用程序,要求能够输入。
原始股票池和保存的股票池,以及能够选择选股的周期。生成全部源代码。

【小白量化智能体】生成程序如下:

import tkinter as tk
from tkinter import ttk, filedialog, messagebox, scrolledtext
import time
import HP_global as g
import HP_tdx as htdx  # 小白量化行情模块
import HP_formula as hgs  # 小白通达信公式库
from HP_formula import *   # 小白股票指标公式函数库
#加V:  xblhznt

class StockSelectorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("股票选股工具")
        self.root.geometry("800x600")
        self.root.resizable(True, True)
        
        # 设置中文字体支持
        self.style = ttk.Style()
        self.style.configure("TLabel", font=("SimHei", 10))
        self.style.configure("TButton", font=("SimHei", 10))
        self.style.configure("TEntry", font=("SimHei", 10))
        self.style.configure("TCombobox", font=("SimHei", 10))
        
        # 初始选股公式
        self.initial_formula = '''XG:IF(C>=HHV(REF(H,1),10),1,0)*IF(V>=HHV(REF(V,1),10),1,0);'''
        
        self.create_widgets()
    
    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.source_path_var = tk.StringVar(value="D:\\new_tdx\\T0002\\blocknew\\zxg8.blk")
        self.source_path_entry = ttk.Entry(main_frame, textvariable=self.source_path_var, width=60)
        self.source_path_entry.grid(row=0, column=1, sticky=tk.W, pady=5)
        ttk.Button(main_frame, text="浏览...", command=self.browse_source).grid(row=0, column=2, padx=5, pady=5)
        
        # 保存股票池路径
        ttk.Label(main_frame, text="保存股票池路径:").grid(row=1, column=0, sticky=tk.W, pady=5)
        self.save_path_var = tk.StringVar(value="D:\\new_tdx\\T0002\\blocknew\\zxg88.blk")
        self.save_path_entry = ttk.Entry(main_frame, textvariable=self.save_path_var, width=60)
        self.save_path_entry.grid(row=1, column=1, sticky=tk.W, pady=5)
        ttk.Button(main_frame, text="浏览...", command=self.browse_save).grid(row=1, column=2, padx=5, pady=5)
        
        # 选股周期选择
        ttk.Label(main_frame, text="选股周期:").grid(row=2, column=0, sticky=tk.W, pady=5)
        self.period_var = tk.IntVar(value=4)  # 4代表日线,默认值
        period_frame = ttk.Frame(main_frame)
        period_frame.grid(row=2, column=1, sticky=tk.W, pady=5)
        
        periods = {
            "5分钟线": 0,
            "15分钟线": 1,
            "30分钟线": 2,
            "1小时线": 3,
            "日线": 4,
            "周线": 5,
            "月线": 6
        }
        
        for idx, (text, value) in enumerate(periods.items()):
            ttk.Radiobutton(
                period_frame, 
                text=text, 
                variable=self.period_var, 
                value=value
            ).grid(row=0, column=idx, padx=8)
        
        # 选股公式编辑区域
        ttk.Label(main_frame, text="选股公式 (必须包含XG信号):").grid(row=3, column=0, sticky=tk.NW, pady=5)
        formula_frame = ttk.Frame(main_frame)
        formula_frame.grid(row=3, column=1, columnspan=2, sticky=tk.NSEW, pady=5)
        
        self.formula_text = scrolledtext.ScrolledText(formula_frame, height=6, width=70, wrap=tk.WORD, font=("SimHei", 10))
        self.formula_text.pack(fill=tk.BOTH, expand=True)
        self.formula_text.insert(tk.END, self.initial_formula)
        
        # 日志显示区域
        ttk.Label(main_frame, text="选股日志:").grid(row=4, column=0, sticky=tk.NW, pady=5)
        log_frame = ttk.Frame(main_frame)
        log_frame.grid(row=4, column=1, columnspan=2, sticky=tk.NSEW, pady=5)
        
        self.log_text = scrolledtext.ScrolledText(log_frame, height=10, width=70, wrap=tk.WORD, font=("SimHei", 10))
        self.log_text.pack(fill=tk.BOTH, expand=True)
        
        # 选股按钮
        button_frame = ttk.Frame(main_frame)
        button_frame.grid(row=5, column=1, pady=10)
        
        ttk.Button(
            button_frame, 
            text="开始选股", 
            command=self.start_selection
        ).pack(pady=10)
        
        # 设置网格权重,使区域可扩展
        main_frame.columnconfigure(1, weight=1)
        main_frame.rowconfigure(3, weight=1)
        main_frame.rowconfigure(4, weight=2)
    
    def browse_source(self):
        filename = filedialog.askopenfilename(
            title="选择原始股票池文件",
            filetypes=[("通达信板块文件", "*.blk"), ("所有文件", "*.*")]
        )
        if filename:
            self.source_path_var.set(filename)
    
    def browse_save(self):
        filename = filedialog.asksaveasfilename(
            title="保存选股结果",
            defaultextension=".blk",
            filetypes=[("通达信板块文件", "*.blk"), ("所有文件", "*.*")]
        )
        if filename:
            self.save_path_var.set(filename)
    
    def log(self, message):
        """在日志区域显示消息"""
        self.log_text.insert(tk.END, f"{time.strftime('%H:%M:%S')} - {message}\n")
        self.log_text.see(tk.END)  # 滚动到最后
        self.root.update_idletasks()  # 刷新界面
    
    def start_selection(self):
        """开始选股过程"""
        # 清空日志
        self.log_text.delete(1.0, tk.END)
        
        # 获取用户输入
        source_path = self.source_path_var.get()
        save_path = self.save_path_var.get()
        period = self.period_var.get()
        formula = self.formula_text.get(1.0, tk.END).strip()
        
        # 验证输入
        if not source_path or not save_path:
            messagebox.showerror("错误", "请设置原始股票池和保存路径")
            return
        
        if not formula:
            messagebox.showerror("错误", "请输入选股公式")
            return
            
        if 'XG:' not in formula:
            if messagebox.askyesno("警告", "公式中未发现XG信号,可能导致选股失败,是否继续?"):
                self.log("警告:公式中未明确包含XG信号,可能无法正确选股")
            else:
                return
        
        try:
            self.log("开始初始化通达信连接...")
            # 初始化通达信
            hq = htdx.TdxInit(ip='183.60.224.178', port=7709)
            if not hq:
                self.log("通达信连接失败,请检查网络或服务器地址")
                return
            
            self.log(f"从 {source_path} 加载股票池...")
            # 获取自选股
            codes = htdx.getzxgfile(source_path)
            if not codes:
                self.log("未找到股票数据,请检查原始股票池文件")
                return
            
            self.log(f"共加载 {len(codes)} 只股票,开始选股...")
            
            tgs1 = hgs.Tdxgs()
            selected_stocks = []
            
            # 遍历所有股票
            for i, (market, code) in enumerate(codes):
                try:
                    # 显示进度
                    if i % 10 == 0:
                        self.log(f"正在处理第 {i+1}/{len(codes)} 只股票...")
                    
                    # 获取K线数据
                    df = htdx.get_security_bars(
                        nCategory=period, 
                        nMarket=market, 
                        code=code,
                        nStart=0, 
                        nCount=200
                    )
                    
                    if df is None or df.empty:
                        self.log(f"股票 {code} 没有获取到数据,跳过")
                        continue
                    
                    # 数据处理
                    df.dropna(inplace=True)
                    mydf = hgs.initmydf(df)
                    tgs1.loaddf(mydf)
                    mydf = tgs1.rungs(formula)  # 使用用户输入的公式
                    
                    # 检查选股信号
                    if 'XG' in mydf.columns:
                        xg = mydf['XG']
                    else:
                        mydf['XG'] = 0
                        xg = mydf['XG']
                    
                    # 全局变量赋值(用于公式计算)
                    global CLOSE, LOW, HIGH, OPEN, VOL, C, L, H, O, V, AMO, AMOUNT
                    C = CLOSE = mydf['close']
                    L = LOW = mydf['low']
                    H = HIGH = mydf['high']
                    O = OPEN = mydf['open']
                    V = VOL = mydf['volume']
                    AMO = AMOUNT = mydf['amount']
                    
                    # 检查最后一个交易日是否满足选股条件
                    if xg.iloc[-1] > 0:
                        selected_stocks.append((market, code))
                        self.log(f"选中股票: {code}")
                        
                except Exception as e:
                    self.log(f"处理股票 {code} 时出错: {str(e)}")
                    continue
            
            # 保存选股结果
            if selected_stocks:
                htdx.putzxgfile(selected_stocks, save_path)
                self.log(f"选股完成,共选中 {len(selected_stocks)} 只股票")
                self.log(f"结果已保存至: {save_path}")
                messagebox.showinfo("成功", f"选股完成,共选中 {len(selected_stocks)} 只股票")
            else:
                self.log("没有选中任何股票")
                messagebox.showinfo("结果", "没有选中任何股票")
                
        except Exception as e:
            self.log(f"选股过程出错: {str(e)}")
            messagebox.showerror("错误", f"选股过程出错: {str(e)}")
#加微信:xblhznt
if __name__ == "__main__":
    root = tk.Tk()
    app = StockSelectorApp(root)
    root.mainloop()

程序运行和执行窗口如下:
在程序中输入一个选股指标公式,自动进行选股。
在这里插入图片描述
上面给出了自动生成Python选股工具的程序的示例。

《小白量化智能体》相当一位计算机本科生免费帮你写指标公式,免费写Python策略,写Python量化工具,辅助你做机器学习、深度学习量化研究。
本身是支持中文Python语法和西文Python语法的集成开发工具,适合7岁-70岁人都适合学习中文Python编程。

今天的文章先写到这里,欢迎继续关注我的博客。后面我还介绍更多的【小白量化智能体】开发Python策略的知识。
超越自己是我的每一步!我的进步就是你的进步!


网站公告

今日签到

点亮在社区的每一天
去签到