如何让AI帮你抓数据?| 方法论

发布于: 雪球转发:0回复:0喜欢:6

大家好,我是很帅的狐狸

之前有提到过,其实稍微会点代码,可以让AI帮你做到更多事情。

所以今天我就稍微手把手介绍一下——

看看不会代码的话,怎么让AI帮你抓股票或基金的价格数据,并整理成表格。

(如有Python基础,可跳到第五步看看我的提示词)

比如上周五的 推送 我用到了这张表格——

最一开始,是我看到了一张图表——

不过这表似乎是截至5月16日(周四)上午的数据,所以我当时想更新到最新的数据

如果是没有AI帮忙的话,通常流程下,我需要——

1. 整理20个代码和名称

2. 使用Wind/Choice终端,或是雪球/新浪等财经网站,一个个股票查看涨跌幅

3. 如果没有现成的「20日涨跌幅」指标,我甚至得查看当天收盘价和倒数第21个交易日的收盘价,从而算出20个交易日的累计涨跌幅。

这就超级无敌麻烦了……

而借助AI跟非常简单的代码,这一切只要5分钟就搞定了(加上第1~3步的准备工作也只要15分钟)。

另外,提前说一下——

国内的大模型,我试了几个比较流行的(Kimi/智谱GLM-4/文心一言4.0/星火大模型/通义千问-Max),它们对提示词的要求会比较高(后文会分享适用国内大模型的完备提示词)。

所以呢,个人还是建议优先使用GPT-4(付费)GPT-4o(免费)级别代码能力的AI。

如果暂时还没法用上,可以在公号后台回复AI看看相关教学。

第一步:下载并安装软件

首先我们要下载Visual Studio Code或者PyCharm,这俩是用来运行和修改AI生成的代码的。

VS Code网页链接

PyCharm
网页链接(页面下方的Community版本是免费的)

然后我们需要下载Anaconda,这是用来构建环境的。

Anaconda
网页链接

稍微解释一下什么是「环境」——

类比一下,就像我们现在想做个面包,会去市场上买现成的面粉、鸡蛋,而不是从自己种小麦、养鸡开始。

我们现在写程序,其实可以用很多其他大牛们写好的程序(一般叫做「程序库」)。

但是不同的程序库之间可能有冲突——

比如A面粉跟A鸡蛋比较搭,但跟B鸡蛋混一起的话就不好吃了。

为了不让A面粉混入B鸡蛋,所以要准备两个独立的厨房,A厨房里头只能有A面粉和A鸡蛋,B厨房里只能有B面粉和B鸡蛋。

而Anaconda工具就是用来帮我们建立这些独立的厨房环境,并确保冲突的食材可以被有效隔离的。

第二步:创建环境

软件安装好后,我们可以打开Anaconda Navigator,然后选择Environment,点击「Create」创建一个新环境。

名字随便起一个(这里取名为「data」),Packages选Python。

接着等个几秒,新环境就创建好了。

以后每次打开Anaconda Navigator,要先点一下Environment,再点一下我们创建的环境。

第三步:安装相应的库

在Anaconda Navigator里选择「Environment」,然后选择data环境。

紧接着,点击旁边的小圆箭头,点击「Open Terminal」。

这时候会出现一个命令行小框框——

国内大模型用户,在里面输入「pip install efinance pandas」,然后按回车。

ChatGPT用户,在里面输入「pip install yfinance pandas」,然后按回车。

然后等待它提示「Successfully installed」就可以关掉命令行窗口了。

这里的efinance、yfinance、pandas就是我前面提到的「程序库」,也就是别人帮你磨好的面粉,咱直接拿来用就行了。

第四步:新建Python文件

选择data环境后,我们再切换到Home里头,找到VS Code或PyCharm,点击Launch(这里我用VS Code为例)。

接下来,你就可以新建一个Python文件,然后按ctrl+s先存到某个位置。

之后你就可以在这个python文件上直接写代码并运行了——

第五步:让AI帮忙写代码

