Merge pull request #155 from llk010502/branch_FinGPT

Update A-share_data_preparation.ipynb notebook
This commit is contained in:
Likun Lin
2024-01-28 17:38:58 -05:00
committed by GitHub

View File

@@ -1,33 +1,40 @@
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Set Data API\n",
"* We used AKShare API(https://github.com/akfamily/akshare) in the following data aquisition process.\n",
"* Should point out that the original \"ak.stock_news_em\" stock news interface only support 100 most recent news, which may not be enought for training data formulation. So we added a new request parameter \"page\" to the source function to achieve multiple pages access."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pip install akshare --upgrade"
"! pip install akshare --upgrade"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Save News Data to Local"
]
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'/Users/mac/Desktop/FinGPT_Forecasting_Project'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"import os\n",
"os.getcwd()"
"os.chdir(\"/Users/mac/Desktop/FinGPT_Forecasting_Project/\")"
]
},
{
@@ -693,12 +700,13 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"import akshare as ak\n",
"import pandas as pd\n",
"import csv\n",
"import time\n",
"import math\n",
"import json\n",
@@ -709,7 +717,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
@@ -854,7 +862,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 53,
"metadata": {},
"outputs": [],
"source": [
@@ -862,7 +870,10 @@
" \"\"\"\n",
" Get company information from API\n",
" \"\"\"\n",
" company_profile = dict(ak.stock_individual_info_em(symbol).values)\n",
" try:\n",
" company_profile = dict(ak.stock_individual_info_em(symbol).values)\n",
" except:\n",
" print(\"Company Info Request Time Out! Please wait and retry.\")\n",
" company_profile[\"上市时间\"] = pd.to_datetime(company_profile[\"上市时间\"]).strftime(\"%Y年%m月%d日\")\n",
"\n",
" template = \"[公司介绍]:\\n\\n{股票简称}是一家在{行业}行业的领先实体。自{上市时间}成立并公开交易以来,该公司已确立其作为市场主要参与者之一的声誉。截止今天,{股票简称}的总市值为{总市值}人民币,总股本数为{总股本},流通市值为{流通市值}人民币,流通股数为{流通股}。\" \\\n",
@@ -939,7 +950,10 @@
"\n",
"def get_all_prompts(symbol, min_past_week=1, max_past_weeks=3, with_basics=True):\n",
" \"\"\"\n",
" Generate prompt\n",
" Generate prompt. The prompt consists of news from past weeks, basics financial information, and weekly return.\n",
" History news in the prompt is chosen from past weeks range from min_past_week to max_past_week, \n",
" and there is a number constraint on ramdomly selected data (default: up to 5).\n",
"\n",
" Args:\n",
" symbol: str\n",
" stock ticker\n",
@@ -966,7 +980,7 @@
" # judge for available history news \n",
" if len(prev_rows) >= min_past_week:\n",
"\n",
" # randomly set retrieve weeks\n",
" # randomly set retrieve data of past weeks\n",
" idx = min(random.choice(range(min_past_week, max_past_weeks+1)), len(prev_rows))\n",
" for i in range(-idx, 0):\n",
" # Add Head\n",
@@ -995,8 +1009,8 @@
" prediction = map_return_label(row['简化周收益'])\n",
"\n",
" prompt = company_prompt + '\\n' + prompt + '\\n' + basics\n",
" prompt += f\"\\n\\n基于在{row['起始日期']}之前的所有信息,让我们首先分析{symbol}的积极发展和潜在担忧。保持陈述的简洁分别提出2-4个最重要的因素。大部分所提及的因素应该从公司的相关新闻中推断出来。\" \\\n",
" f\"那么让我们假设你对于下一周({row['起始日期']}至{row['结算日期']})的预测是{prediction}。提供一个总结分析来支持你的预测。预测结果需要从你最后的分析中推断出来,因此不作为你分析的基础因素。\"\n",
" prompt += f\"\\n\\n基于在{row['起始日期'].strftime('%Y-%m-%d')}之前的所有信息,让我们首先分析{symbol}的积极发展和潜在担忧。请简洁地陈述分别提出2-4个最重要的因素。大部分所提及的因素应该从公司的相关新闻中推断出来。\" \\\n",
" f\"那么让我们假设你对于下一周({row['起始日期'].strftime('%Y-%m-%d')}至{row['结算日期'].strftime('%Y-%m-%d')})的预测是{prediction}。提供一个总结分析来支持你的预测。预测结果需要从你最后的分析中推断出来,因此不作为你分析的基础因素。\"\n",
"\n",
" all_prompts.append(prompt.strip())\n",
"\n",
@@ -1005,7 +1019,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 32,
"metadata": {},
"outputs": [
{
@@ -1020,11 +1034,11 @@
{
"data": {
"text/plain": [
"['[公司介绍]:\\n\\n平安银行是一家在银行行业的领先实体。自1970年01月01日成立并公开交易以来该公司已确立其作为市场主要参与者之一的声誉。截止今天平安银行的总市值为178534447421.59998人民币总股本数为19405918198.0流通市值为178531031940.0人民币流通股数为19405546950.0。\\n\\n平安银行主要在中国运营以股票代码000001在交易所进行交易。作为在银行行业的一个主导力量该公司持续创新不断推动行业进步。\\n\\n自2023-04-09至2023-04-16000001的股票价格由2257.00上涨至2268.38。在此期间的公司新闻如下所列:\\n\\n[新闻标题]金融业高薪招聘AI训练师 有AI产品负责人年薪超百万\\n[新闻内容]:优先考虑具有拥有虚拟偶像、数字人相关产品工作经验者等。 BOSS直聘官网截图 也有一些相对“平易近人”的工作岗位。 如平安银行000001.SZ)网金及财富管理事业部招聘AI业务策略训练师薪资待遇为1万-1.5万元/月。 平安银行介绍称,该岗位负责业务策略训练,将业务策略在智慧经营平台做落地实施,将策略与各触达方式做串联部署\\n\\n[新闻标题]:平安银行王蓉晖:矩阵式产品服务实现“真小微 真信用 真普惠”\\n[新闻内容]:就业多则经济活。 今年3月在平安银行开放日上平安银行董事长谢永林表示全新的开放银行不仅是支持零售转型战略的新打法而且通过服务平台上的海量小微客户平安银行在服务小微践行普惠金融方面也探索出了新举措。 平安银行财报显示截至2022年末平安银行普惠型小微企业贷款累计户数105\\n\\n[新闻标题]20股特大单净流入资金超2亿元\\n[新闻内容]491.562.30建筑装饰300120经纬辉开8.7819.952.28电子002051中工国际12.5010.042.25建筑装饰000001平安银行12.691.042.24银行601138工业富联18.072.322.09电子300014亿纬锂能68.904.242.07电力设备 特大单净流出资金排名\\n\\n如下所列为000001近期的一些金融基本面信息记录时间为2023-03-31:\\n\\n[金融基本面]:\\n\\n报告期: 2023-03-31\\n净利润: 146.02亿\\n净利润同比增长率: 13.63%\\n扣非净利润: 144.69亿\\n扣非净利润同比增长率: 12.40%\\n营业总收入: 450.98亿\\n营业总收入同比增长率: -2.40%\\n基本每股收益: 0.6500\\n每股净资产: 19.42\\n每股资本公积金: 4.16\\n每股未分配利润: 10.25\\n每股经营现金流: 5.62\\n销售净利率: 32.38%\\n净资产收益率: 3.39%\\n净资产收益率-摊薄: 3.27%\\n产权比率: 11.21\\n资产负债率: 91.81%\\n\\n基于在2023-04-16 00:00:00之前的所有信息让我们首先分析000001的积极发展和潜在担忧。保持陈述的简洁分别提出2-4个最重要的因素。大部分所提及的因素应该从公司的相关新闻中推断出来。那么让我们假设你对于下一周(2023-04-16 00:00:00至2023-04-23 00:00:00)的预测是下跌1-2%。提供一个总结分析来支持你的预测。预测结果需要从你最后的分析中推断出来,因此不作为你分析的基础因素。',\n",
" '[公司介绍]:\\n\\n平安银行是一家在银行行业的领先实体。自1970年01月01日成立并公开交易以来该公司已确立其作为市场主要参与者之一的声誉。截止今天平安银行的总市值为178534447421.59998人民币总股本数为19405918198.0流通市值为178531031940.0人民币流通股数为19405546950.0。\\n\\n平安银行主要在中国运营以股票代码000001在交易所进行交易。作为在银行行业的一个主导力量该公司持续创新不断推动行业进步。\\n\\n自2023-04-16至2023-04-23000001的股票价格由2268.38下跌至2237.50。在此期间的公司新闻如下所列:\\n\\n[新闻标题]北向资金昨日净买入22.64亿元光伏设备增持超10亿元名单\\n[新闻内容]:北向资金净卖出昆仑万维(300418.SZ)、金山办公(688111.SH)、平安银行000001.SZ)、华友钴业(603799.SH)、天齐锂业(002466.SZ)居前其中昆仑万维被净卖出4.30亿元金山办公被净卖出3.65亿元平安银行被净卖出3.60亿元华友钴业被净卖出2.76亿元天齐锂业被净卖出2\\n\\n如下所列为000001近期的一些金融基本面信息记录时间为2023-03-31:\\n\\n[金融基本面]:\\n\\n报告期: 2023-03-31\\n净利润: 146.02亿\\n净利润同比增长率: 13.63%\\n扣非净利润: 144.69亿\\n扣非净利润同比增长率: 12.40%\\n营业总收入: 450.98亿\\n营业总收入同比增长率: -2.40%\\n基本每股收益: 0.6500\\n每股净资产: 19.42\\n每股资本公积金: 4.16\\n每股未分配利润: 10.25\\n每股经营现金流: 5.62\\n销售净利率: 32.38%\\n净资产收益率: 3.39%\\n净资产收益率-摊薄: 3.27%\\n产权比率: 11.21\\n资产负债率: 91.81%\\n\\n基于在2023-04-23 00:00:00之前的所有信息让我们首先分析000001的积极发展和潜在担忧。保持陈述的简洁分别提出2-4个最重要的因素。大部分所提及的因素应该从公司的相关新闻中推断出来。那么让我们假设你对于下一周(2023-04-23 00:00:00至2023-04-30 00:00:00)的预测是上涨0-1%。提供一个总结分析来支持你的预测。预测结果需要从你最后的分析中推断出来,因此不作为你分析的基础因素。']"
"['[公司介绍]:\\n\\n平安银行是一家在银行行业的领先实体。自1970年01月01日成立并公开交易以来该公司已确立其作为市场主要参与者之一的声誉。截止今天平安银行的总市值为186684933064.75998人民币总股本数为19405918198.0流通市值为186681361659.0人民币流通股数为19405546950.0。\\n\\n平安银行主要在中国运营以股票代码000001在交易所进行交易。作为在银行行业的一个主导力量该公司持续创新不断推动行业进步。\\n\\n自2023-04-09至2023-04-16000001的股票价格由2257.00上涨至2268.38。在此期间的公司新闻如下所列:\\n\\n[新闻标题]金融业高薪招聘AI训练师 有AI产品负责人年薪超百万\\n[新闻内容]:优先考虑具有拥有虚拟偶像、数字人相关产品工作经验者等。 BOSS直聘官网截图 也有一些相对“平易近人”的工作岗位。 如平安银行000001.SZ)网金及财富管理事业部招聘AI业务策略训练师薪资待遇为1万-1.5万元/月。 平安银行介绍称,该岗位负责业务策略训练,将业务策略在智慧经营平台做落地实施,将策略与各触达方式做串联部署\\n\\n[新闻标题]:平安银行王蓉晖:矩阵式产品服务实现“真小微 真信用 真普惠”\\n[新闻内容]:就业多则经济活。 今年3月在平安银行开放日上平安银行董事长谢永林表示全新的开放银行不仅是支持零售转型战略的新打法而且通过服务平台上的海量小微客户平安银行在服务小微践行普惠金融方面也探索出了新举措。 平安银行财报显示截至2022年末平安银行普惠型小微企业贷款累计户数105\\n\\n[新闻标题]20股特大单净流入资金超2亿元\\n[新闻内容]491.562.30建筑装饰300120经纬辉开8.7819.952.28电子002051中工国际12.5010.042.25建筑装饰000001平安银行12.691.042.24银行601138工业富联18.072.322.09电子300014亿纬锂能68.904.242.07电力设备 特大单净流出资金排名\\n\\n如下所列为000001近期的一些金融基本面信息记录时间为2023-03-31:\\n\\n[金融基本面]:\\n\\n报告期: 2023-03-31\\n净利润: 146.02亿\\n净利润同比增长率: 13.63%\\n扣非净利润: 144.69亿\\n扣非净利润同比增长率: 12.40%\\n营业总收入: 450.98亿\\n营业总收入同比增长率: -2.40%\\n基本每股收益: 0.6500\\n每股净资产: 19.42\\n每股资本公积金: 4.16\\n每股未分配利润: 10.25\\n每股经营现金流: 5.62\\n销售净利率: 32.38%\\n净资产收益率: 3.39%\\n净资产收益率-摊薄: 3.27%\\n产权比率: 11.21\\n资产负债率: 91.81%\\n\\n基于在2023-04-16之前的所有信息让我们首先分析000001的积极发展和潜在担忧。请简洁地陈述分别提出2-4个最重要的因素。大部分所提及的因素应该从公司的相关新闻中推断出来。那么让我们假设你对于下一周(2023-04-16至2023-04-23)的预测是下跌1-2%。提供一个总结分析来支持你的预测。预测结果需要从你最后的分析中推断出来,因此不作为你分析的基础因素。',\n",
" '[公司介绍]:\\n\\n平安银行是一家在银行行业的领先实体。自1970年01月01日成立并公开交易以来该公司已确立其作为市场主要参与者之一的声誉。截止今天平安银行的总市值为186684933064.75998人民币总股本数为19405918198.0流通市值为186681361659.0人民币流通股数为19405546950.0。\\n\\n平安银行主要在中国运营以股票代码000001在交易所进行交易。作为在银行行业的一个主导力量该公司持续创新不断推动行业进步。\\n\\n自2023-04-16至2023-04-23000001的股票价格由2268.38下跌至2237.50。在此期间的公司新闻如下所列:\\n\\n[新闻标题]北向资金昨日净买入22.64亿元光伏设备增持超10亿元名单\\n[新闻内容]:北向资金净卖出昆仑万维(300418.SZ)、金山办公(688111.SH)、平安银行000001.SZ)、华友钴业(603799.SH)、天齐锂业(002466.SZ)居前其中昆仑万维被净卖出4.30亿元金山办公被净卖出3.65亿元平安银行被净卖出3.60亿元华友钴业被净卖出2.76亿元天齐锂业被净卖出2\\n\\n如下所列为000001近期的一些金融基本面信息记录时间为2023-03-31:\\n\\n[金融基本面]:\\n\\n报告期: 2023-03-31\\n净利润: 146.02亿\\n净利润同比增长率: 13.63%\\n扣非净利润: 144.69亿\\n扣非净利润同比增长率: 12.40%\\n营业总收入: 450.98亿\\n营业总收入同比增长率: -2.40%\\n基本每股收益: 0.6500\\n每股净资产: 19.42\\n每股资本公积金: 4.16\\n每股未分配利润: 10.25\\n每股经营现金流: 5.62\\n销售净利率: 32.38%\\n净资产收益率: 3.39%\\n净资产收益率-摊薄: 3.27%\\n产权比率: 11.21\\n资产负债率: 91.81%\\n\\n基于在2023-04-23之前的所有信息让我们首先分析000001的积极发展和潜在担忧。请简洁地陈述分别提出2-4个最重要的因素。大部分所提及的因素应该从公司的相关新闻中推断出来。那么让我们假设你对于下一周(2023-04-23至2023-04-30)的预测是上涨0-1%。提供一个总结分析来支持你的预测。预测结果需要从你最后的分析中推断出来,因此不作为你分析的基础因素。']"
]
},
"execution_count": 4,
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
@@ -1035,7 +1049,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 19,
"metadata": {},
"outputs": [
{
@@ -1062,9 +1076,93 @@
"print(SYSTEM_PROMPT)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generate Task-Response with GPT"
]
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"from openai import OpenAI\n",
"\n",
"client = OpenAI(api_key = \"Your API\")\n",
"\n",
"DATA_DIR = f\"./{start_date}_{end_date}\"\n",
"os.makedirs(DATA_DIR, exist_ok=True)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"def append_to_csv(filename, input_data, output_data):\n",
" \n",
" with open(filename, mode='a', newline='') as file:\n",
" writer = csv.writer(file)\n",
" writer.writerow([input_data, output_data])\n",
"\n",
" \n",
"def initialize_csv(filename):\n",
" \n",
" with open(filename, mode='w', newline='') as file:\n",
" writer = csv.writer(file)\n",
" writer.writerow([\"prompt\", \"answer\"])\n",
"\n",
"def query_gpt4(symbol_list, min_past_weeks=1, max_past_weeks=3, with_basics=True):\n",
"\n",
" for symbol in symbol_list:\n",
" \n",
" csv_file = f'{DATA_DIR}/{symbol}_{start_date}_{end_date}_gpt-4.csv' if with_basics else \\\n",
" f'{DATA_DIR}/{symbol}_{start_date}_{end_date}_nobasics_gpt-4.csv'\n",
" \n",
" if not os.path.exists(csv_file):\n",
" initialize_csv(csv_file)\n",
" pre_done = 0\n",
" else:\n",
" df = pd.read_csv(csv_file)\n",
" pre_done = len(df)\n",
"\n",
" prompts = get_all_prompts(symbol, min_past_weeks, max_past_weeks, with_basics)\n",
"\n",
" for i, prompt in enumerate(prompts):\n",
" \n",
" if i < pre_done:\n",
" continue\n",
"\n",
" print(f\"{symbol} - {i}\")\n",
" \n",
" cnt = 0\n",
" while cnt < 5:\n",
" try:\n",
" completion = client.chat.completions.create(\n",
" model=\"gpt-4\",\n",
" messages=[\n",
" {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n",
" {\"role\": \"user\", \"content\": prompt}\n",
" ]\n",
" )\n",
" break \n",
" except Exception:\n",
" cnt += 1\n",
" print(f'retry cnt {cnt}')\n",
" \n",
" answer = completion.choices[0].message.content if cnt < 5 else \"\"\n",
" append_to_csv(csv_file, prompt, answer)\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
@@ -1073,95 +1171,23 @@
"text": [
"000001 : 2023-04-09 - 2023-04-16\n",
"000001 : 2023-04-16 - 2023-04-23\n",
"000001 : 2023-04-23 - 2023-04-30\n"
"000001 : 2023-04-23 - 2023-04-30\n",
"000001 - 0\n",
"000001 - 1\n"
]
}
],
"source": [
"pmt = get_all_prompts(\"000001\")"
"query_gpt4([\"000001\"], 1, 2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"outputs": [],
"source": [
"from openai import OpenAI\n",
"client = OpenAI(api_key = '')\n",
"completion = client.chat.completions.create(\n",
" model = \"gpt-3.5-turbo\",\n",
" messages=[\n",
" {\"role\": \"system\", \"content\":SYSTEM_PROMPT},\n",
" {\"role\": \"user\", \"content\": pmt[1]}\n",
" ]\n",
")"
"# Formulate Training Data ..."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"请求失败,状态码: 429\n",
"请求失败body: {\"error\":{\"code\":\"insufficient_quota\",\"param\":null,\"type\":\"insufficient_quota\",\"message\":\"You exceeded your current quota, please check your plan and billing details.\"}}\n",
"请求失败X-BC-Request-Id: cfcdb74d-9416-47e4-98d2-b6149fa1765f\n"
]
}
],
"source": [
"import requests\n",
"import json\n",
"\n",
"def do_request():\n",
" url = \"https://api.baichuan-ai.com/v1/chat/completions\"\n",
" api_key = \"sk-7c765c13dddfc800953163c1b98b9304\"\n",
"\n",
" data = {\n",
" \"model\": \"Baichuan2-Turbo\",\n",
" \"messages\": [\n",
" {\n",
" \"role\": \"user\",\n",
" \"content\": \"世界第一高峰是\"\n",
" }\n",
" ],\n",
" \"stream\": True\n",
" }\n",
"\n",
" json_data = json.dumps(data)\n",
"\n",
" headers = {\n",
" \"Content-Type\": \"application/json\",\n",
" \"Authorization\": \"Bearer \" + api_key\n",
" }\n",
"\n",
" response = requests.post(url, data=json_data, headers=headers, timeout=60)\n",
"\n",
" if response.status_code == 200:\n",
" print(\"请求成功!\")\n",
" print(\"响应body:\", response.text)\n",
" print(\"请求成功X-BC-Request-Id:\", response.headers.get(\"X-BC-Request-Id\"))\n",
" else:\n",
" print(\"请求失败,状态码:\", response.status_code)\n",
" print(\"请求失败body:\", response.text)\n",
" print(\"请求失败X-BC-Request-Id:\", response.headers.get(\"X-BC-Request-Id\"))\n",
"\n",
"if __name__ == \"__main__\":\n",
" do_request()\n",
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {