Quantlab希望做成一个桌面软件的形态,可以下载数据并做量化分析,可以跑策略,可以对接实盘。
比传统的看盘软件更好用更智能,比线上的量化社区安全(代码都给你)。
软件主体架构使用wxpython + streamlit。
一些下载数据的任务,软件配置等,使用传统GUI更方便,而与数据呈现,量化分析相关的功能,使用streamlit这样的框架更高效。因些我们把二者结果起来了。
代码都在GUI的目录下:
import wx from gui.widgets.widget_web import WebPanel from config import DATA_DIR def OnAbout(event): wx.MessageBox("公众号:ailabx", "关于 AI量化投研平台", wx.OK | wx.ICON_INFORMATION) def OnExit(win, event): win.Close(True) def make_menubar(win): # Make a file menu with Hello and Exit items fileMenu = wx.Menu() # The "\t..." syntax defines an accelerator key that also triggers # the same event helloItem = fileMenu.Append(-1, "&Hello...\tCtrl-H", "Help string shown in status bar for this menu item") fileMenu.AppendSeparator() # When using a stock ID we don't need to specify the menu item's # label exitItem = fileMenu.Append(wx.ID_EXIT, '退出') # Now a help menu for the about item helpMenu = wx.Menu() aboutItem = helpMenu.Append(wx.ID_ABOUT, '本软件') menuBar = wx.MenuBar() menuBar.Append(fileMenu, "&文件") menuBar.Append(helpMenu, "&帮助") win.Bind(wx.EVT_MENU, OnAbout, aboutItem) win.Bind(wx.EVT_MENU, OnExit, exitItem) return menuBar from .dialog_config import DialogConfig def tool_config_clicked( event ): ico = DATA_DIR.joinpath('images').joinpath('lab.ico') icon = wx.Icon(str(ico.resolve()), wx.BITMAP_TYPE_ICO) # self.SetIcon(icon) dlg = DialogConfig() dlg.ShowModal() class MainFrame(wx.Frame): def __init__(self, *args, **kw): super(MainFrame, self).__init__(*args, **kw) self.SetTitle('AI智能量化投研平台') # 设置默认大小 self.SetSize(wx.Size(900, 600)) ico = DATA_DIR.joinpath('images').joinpath('lab.ico') icon = wx.Icon(str(ico.resolve()), wx.BITMAP_TYPE_ICO) self.SetIcon(icon) # 屏幕居中显示 self.Centre() self.SetMenuBar(make_menubar(self)) self.tool_main = self.CreateToolBar(wx.TB_HORIZONTAL, wx.ID_ANY) tool_png = DATA_DIR.joinpath('images').joinpath('config.png') self.tool_config = self.tool_main.AddTool(wx.ID_ANY, u"配置", wx.Bitmap(str(tool_png.resolve()), wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None) self.tool_main.Realize() self.Maximize() self.CreateStatusBar() self.SetStatusText("欢迎使用AI智能量化投研平台!请关注公众号:ailabx") # Connect Events self.Bind(wx.EVT_TOOL, tool_config_clicked, id=self.tool_config.GetId()) # 主窗口notebook self.m_notebook = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0) web = WebPanel(self.m_notebook) self.m_notebook.AddPage(web, '时间序列分析', True) web.show_url('http://localhost:8501') #self.m_notebook.AddPage(PanelBacktest(self.m_notebook), "可视化回测系统", True)
“AI量化实验室”的思考与调价的说明
昨晚大幅度调价,原因来自偶然的事件。
这个偶然的事情,提醒我重新思考星球的价值。
每天写代码,找前沿的思路,确实花了不少心血。
但代码之前很多初学者,确实有门槛,而我们又没有精力“手把手”地教大家,讲基础的python配置,配置的量化概念。
尤其我们最近上了大模型,openai, langchain,agent开发,因子挖掘之类的,对于新手就更加困难了。
所以,这也算一种筛选吧,避免大家加入之后反倒失望,这样不好。
我们要把有限的精力集中起来服务真正需要的人:
1、至少会编程吧,熟悉python和人工智能就很好了。自己能解决多数环境配置,代码调试的问题。
2、投资有基本概念吧,风险收益,对量化有热情而非只想拿一个策略去赚钱。(应该没有这种圣杯吧,如果有,你说它值多少钱吧)
吾日三省吾身
早上听李蕾讲苏东坡,有所悟。
写作者,其实重的不是文笔,而是观点、思想深度。
观点来自于读书,观察,深度思考和批判性思维。
这其实就是认知的体现,而人与人的高低区别,其实就是认知。
古代科举,写命题作文,其实有其道理。
反观当下数理化语数英,很分散,很多时候,在培养劳动力,而不是决策者。
当然,并不需要人人都杀伐决断。
只是说,在人群之中想脱颖而出,提升这种认知非常重要。
认知高手之外化表现,就是写出高水平的文章。
周岭在《认知驱动》里讲,他只写未来几年还有价值的文章,不追热点和所谓十万+,个人深以为然。
写对自己,对他人有价值的文章,不说传世之作,至少过几年自己还满意。
AI量化实验室
1、引入大模型LLM作为因子挖掘的框架之一(基于KIMI,LangGraph)。
2、整合zvt作为A股数据源。
01 AlphaGPT整合到Quantlab中
主流程基于LangGraph已经走通:
from concurrent.futures import ThreadPoolExecutor from langchain_community.tools.file_management import MoveFileTool from langchain_core.messages import HumanMessage from langchain_core.utils.function_calling import convert_to_openai_function from langchain_openai import ChatOpenAI from langgraph.graph import Graph, END from agents.factor_gpt import FactorGPTAgent from agents.eval_gpt import EvalGPTAgent import os # 这里配置自己的KIMI_KEY,可以持久化在系统用户变量里。 KEY = '' if 'OPENAI_API_KEY' in os.environ: KEY = os.environ['OPENAI_API_KEY'] print(KEY) optional_params = { "response_format": {"type": "json_object"} } model = ChatOpenAI(temperature=0, model='moonshot-v1-8k', openai_api_key=KEY, base_url="https://api.moonshot.cn/v1", max_retries=1, model_kwargs=optional_params) workflow = Graph() workflow.add_node("factor", FactorGPTAgent().run) workflow.add_node("eval", EvalGPTAgent().run) workflow.add_edge('factor', 'eval') workflow.add_edge('eval', END) workflow.set_entry_point("factor") chain = workflow.compile() chain.invoke({})
运算结果如下:
{
“expr”: “(-1 * rank((Ts_Rank(correlation(rank(open), rank(volume), 5)) * rank((returns < 0) ? close : open)))”,
“desc”: “这个因子表达式首先计算开盘价和成交量的排名的相关性,然后将这个相关性与开盘价和收盘价的排名进行交互。接着,我们对每日收益是否为负进行判断,如果为负则使用收盘价,否则使用开盘价。最后,将这个结果取负值并进行排名。这个因子可能捕捉了市场开盘和收盘价格行为与成交量之间的某种关系,以及这种关系如何受到市场收益的影响。”
}
EvalGPT开始自动计算这个因子表达式,并评估它的风险、收益特性:
开始计算:(-1 * rank((Ts_Rank(correlation(rank(open), rank(volume), 5)) * rank((returns < 0) ? close : open)))
02 整合zvt作为A股数据源
客观讲,zvt作为A股数据框架还是不错的,可以节省不少时间。
多数的框架,要么就是可以自行导入csv,或者整合一个商用数据库。zvt把免费与商用接口都实现了,而且低门槛就获取了数据。
代码在如下位置:
一行代码,获取A股股票列表:
from zvt.domain import Stock Stock.record_data(provider="em")
下面这段代码,可以获取股票后复权日线数据:
entity_ids = ["stock_sz_000001", "stock_sz_000338", "stock_sh_601318"] Stock1dHfqKdata.record_data(provider="em", entity_ids=entity_ids, sleeping_time=1)
数据查询也是统一接口:
df = Stock1dHfqKdata.query_data(code='000338', provider='em') print(df)
包括财务数据都是可以统一下载的(后续下载完成,可以考虑打包给大家使用)。
这样我们就可以全市场数据,包括价量数据,财务因子数据,进行选股和择时量化分析。
大模型落地&AGI
星球近期目标:围绕自媒体内容智能创作,包含但不限于:图文,视频。从策划主题,信息收集,内容撰写,自动发布环节。通过大模型Agent的方式来完成。
吾日三省吾身
这两天听书,从苏东坡、陆游到阿加莎.克里斯蒂,挺好。
之前学习很多理财、个人成长类、心理类的书籍的感觉就是,仁者见仁。
肯定有用,但看多了,道理就是那么些道理,反复地说。
其实多数都是显学。
只是他们说得比较系统罢了。
而传记类、历史类的不一样,它就是“真实”发生的,或者人生的一些际遇。
人生裹挟在历史的洪流中,有时候顺遂,有时候惊天巨变,谁不是局中人呢?谁又能左右历史进程呢?
时光白驹过隙,历史的车轮滚滚向前。
我们要做的,无外乎向外探寻世界,而内找回自己。如果还能做点对他人有价值的事情,就再好不过了。
只是当下,太多人都在忙于生存。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103444
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!