我直接操作案例好了,还是用我前面的那个案例,要抓现成图表上的数据。

因为我看到的图表是中文的,ChatGPT识别起来的结果会很烂(不信你可以丢给它试试)。

所以我们可以先用Kimi或智谱清言把表格的内容转为文本——

然后再把需求丢给大模型——

因为我大部分读者都是国内用户,所以我分成ChatGPT跟国内大模型两种情景来介绍。

国内大模型用户建议也看看情景1,学习下整体逻辑。

情景1:使用ChatGPT

如果我指定使用yfinance的程序库,这时候GPT-4o会马上帮我生成一段代码——

import yfinance as yfimport pandas as pdfrom datetime import datetime, timedelta# 定义股票信息stocks = [ {"ticker": "01396.HK", "name": "粤港湾控股"}, {"ticker": "00813.HK", "name": "世茂集团"}, {"ticker": "02608.HK", "name": "阳光100中国"}, {"ticker": "01777.HK", "name": "花样年控股"}, {"ticker": "03883.HK", "name": "中国奥园"}, {"ticker": "01668.HK", "name": "华南城"}, {"ticker": "01862.HK", "name": "景瑞控股"}, {"ticker": "01813.HK", "name": "合景泰富集团"}, {"ticker": "01233.HK", "name": "时代中国控股"}, {"ticker": "06611.HK", "name": "三巽集团"}, {"ticker": "03377.HK", "name": "远洋集团"}, {"ticker": "01638.HK", "name": "佳兆业集团"}, {"ticker": "00884.HK", "name": "旭辉控股集团"}, {"ticker": "01176.HK", "name": "珠光控股"}, {"ticker": "06158.HK", "name": "正荣地产"}, {"ticker": "01996.HK", "name": "弘阳地产"}, {"ticker": "01628.HK", "name": "禹洲集团"}, {"ticker": "00726.HK", "name": "筑友智造科技"}, {"ticker": "06968.HK", "name": "港龙中国地产"}, {"ticker": "01030.HK", "name": "新城发展"},]# 获取当前日期和过去20个交易日的日期end_date = datetime.now()start_date = end_date - timedelta(days=60) # 过去60天内有20个交易日# 创建DataFrame保存数据data = []# 获取每个股票的涨跌幅for stock in stocks: ticker = stock["ticker"] name = stock["name"] # 使用yfinance下载数据 df = yf.download(ticker, start=start_date, end=end_date) # 计算今天的涨跌幅 today_change = (df['Close'][-1] - df['Close'][-2]) / df['Close'][-2] * 100 # 计算过去20个交易日的涨跌幅 past_20_days_change = (df['Close'][-1] - df['Close'][-21]) / df['Close'][-21] * 100 # 将数据添加到列表 data.append([ticker, name, today_change, past_20_days_change])# 创建DataFramecolumns = ["Ticker", "Name", "Today's Change (%)", "Past 20 Days Change (%)"]result_df = pd.DataFrame(data, columns=columns)# 保存为CSV文件result_df.to_csv("stock_changes.csv", index=False)print("数据已成功保存到 stock_changes.csv")

当然,这段代码也不是完全没有问题——

主要是因为,我给到它的ticker(股票代码)都是五位数的;而yfinance里头,港股的ticker是四位数的,所以我们只要把ticker最前面一个0都给删掉就可以运行了(如果不是提前对yfinance有了解确实很难找到这个bug)。

(可以点红箭头的位置运行)

运行后,它会按我的要求保存成一个csv文件(用excel就能打开,当然,你要让它保存成xlsx格式也是OK的,看你需求)。

要留意的是,yfinance是爬的雅虎财经的数据,这个程序库从2021年11月起内地用户不用代理就没法用了。

所以你也可以尝试让GPT-4o先阅读一下efinance的API文档(可以理解为efinance这个程序库的说明书),然后让它改用efinance的库(这样后续内地用户不使用代理环境,也可以用这段代码爬取数据)。

发出这段提示词后,我们会看到,GPT-4o先阅读了我提供的efinance的API文档(7万多字)。

