Py学习  »  Python

当前最好的策略年化205%,100多个策略可以在软件上查看了(python代码下载)

七年实现财富自由 • 昨天 • 7 次点击  
原创内容第870篇,专注智能量化投资、个人成长与财富自由。
新版本aitrader主界面如下,后续可以自行创建,回测,查看,修改策略,并发布到服务端跟踪策略进展:

系统源码和策略下载地址:AI量化实验室——2025量化投资的星辰大海
import jsonimport osimport platformimport subprocessimport threadingimport wximport wx.gizmos as gizmos#from common import LogEventfrom config import DATA_DIR_QUOTES, DATA_TASKSclass StrategyPanel(wx.Panel):    def __init__(self, parent):        #from core.backtrader_extends.task import local_tasks        super(StrategyPanel, self).__init__(parent)        items = [        ]        self.init_ui()    def init_ui(self):        sizer = wx.BoxSizer(wx.VERTICAL)        # 策略列表标题        title = wx.StaticText(self, label="策略管理", style=wx.ALIGN_CENTER)        title.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))        sizer.Add(title, 0, wx.EXPAND | wx.ALL, 5)        # 创建TreeListCtrl        self.tree_list = gizmos.TreeListCtrl(self, style=        wx.TR_DEFAULT_STYLE        | wx.TR_HIDE_ROOT        | wx.TR_FULL_ROW_HIGHLIGHT        | wx.TR_ROW_LINES                                             )        # 添加列        self.tree_list.AddColumn("策略名称", width=150)               # 设置根节点        root = self.tree_list.AddRoot("所有策略")        # 绑定双击事件        self.tree_list.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.on_item_double_click)        self.tree_list.Bind(wx.EVT_TREE_SEL_CHANGED, self.on_tree_select)        # 加载策略数据        self.load_strategies()        sizer.Add(self.tree_list, 1, wx.EXPAND | wx.ALL, 5)        # 策略操作按钮        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)        self.open_btn = wx.Button(self, label="策略目录")        self.reload_btn = wx.Button(self, label="重新加载")               btn_sizer.Add(self.open_btn, 0,  wx.ALIGN_LEFT |wx.RIGHT, 5)        btn_sizer.Add(self.reload_btn, 0, wx.ALIGN_LEFT | wx.RIGHT, 5)
        sizer.Add(btn_sizer, 0, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 10)        self.SetSizer(sizer)        # 绑定事件        self.open_btn.Bind(wx.EVT_BUTTON, self.open_task_dir)        self.reload_btn.Bind(wx.EVT_BUTTON, self.reload_tasks)            def on_tree_select(self, event):        """处理树节点选择事件"""        item = event.GetItem()        print(item)        data = self.tree_list.GetItemPyData(item)        if data and 'id' in data.keys():            from config import HOST            url = f' {HOST}/strategy/{data["id"]}'            self.Parent.Parent.show_page(url,"策略详情")    def reload_tasks(self, event):        self.load_strategies()        wx.MessageBox('重新加载策略列表成功!')    def open_task_dir(self, event):        # 指定要打开的目录路径        from config import DATA_TASKS        # 检查目录是否存在        target_dir = str(DATA_TASKS.resolve())        if not os.path.exists(str(DATA_TASKS.resolve())):            wx.MessageBox(f"目录不存在: {target_dir}""错误", wx.OK | wx.ICON_ERROR)            return        # 根据不同操作系统打开目录        system = platform.system()        try:            if system == "Windows":                os.startfile(target_dir)            elif system == "Darwin":  # macOS                os.system(f'open "{target_dir}"')            else:  # Linux                os.system(f'xdg-open "{target_dir}"')        except Exception as e:            wx.MessageBox(f"无法打开目录: {str(e)}""错误", wx.OK | wx.ICON_ERROR)    def on_item_double_click(self, event):        item = event.GetItem()        item_data = self.tree_list.GetItemPyData(item)  # 修改为GetItemPyData        if item_data and item_data["type"] == "strategy":            data = item_data["data"]            file_path = DATA_TASKS.joinpath(data['name'] + '.toml')            self.open_file_with_default_editor(str(file_path.resolve()))            # wx.PostEvent(self.GetParent(), LogEvent(            #     message=f"双击策略: {strategy['name']}"            # ))    def fetch_all_strategies(self):        from common.api import fetch_strategies        try:            # 发送HTTP请求            data = fetch_strategies()            # 更新UI            wx.CallAfter(self.update_all_strategies, data)        except (json.JSONDecodeError, ValueError) as e:            wx.CallAfter(self.show_error, f"数据错误: {str(e)}")        except Exception as e:            wx.CallAfter(self.show_error, f"未知错误: {str(e)}")    def fetch_my_strategies(self):        from common.api import fetch_my_strategies        try:            # 发送HTTP请求            data = fetch_my_strategies()            # 更新UI            wx.CallAfter(self.update_ui, data)        except (json.JSONDecodeError, ValueError) as e:            wx.CallAfter(self.show_error, f"数据错误: {str(e)}")        except Exception as e:            wx.CallAfter(self.show_error, f"未知错误: {str(e)}")     def update_all_strategies(self, strategies):        count_public = 0        count_vip = 0        count_official = 0        count_points = 0        for strategy in strategies:            print(strategy)            if strategy['is_vip_only'] == True:                item = self.tree_list.AppendItem(self.vip_only_node, strategy["name"])                self.tree_list.SetItemPyData(item, strategy)  # 修改为SetItemPyData                count_vip += 1            if strategy['is_official'] == True:                item = self.tree_list.AppendItem(self.official_node, strategy["name"])                self.tree_list.SetItemPyData(item, strategy)  # 修改为SetItemPyData                count_official += 1            if strategy['access_type'] == 'points':                item = self.tree_list.AppendItem(self.points_node, strategy["name"])                self.tree_list.SetItemPyData(item, strategy)  # 修改为SetItemPyData                count_points += 1            if strategy['access_type'] == 'public':                item = self.tree_list.AppendItem(self.public_node, strategy["name"])                self.tree_list.SetItemPyData(item, strategy)  # 修改为SetItemPyData                count_public += 1        text = self.tree_list.GetItemText(self.official_node) + f'({count_official})'        self.tree_list.SetItemText(self.official_node, text)        text = self.tree_list.GetItemText(self.vip_only_node) + f'({count_vip})'        self.tree_list.SetItemText(self.vip_only_node, text)        text = self.tree_list.GetItemText(self.public_node) + f'({count_public})'        self.tree_list.SetItemText(self.public_node, text)        text = self.tree_list.GetItemText(self.points_node) + f'({count_points})'        self.tree_list.SetItemText(self.points_node, text)    def update_ui(self, strategies):        count = len(strategies)        text = self.tree_list.GetItemText(self.my_strategies) + f'({count})'        self.tree_list.SetItemText(self.my_strategies, text)        for strategy in strategies:            item = self.tree_list.AppendItem(self.my_strategies, strategy["name"])            # self.tree_list.SetItemText(item, strategy["status"], 1)            # self.tree_list.SetItemText(item, f"{strategy.get('return', 0):.2f}", 2)            # self.tree_list.SetItemText(item, str(strategy.get("position", 0)), 3)            self.tree_list.SetItemPyData(item, strategy)  # 修改为SetItemPyData    def load_strategies(self):        """加载策略到树形列表"""        self.tree_list.DeleteAllItems()        # 添加根节点(TreeListCtrl需要根节点)        root = self.tree_list.AddRoot("所有策略")        #root = self.tree_list.GetRootItem()        # 添加分类节点        self.official_node = self.tree_list.AppendItem(root, "实验室策略")        self.vip_only_node = self.tree_list.AppendItem(root, "星球会员专属策略")        self.public_node = self.tree_list.AppendItem(root, "公开策略")        self.points_node = self.tree_list.AppendItem(root, "积分查看策略")        self.my_strategies = self.tree_list.AppendItem(root, "我创建的策略")        self.local_node = self.tree_list.AppendItem(root, "本地策略")        thread = threading.Thread(target=self.fetch_my_strategies())        thread.start()        thread_all = threading.Thread(target=self.fetch_all_strategies())        thread_all.start()            # 展开所有节点        self.tree_list.ExpandAll()    def open_file_with_default_editor(self, file_path):        """用系统默认编辑器打开文件"""        if not os.path.exists(file_path):            wx.MessageBox(f"文件不存在: {file_path}""错误", wx.OK | wx.ICON_ERROR)            return        try:            if platform.system() == "Windows":                os.startfile(file_path)            elif  platform.system() == "Darwin":  # macOS                subprocess.run(["open", file_path])            else:  # Linux                subprocess.run(["xdg-open", file_path])        except Exception as e:            wx.MessageBox(f"无法打开文件: {str(e)}""错误", wx.OK | wx.ICON_ERROR)

吾日三省吾身
所谓“焦虑”,就是怕,怕未来发生你“应付”不了的事情,对不对?
这就是“焦虑”的第一性原理。
这种广泛性焦虑,是解决不完的。
你可以用尽力气,说服,折腾去所谓“解决”一件事。
然后小心翼翼,啥也不敢,战战兢兢“逃避”,能不做的事情,都不做;要做的事情格外小心,生怕触动心弦。
可以,这种所谓“意料之外”,肯定防不胜防。
根源没能解决,过了这一件,还会很快有下一件,无穷无尽,仓鼠之轮。
正确的方式,跳出循环,不了了之,当然是正确处理之道。
但根本还是提升心力。
不了了之是提升阈值,能接受更多的东西。
而提升心力,是实实在在构建能力。
财务自由能解决99%的问题。
代码和数据下载:AI量化实验室——2025量化投资的星辰大海

AI量化实验室 星球,已经运行三年多,1600+会员。

aitrader代码,因子表达式引擎、遗传算法(Deap)因子挖掘引等,支持vnpy,qlib,backtrader和bt引擎,内置多个年化30%+的策略,每周五迭代一次,代码和数据在星球全部开源。

扩展  •  历史文章   

EarnMore(赚得更多)基于RL的投资组合管理框架:一致的股票表示,可定制股票池管理。(附论文+代码)

年化收益200%+的策略集 | 实时板块资金热力图 「aitrader 5.0系统代码发布」

年化19.66%,回撤12%的稳健策略|manus的启发:基于大模型多智能体的智能投研系统(python代码+数据)

年化30.24%,最大回撤19%,综合动量多因子评分策略再升级(python代码+数据)

年化18%-39.3%的策略集 | backtrader通过xtquant连接qmt实战

stock-pandas,一个易用的talib的替代开源库。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/181635
 
7 次点击