AI量化实验室
今天我们升级Quantlab:
代码已经发布:
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)
包括财务数据都是可以统一下载的(后续下载完成,可以考虑打包给大家使用)。
这样我们就可以全市场数据,包括价量数据,财务因子数据,进行选股和择时量化分析。
吾日三省吾身
这两天听书,从苏东坡、陆游到阿加莎.克里斯蒂,挺好。
之前学习很多理财、个人成长类、心理类的书籍的感觉就是,仁者见仁。
肯定有用,但看多了,道理就是那么些道理,反复地说。
其实多数都是显学。
只是他们说得比较系统罢了。
而传记类、历史类的不一样,它就是“真实”发生的,或者人生的一些际遇。
人生裹挟在历史的洪流中,有时候顺遂,有时候惊天巨变,谁不是局中人呢?谁又能左右历史进程呢?
时光白驹过隙,历史的车轮滚滚向前。
我们要做的,无外乎向外探寻世界,而内找回自己。如果还能做点对他人有价值的事情,就再好不过了。
只是当下,太多人都在忙于生存。
昨天咱们发布了AlphaGPT v0.1——利用大模型来自动化生成因子。
由于大模型当下的热度,很多同学表示非常感兴趣,认为这是方向,当然也有部分同学提出“强烈”质疑,觉得LLM根本不成熟,不足以支撑量化投资。
这里我来专门做个回应和答疑。
首先,使用LLM来挖掘因子不是我的原创,而是来自华泰金融工程的研报。研报拆解:大语言模型LLM和多智能体(Multi-Agents)实现量价因子挖掘框架
研发使用三个智能体:factor-gpt, code-gpt, eval-gpt。
我是1v1复现这个研报,目前实现了factor-gpt,兼容KIMI和ChatGPT4的API。
通过few-shot的方式,
{
“expr“: “(-1 * rank(((high – open) / open))) * rank(((low – close) / close))“,
“desc“: “这个因子表达式计算了每日的高低价相对于开盘价和收盘价的变动比例,并取其排名。然后,将这两个排名进行相乘,并取其负值。这个因子可能捕捉到价格在日内波动中相对于开盘和收盘的表现,从而揭示潜在的交易机会。”
}
后续还有第二步,会评价因子是否语法正确,通过code-gpt进行计算,如果不正确,会返回结果给factor-gpt重新生成,下次注意语法以进行改进。如果计算正确,则进行第三步效果评估。
效果评估与gplearn和强化学习的fitness机制类似,可以使用ic、ir或者直接使用回测的夏普比,卡玛比率等指标。
然后把评估结果再反馈给factor-gpt做进一步优化,可以告诉gpt,要降低波动或者提升收益。
就这是研报的基本逻辑,也是下周咱们要实现的重要。
昨天大家的讨论中,最核心的逻辑是说:
GPT通用大模型,没有使用因子表达式构造的数据特别训练过(事实上也没有这样的数据),因此GPT就是“照猫画虎”写了表达式,并没有金融逻辑。
————这个逻辑只对了前一半。确实没有使用所谓因子构建的数据训练过。但gpt本身是一个“合格”的量化分析师,她懂金融术语,然后可以按我们自己“输入”的few-shot案例,包括我们的因子语义,她会进行有效的学习。——我们用的“示例”是world-quant101,大家可以换成自己公司积累的因子库,换成自己的函数集,可以写明这些函数的语义,求全因子的逻辑。——gpt完全学得会!
另外,通过eval-gpt会持续给出修改方向,让factor-gpt去收敛。
对比gplearn,有同学说,gplearn至少输出了我们的金融数据——我想说,你可能对于gplearn原理不明白。gplearn只是有“技巧”的搜索参数空间,fitness大的就保留,所以过拟合是常态,且会搞出很多“不可解释”的因子。——强化学习端对端也没有本质改进,都是“搜索”的方式不一样罢了。
gpt没有去搜索,它按“语义”去构建。然后评估fitness后,根据语义再改进。对于不同的数据集,也许没那么快收敛,但只要有效,就是可解释的,如果不考虑gpt消耗token的成本,你可以“持续”迭代下去。另外有一个最最关键的点,人工经验可以补充进行,告诉gpt如何去优化因子。
当然了,技术讨论,仁者见仁,越碰撞越能启发思考。
但大模型应用于AI量化,我选择拥抱。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103446
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!