然后它从里面找到可以爬取历史股价的函数,随后帮我输出了代码——

import efinance as efimport pandas as pdimport datetime# 港股 ticker 列表及其名称stocks = [ {'ticker': '01396', 'name': '粤港湾控股'}, {'ticker': '00813', 'name': '世茂集团'}, {'ticker': '02608', 'name': '阳光100中国'}, {'ticker': '01777', 'name': '花样年控股'}, {'ticker': '03883', 'name': '中国奥园'}, {'ticker': '01668', 'name': '华南城'}, {'ticker': '01862', 'name': '景瑞控股'}, {'ticker': '01813', 'name': '合景泰富集团'}, {'ticker': '01233', 'name': '时代中国控股'}, {'ticker': '06611', 'name': '三巽集团'}, {'ticker': '03377', 'name': '远洋集团'}, {'ticker': '01638', 'name': '佳兆业集团'}, {'ticker': '00884', 'name': '旭辉控股集团'}, {'ticker': '01176', 'name': '珠光控股'}, {'ticker': '06158', 'name': '正荣地产'}, {'ticker': '01996', 'name': '弘阳地产'}, {'ticker': '01628', 'name': '禹洲集团'}, {'ticker': '00726', 'name': '筑友智造科技'}, {'ticker': '06968', 'name': '港龙中国地产'}, {'ticker': '01030', 'name': '新城发展'},]# 获取当前日期和21个交易日前的日期end_date = datetime.datetime.now().strftime('%Y-%m-%d')start_date = (datetime.datetime.now() - datetime.timedelta(days=60)).strftime('%Y-%m-%d')# 初始化结果列表results = []# 遍历每个股票,获取其历史数据并计算涨跌幅for stock in stocks: ticker = stock['ticker'] name = stock['name'] # 获取历史数据 df = ef.stock.get_quote_history(stock_code=ticker, beg=start_date, end=end_date) # 计算今天的涨跌幅 today_pct_change = df.iloc[-1]['涨跌幅'] # 计算过去20个交易日的累计涨跌幅 cumulative_pct_change = df.iloc[-1]['收盘'] / df.iloc[-21]['收盘'] - 1 # 添加到结果列表 results.append([ticker, name, today_pct_change, cumulative_pct_change])# 创建 DataFramedf_results = pd.DataFrame(results, columns=['ticker', 'name', 'today_pct_change', 'cumulative_pct_change'])# 保存为 CSV 文件df_results.to_csv('hk_stocks_changes.csv', index=False)print("Data has been saved to hk_stocks_changes.csv")

不过,它输出的代码有两个bugs:

第一,它的日期格式是'2024-01-01',而efinance对日期格式的要求是'20240101',多了俩横杆。

第二,它在获取历史数据时,用的参数stock_code少了个「s」,应该是「stock_codes=ticker」。

改完这两个地方,程序就可以顺利运行。

efinance这个面粉用起来确实还是不大顺手……

情景2:使用国内大模型

一样的,我们可以先用Kimi或智谱清言把表格的内容转为文本,然后把需求丢给国内的大模型。

我试用了Kimi/智谱/文心一言/星火大模型,如果是简单的提示词,无论是yfinance还是efinance的程序库,效果都不大好。

即使我像情景1一样提供了efinance的API文档链接,出来的代码还是有问题。

不过我想了个办法改善提示词——

之所以代码有问题,是因为efinance的API文档确实太长了(足足7万多个字符)。

所以大语言模型们,记了这个就忘了那个,输出的代码自然也会有bug。

这时候我们可以尝试给它少一点内容——

比如说,我们可以找到efinance的API文档里头,有关「获取历史股价」(get_quote_history)的那一段——

然后我们把efinance.stock.get_quote_history这一段,包括后面的EXAMPLES全部复制给大语言模型。

比如我修改后的提示词是——

