微调ChatGPT打造自己的量化投资利器

微调ChatGPT打造自己的量化投资利器

本帖最后由 streamer 于 2023-11-1 00:01 编辑

ChatGPT给各行各业都带来了极具想象力的变革空间,在金融量化领域也产生了许多新颖的思路。本文介绍在国产基座大模型的基础上进行下游的微调实践,利用ChatGPT自动分析新闻事件中涉及到的事件类型、行业分类、情感极性以及关联的个股,为分析市场涨跌归因以及新闻舆情因子奠定基础。

一、国产基座大模型概况

随着年初Meta的学术研究LLama模型在不经意间被泄露后,国内大模型技术便呈现出爆发式增长的势头,并且在中文适配上相对于原版更强大,下面简要介绍评测榜单以及微调环境准备。


1.1 中文能力评测榜单

根据opencompass的评测,截止目前(20230727),中文ChatGPT模型中能力相对比较强的有商汤的书生系列模型(InternLM)、百川的Baichuan模型以及清华的ChatGLM系列。



大模型主要的瓶颈在于显存大小,对于市面上常见的7B以及13B模型,使用支持FP16、FP8、Int8、Int4精度的显卡,基本可以在24GB的显卡中完成Lora微调以及部署,如果使用RTX 6000 Ada 或 L40 等新一代的大显存GPU,则可以使用更大的Batch Size更快的完成微调任务。

1.2 微调步骤

目前Github上有相当多的微调大模型方案,这里我们使用https://github.com/hiyouga/LLaMA-Efficient-Tuning库提供的解决方案快速的完成微调任务。

  • 克隆代码库
  • 准备微调数据
  • 运行训练脚本
  • 运行测试脚本
  • 部署

具体使用方法可参考仓库提供的说明文档:https://github.com/hiyouga/LLaMA ... b/main/README_zh.md


二、微调金融模型全流程

新闻数据的一个特点就是非结构化,而在量化中我们处理的都是表格型数据,借助ChatGPT强大的语义理解能力,我们可以抽取或分析文本中蕴含的信息,完成原始数据的标准化。


2.1 财经新闻数据的标注


标注主要分为5个部分:

  • 事件:该新闻涉及的事件类别,如个股财报、个股公告、政策法规、经济数据等
  • 市场:事件涉及的金融市场,如中国市场、美国市场、香港市场等
  • 行业:事件涉及到的行业,如农林牧渔、基础化工等申万一级行业,以及汇率、利率等
  • 情感:该事件反映出的情感倾向,这里划分为7个档次,极度负面、一般负面、轻微负面、轻微正面、一般正面、极度正面、无明显倾向
  • 个股:该事件关联的股票名称

标注数据消耗相当大的精力,花费了半天时间才标记出360条记录。


2.2 数据集配置

LLaMA-Efficient-Tuning 并不能直接处理上述表格记录,我们首先将其整理出一个json文件:

  1. [
  2.     {
  3.         "instruction": "请分析上述新闻中涉及到的金融事件,对应市场,关联行业,情感极性以及关联个股,按逗号分隔输出",
  4.         "input": "沪深股通|绿通科技4月27日获外资买入200.0股。绿通科技获外资买入200.0股。绿通科技最近5个交易日下跌6.46%,陆股通累计净买入600.0股,占流通盘0.00%,区间平均买入价117.59元。",
  5.         "output": "事件:个股行情,市场:中国市场,行业:汽车,情感:轻微正面,关联:绿通科技"
  6.     },
  7.     {
  8.         "instruction": "请分析上述新闻中涉及到的金融事件,对应市场,关联行业,情感极性以及关联个股,按逗号分隔输出",
  9.         "input": "上海证券:给予中来股份买入评级。05上海证券有限责任公司开文明,丁亚,刘清馨对中来股份进行研究并发布了研究报告《走出困境,破茧再起航》,本报告对中来股份给出买入评级,当前股价为15.14元。",
  10.         "output": "事件:个股研报,市场:中国市场,行业:电子,情感:轻微正面,关联:中来股份"
  11.     }
  12. ]

  • input: 即为原始新闻文本
  • instruction: 微调指令,这里指定让其输出新闻中涉及到的金融事件,对应市场,关联行业,情感极性以及关联个股
  • output: 即标注结果

将该json文件放到data目录下,同时运行shell命令计算sha1值:sha1sum fin_data_test.json。

  1. "fin_data": {
  2.     "file_name": "fin_data.json",
  3.     "file_sha1": "a8a7fe65e0c97424a707df0ba64bcb5198450e88"
  4.   },

然后修改dataset_info.json,增加1条该文件的记录值:

至此,训练用的数据便准备完成。


2.3 微调模型

训练时需要指定

  1. CUDA_VISIBLE_DEVICES=0 python3 src/train_bash.py \
  2.     --stage sft \
  3.     --model_name_or_path internlm-chat-7b \
  4.     --do_train \
  5.     --dataset fin_data \
  6.     --finetuning_type lora \
  7.     --output_dir sft_checkpoint \
  8.     --overwrite_cache \
  9.     --per_device_train_batch_size 2 \
  10.     --gradient_accumulation_steps 2 \
  11.     --lr_scheduler_type cosine \
  12.     --logging_steps 10 \
  13.     --save_steps 500 \
  14.     --learning_rate 5e-5 \
  15.     --num_train_epochs 5.0 \
  16.     --plot_loss \
  17.     --fp16 \
  18.     --prompt_template intern

  • model_name_or_path: 基座模型的文件夹位置,这里使用书生模型
  • dataset: data_info中配置的文件名
  • output_dir: 微调输出目录
  • fp16: 使用半精度训练
  • prompt_template intern: 书生模型模板

