应用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策略的知识。
超越自己是我的每一步!我的进步就是你的进步!