请阅读以下API文档的内容:efinance.stock.get_quote_history(stock_codes: str | List[str], beg: str = '19000101', end: str = '20500101', klt: int = 101, fqt: int = 1, market_type: MarketType | None = None, suppress_error: bool = False, use_id_cache: bool = True, **kwargs) → DataFrame | Dict[str, DataFrame][source]获取股票的 K 线数据PARAMETERS:stock_codes (Union[str,List[str]]) – 股票代码、名称 或者 股票代码、名称构成的列表beg (str, optional) – 开始日期,默认为 '19000101' ,表示 1900年1月1日end (str, optional) – 结束日期,默认为 '20500101' ,表示 2050年1月1日klt (int, optional) –行情之间的时间间隔,默认为 101 ,可选示例如下1 : 分钟5 : 5 分钟15 : 15 分钟30 : 30 分钟60 : 60 分钟101 : 日102 : 周103 : 月fqt (int, optional) –复权方式,默认为 1 ,可选示例如下0 : 不复权1 : 前复权2 : 后复权market_type (MarketType, optional) –市场类型,目前可筛选A股,港股,美股和英股。默认不筛选,可选示例如下A_stock : A股Hongkong : 香港London_stock_exchange : 英股US_stock : 美股suppress_error (bool, optional) – 遇到未查到的股票代码,是否不报错,返回空的DataFrameuse_id_cache (bool, optional) – 是否使用本地缓存的东方财富股票行情IDRETURNS:股票的 K 线数据DataFrame : 当 stock_codes 是 str 时Dict[str, DataFrame] : 当 stock_codes 是 List[str] 时RETURN TYPE:Union[DataFrame, Dict[str, DataFrame]]EXAMPLESimport efinance as ef获取单只股票日 K 行情数据ef.stock.get_quote_history('600519') 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率0 贵州茅台 600519 2001-08-27 -89.74 -89.53 -89.08 -90.07 406318 1.410347e+09 -1.10 0.92 0.83 56.831 贵州茅台 600519 2001-08-28 -89.64 -89.27 -89.24 -89.72 129647 4.634630e+08 -0.54 0.29 0.26 18.132 贵州茅台 600519 2001-08-29 -89.24 -89.36 -89.24 -89.42 53252 1.946890e+08 -0.20 -0.10 -0.09 7.453 贵州茅台 600519 2001-08-30 -89.38 -89.22 -89.14 -89.44 48013 1.775580e+08 -0.34 0.16 0.14 6.724 贵州茅台 600519 2001-08-31 -89.21 -89.24 -89.12 -89.28 23231 8.623100e+07 -0.18 -0.02 -0.02 3.25... ... ... ... ... ... ... ... ... ... ... ... ... ...4756 贵州茅台 600519 2021-07-23 1937.82 1900.00 1937.82 1895.09 47585 9.057762e+09 2.20 -2.06 -40.01 0.384757 贵州茅台 600519 2021-07-26 1879.00 1804.11 1879.00 1780.00 98619 1.789436e+10 5.21 -5.05 -95.89 0.794758 贵州茅台 600519 2021-07-27 1803.00 1712.89 1810.00 1703.00 86577 1.523081e+10 5.93 -5.06 -91.22 0.694759 贵州茅台 600519 2021-07-28 1703.00 1768.90 1788.20 1682.12 85369 1.479247e+10 6.19 3.27 56.01 0.684760 贵州茅台 600519 2021-07-29 1810.01 1749.79 1823.00 1734.34 63864 1.129957e+10 5.01 -1.08 -19.11 0.51---完成阅读后,请帮我写段python,用efinance的库,抓取以下港股过去20个交易日的涨跌幅,并整理为csv表格,第一列为ticker,第二列为股票名称,第三列为今天的涨跌幅,第四列为过去20个交易日(注意是交易日而不是自然日)的累计涨跌幅(即今天的收盘价÷21个交易日前的收盘价-1)以下是ticker和名称序号 ticker 名称1 01396 粤港湾控股2 00813 世茂集团3 02608 阳光100中国4 01777 花样年控股5 03883 中国奥园6 01668 华南城7 01862 景瑞控股8 01813 合景泰富集团9 01233 时代中国控股10 06611 三巽集团11 03377 远洋集团12 01638 佳兆业集团13 00884 旭辉控股集团14 01176 珠光控股15 06158 正荣地产16 01996 弘阳地产17 01628 禹洲集团18 00726 筑友智造科技19 06968 港龙中国地产20 01030 新城发展

