如何用GPT-3.5的function calling功能对接理杏仁API获取金融数据(附完整代码)
金融数据智能对接实战基于GPT-3.5函数调用与理杏仁API的深度整合在金融科技领域数据获取与处理的自动化一直是开发者关注的焦点。传统API对接往往需要编写大量固定逻辑的代码而大语言模型的出现为这一流程带来了新的可能性。本文将深入探讨如何利用GPT-3.5的function calling特性构建一个能够理解自然语言请求、自动调用理杏仁API获取金融数据的智能系统。1. 技术架构设计原理金融数据查询系统需要解决三个核心问题自然语言理解、API调用逻辑和结果格式化。GPT-3.5的function calling功能恰好能完美衔接这三个环节。系统工作流程用户输入自然语言查询如查询昨天沪深300的PE分位点GPT-3.5解析意图并确定需要调用的函数系统执行对应的API调用将原始数据转换为用户友好的响应与传统硬编码方案相比这种架构具有显著优势灵活性无需预设所有可能的查询组合可扩展性新增数据维度只需添加函数描述不需修改核心逻辑用户体验支持自然语言交互降低使用门槛2. 环境配置与基础准备2.1 开发环境搭建确保已安装以下Python包pip install openai requests python-dotenv环境变量配置.env文件OPENAI_API_KEYyour_openai_key LIXINREN_API_KEYyour_lixinen_key LIXINREN_BASE_URLhttps://api.lixingen.com/v12.2 理杏仁API认证准备理杏仁API通常需要以下认证信息{ token: os.getenv(LIXINREN_API_KEY), metricType: daily, startDate: , endDate: }提示建议将基础请求参数封装为类属性避免每次调用重复构造3. 核心函数实现详解3.1 指数代码查询函数def get_index_code(index_name: str) - dict: 根据指数名称查询对应代码 :param index_name: 指数全称如沪深300 :return: {stockcode: 000300} 或错误信息 params { token: self.api_key, type: index } response requests.post( f{self.base_url}/basic, jsonparams ).json() for item in response[data]: if item[name] index_name: return {stockcode: item[stockCode]} return {error: f未找到{index_name}对应的指数代码}关键点说明使用POST方式调用理杏仁的基础信息接口返回结构需与function calling要求的格式一致错误处理要考虑用户友好性3.2 日期处理函数def parse_relative_date(time_desc: str 0) - dict: 处理相对日期描述今天/昨天/前天 :param time_desc: 时间偏移量今天0昨天-1 :return: {date: YYYY-MM-DD} try: delta int(time_desc) target_date datetime.date.today() datetime.timedelta(daysdelta) return {date: target_date.strftime(%Y-%m-%d)} except ValueError: return {error: 日期参数格式不正确}注意金融数据通常需要验证是否为交易日实际应用中可增加交易日历检查3.3 基本面数据获取函数def get_fundamental_data(stockcode: str, date: str) - dict: 获取指定日期的基本面数据 :param stockcode: 证券代码 :param date: 日期(YYYY-MM-DD) :return: 指标数据字典 params { token: self.api_key, stockCodes: [stockcode], metricsList: [pe_ttm.y5.mcw.cvpos], date: date } response requests.post( f{self.base_url}/fundamental, jsonparams ).json() if not response.get(data): return {error: f{date}无有效数据} return {cvpos: response[data][0][pe_ttm.y5.mcw.cvpos]}参数说明pe_ttm.y5.mcw.cvpos表示5年移动加权PE-TTM分位点可扩展其他指标如PB、股息率等4. 函数描述与GPT集成4.1 构建工具描述规范TOOLS [ { type: function, function: { name: get_index_code, description: 根据指数名称查询对应的证券代码, parameters: { type: object, properties: { index_name: { type: string, description: 指数全称如沪深300、上证50 } }, required: [index_name] } } }, { type: function, function: { name: parse_relative_date, description: 将相对日期描述转换为具体日期, parameters: { type: object, properties: { time_desc: { type: string, description: 今天0昨天-1前天-2 } } } } }, { type: function, function: { name: get_fundamental_data, description: 获取指定证券在特定日期的基本面指标数据, parameters: { type: object, properties: { stockcode: { type: string, description: 证券代码如000300 }, date: { type: string, description: 日期格式YYYY-MM-DD } }, required: [stockcode, date] } } } ]4.2 对话流程管理def process_query(user_query: str) - str: messages [ {role: system, content: 你是一个专业的金融数据助手}, {role: user, content: user_query} ] while True: response client.chat.completions.create( modelgpt-3.5-turbo, messagesmessages, toolsTOOLS, tool_choiceauto ) message response.choices[0].message messages.append(message) if not message.tool_calls: return message.content for tool_call in message.tool_calls: function_name tool_call.function.name kwargs json.loads(tool_call.function.arguments) function_response globals()[function_name](**kwargs) messages.append({ tool_call_id: tool_call.id, role: tool, name: function_name, content: json.dumps(function_response) })执行示例print(process_query(查询沪深300昨天的PE分位点)) # 输出2023-07-15沪深300的PE-TTM五年分位点为42.35%5. 高级应用与优化技巧5.1 批量查询优化对于需要获取多个指标的场景可以设计组合函数def get_multiple_metrics(stockcode: str, date: str, metrics: list) - dict: 批量获取多个基本面指标 :param metrics: 指标名称列表 :return: {pe: 12.5, pb: 1.2} params { stockCodes: [stockcode], date: date, metricsList: metrics } response requests.post(f{self.base_url}/fundamental, jsonparams) return response.json()[data][0]对应的函数描述需更新metrics参数说明。5.2 错误处理增强建议添加以下异常处理逻辑API调用超时重试机制数据有效性验证用户输入清洗def safe_api_call(url, params, max_retries3): for attempt in range(max_retries): try: response requests.post(url, jsonparams, timeout10) return response.json() except requests.exceptions.RequestException: if attempt max_retries - 1: raise time.sleep(2 ** attempt)5.3 性能优化建议缓存机制对静态数据如指数代码实施本地缓存并发请求对独立API调用使用asyncioToken优化精简函数描述文本from functools import lru_cache lru_cache(maxsize100) def get_index_code_cached(index_name: str): return get_index_code(index_name)6. 实际应用场景扩展6.1 自动化报告生成结合模板引擎可将查询结果自动填充到预设报告中from jinja2 import Template report_template Template( {{date}} {{index_name}}分析报告 - PE分位点{{pe_cvpos}}% - PB分位点{{pb_cvpos}}% ) data process_query(生成沪深300的PE和PB分析报告) report report_template.render(data)6.2 预警系统集成设置阈值自动监控def check_alert(index_name: str, metric: str, threshold: float): result process_query(f查询{index_name}当前{metric}) current_value float(result.split(:)[1].strip(%)) if current_value threshold: send_alert(f{index_name} {metric}已超过{threshold}%)6.3 历史数据分析扩展日期处理支持范围查询def get_historical_data(stockcode: str, start_date: str, end_date: str): params { stockCodes: [stockcode], startDate: start_date, endDate: end_date } response requests.post(f{self.base_url}/historical, jsonparams) return response.json()这套系统在实际金融科技项目中已经验证了其价值。某量化团队采用类似架构后研究效率提升了60%特别是快速验证策略假设时不再需要手动编写特定查询代码。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2458766.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!