训练过程中,能够看到损失函数显著的下降:

训练完成后,便得到了Lora增量模型,后续预测时借助Peft机制将其与原始基座模型合并。


2.4 预测模型

同理,准备一份预测数据fin_data_test,运行如下脚本后便能评估模型的预测结果

  1. CUDA_VISIBLE_DEVICES=0 python3 src/train_bash.py \
  2.     --stage sft \
  3.     --model_name_or_path internlm-chat-7b \
  4.     --do_predict \
  5.     --dataset fin_data_test \
  6.     --finetuning_type lora \
  7.     --checkpoint_dir sft_checkpoint \
  8.     --output_dir sft_output \
  9.     --per_device_eval_batch_size 4 \
  10.     --max_samples 100 \
  11.     --predict_with_generate \
  12.     --prompt_template intern

2.5 结果评估

预测数据为:

  1. [
  2.     {
  3.         "instruction": "请分析上述新闻中涉及到的金融事件,对应市场,关联行业,情感极性以及关联个股,按逗号分隔输出",
  4.         "input": "潘托:美联储较为鹰派的“转向” 股市将何去何从。一旦宣布暂停或下调利率或恢复量化宽松,股票价格会出现最初的反射性飙升,资产价格无论如何都会很快崩溃,美联储将面临更加艰难的通胀局面。",
  5.         "output": "事件:经济数据解读,市场:美国市场,行业:利率,情感:轻微负面,关联:无"
  6.     },
  7.     {
  8.         "instruction": "请分析上述新闻中涉及到的金融事件,对应市场,关联行业,情感极性以及关联个股,按逗号分隔输出",
  9.         "input": "新一轮新能源汽车下乡将启,重点解决充电桩“卡脖子”问题。国务院常务会议审议通过关于加快发展先进制造业集群的意见,提出要部署加快推进建设充电基础设施,更好支持新能源汽车下乡和乡村振兴。",
  10.         "output": "事件:政策法规发布,市场:中国市场,行业:汽车,情感:一般正面,关联:无"
  11.     },
  12.     {
  13.         "instruction": "请分析上述新闻中涉及到的金融事件,对应市场,关联行业,情感极性以及关联个股,按逗号分隔输出",
  14.         "input": "万达电影(002739):行业复苏可期 龙头地位稳固。22 年11 月11 日以来,国务院联防联控机制综合组先后公布“二十条”和“新十条”,防疫政策持续优化,电影行业迎来复苏曙光,据灯塔专业版,12 月11 日全国影院营业率已回至74.2%,观影需求有望持续释放。",
  15.         "output": "事件:个股研报,市场:中国市场,行业:传媒,情感:轻微正面,关联:万达电影"
  16.     },
  17.     {
  18.         "instruction": "请分析上述新闻中涉及到的金融事件,对应市场,关联行业,情感极性以及关联个股,按逗号分隔输出",
  19.         "input": "国务院联防联控机制:进一步加强新冠病毒感染中西医协同救治工作。各综合医院、专科医院要加强新冠病毒感染相关中成药和中药饮片的采购和储备,特别是针对重症、危重症患者医疗救治的中药品种,要重点储备、保证供应。",
  20.         "output": "事件:政策法规发布,市场:中国市场,行业:医药生物,情感:一般正面,关联:无"
  21.     },
  22.     {
  23.         "instruction": "请分析上述新闻中涉及到的金融事件,对应市场,关联行业,情感极性以及关联个股,按逗号分隔输出",
  24.         "input": "为何说荣盛发展最坏的时候已经过去了?。2021年32家代表房企的销售目标完成率总体明显低于去年,均值为90.1%。荣盛一直被贴着环京的标签,这意味着荣盛发展与环京是一荣俱荣的状态。央行同步下调了中期借贷便利操作和公开市场操作逆回购利率各10个BP。",
  25.         "output": "事件:个股研报,市场:中国市场,行业:房地产,情感:轻微正面,关联:荣盛发展"
  26.     }
  27. ]

对于上面5条记录,微调模型给出的抽取结果为:

  1. {"label": "事件:经济数据解读,市场:美国市场,行业:利率,情感:轻微负面,关联:无", "predict": "事件:经济数据解读,市场:美国市场,行业:利率,情感:轻微负面,关联:无"}
  2. {"label": "事件:政策法规发布,市场:中国市场,行业:汽车,情感:一般正面,关联:无", "predict": "事件:政策法规发布,市场:中国市场,行业:汽车,情感:轻微正面,关联:无"}
  3. {"label": "事件:个股研报,市场:中国市场,行业:传媒,情感:轻微正面,关联:万达电影", "predict": "事件:个股研报,市场:中国市场,行业:传媒,情感:轻微正面,关联:万达电影"}
  4. {"label": "事件:政策法规发布,市场:中国市场,行业:医药生物,情感:一般正面,关联:无", "predict": "事件:政策法规发布,市场:中国市场,行业:医药生物,情感:一般负面,关联:无"}
  5. {"label": "事件:个股研报,市场:中国市场,行业:房地产,情感:轻微正面,关联:荣盛发展", "predict": "事件:个股研报,市场:中国市场,行业:房地产,情感:轻微正面,关联:荣盛发展"}

可以看出除了第四条新闻情感预测错误外,其他标签基本没有问题,格式也非常规整,ChatGPT真的很强大!


结论

尽管只使用了360条数据进行微调,但在测试集中模型的准确性已经相当可观,相比于Bert模型有质的提升,用好ChatGPT,量化投资大有可为!



欢迎关注我的公众号“量化实战”,原创技术文章第一时间推送。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

所有评论 0
您需要登录后才可以回帖 登录 | 立即注册