这样大语言模型只要阅读这一段资讯,而不用阅读7万多字所有内容,精力自然就不会被分散。

用这段提示词测试下来,ChatGLM的代码一次就可以出正确结果(就是它没考虑代码效率,把每个股票的所有历史数据都下载了下来),而文心一言和Kimi改一两个地方就可以正确使用。

不过问题就来了……

AI生成的代码似乎会经常有小bug?零代码基础的话怎么办?

答案其实也很简单,我们也可以——

第六步:让AI帮忙改BUG

抓取股价这种算是最简单的需求了,就算出bug也是小问题。

我们分两种情况来讨论——

情况1:代码执行报错

如果是代码执行后报错,没法正常出结果,你直接把报错信息返还给AI,让它看看哪里出错就行。

常见错误:

'DataFrame' object has no attribute 'append':AI用了旧版本pandas(数据处理常用的库)添加数据的指令append,这时候让AI改用新版本推荐的concat指令就OK了;也可以偷懒一点,直接把代码里的「append」改为「_append」(前面加一个下划线,运行起来还是会报错但至少可用)。

get_quote_history的参数错误:比如stock_codes写成了stock_code,beg写成了start之类的。

情况2:数据对不上

即使代码可以顺利运行,也并不代表万事大吉了——

代码可能会有逻辑错误啊!

一般我会先找其中一两个数据,用平时找数据的方式验证一下。

(毕竟人工自己找数据也会double check啊)

如果数据对不上,我们需要再看看它是哪里有问题——

比如文心一言给我的代码,在计算20个交易日累计涨跌幅时,它用的是20个交易日前的收盘价而不是倒数第21个交易日的收盘价;

而Kimi只爬取了20个自然日的数据,没法覆盖21个交易日的数据量。

如果你之前完全没有代码基础,可以用以下格式的提示词,让AI帮你一行行解释代码,这样你就可以很快找出问题所在——

现在我有一段代码:【代码块】

我希望实现的需求是:【之前提的需求】

不过现在的代码运行后,【跟需求的差距】

请帮我一行行检查并注释代码,看看每行代码都做了什么事情,并看看为什么我无法顺利实现我的需求。

比如我就这样让Kimi帮我debug——

它很快就发现了问题——

今天就分享这么多吧。

看完这些你可能觉得学点代码还是有点用的。

不过咱也不用硬买网上的python小课,网上免费教程其实一大把

比如下面这些python课程——

W3school

网页链接

菜鸟编程

网页链接

要是你们感兴趣,之后我也可以分享看看怎么用AI帮你写爬虫程序。

P.S.最近更新得是比较低频,so,也欢迎关注我们团队每个工作日都更新的日报内容——

「Greed is good.」

「很帅的投资客」的所有内容皆仅以传递知识与金融教育为目的,不构成任何投资建议。一切请以最新文章为准。

相关阅读:

适合普通人的AI场景:《感觉我现在强得可怕》《我让我的AI老婆出道了!》AI数据分析:《这些部门要开始裁员了…》《AI的尽头真的是光伏和储能吗?》《我用我们的1159篇文章,训练了一个AI》《工具 | 境内可用的AI分析工具》《方法 | 我开始用AI来做投资分析了》《收藏 | 超好用的AI提问模板》

✍ 图文/@狐狸君raphael,曾供职于麦肯锡金融机构组,也在 Google 和 VC 打过杂。华尔街见闻、36氪、新浪财经、南方周末、Linkedin等媒体专栏作者,著有畅销书《风口上的猪》《无现金时代》。

觉得对你有用的话,帮我点个赞点个在看