You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为GNU Cash指定历史日期批量获取全品类报价并更新价格数据库

如何为GNU Cash指定历史日期批量获取全品类报价并更新价格数据库

我之前也碰到过一模一样的需求——要生成过去某一天的财务报告,结果发现价格数据库里好多股票、基金的历史报价都缺着,默认的「Get Quotes」又只能抓当天的。折腾了一阵后,总结出两个实用的解决办法:

方案一:用Python脚本批量导入历史报价(自动化首选)

GNU Cash的数据库可以通过第三方Python库piecash直接操作,搭配免费的金融数据API就能批量获取指定日期的全品类报价,步骤如下:

  1. 安装依赖库
    先在终端里安装piecash和金融数据获取工具(比如yfinance,用来拉取Yahoo Finance的历史数据):

    pip install piecash yfinance
    
  2. 编写批量获取脚本
    写一个简单的Python脚本,指定你需要的历史日期,遍历GNU Cash文件里的所有商品(股票、货币、基金等),自动拉取对应日期的报价并写入价格数据库。示例代码大概是这样:

    from piecash import open_book
    import yfinance as yf
    from datetime import datetime
    
    # 配置参数
    GNUCASH_FILE_PATH = "/path/to/your/finances.gnucash"
    TARGET_DATE = datetime(2023, 10, 1)  # 替换成你需要的历史日期
    
    with open_book(GNUCASH_FILE_PATH, readonly=False) as book:
        # 遍历所有商品
        for commodity in book.commodities:
            # 跳过GNU Cash内置的非交易品类
            if commodity.namespace in ("CURRENCY", "NASDAQ", "NYSE"):
                try:
                    # 拉取指定日期的历史数据
                    ticker = yf.Ticker(commodity.mnemonic)
                    hist = ticker.history(start=TARGET_DATE, end=TARGET_DATE)
                    if not hist.empty:
                        price = hist["Close"].iloc[0]
                        # 写入价格数据库
                        book.prices.append(
                            book.create_price(
                                commodity=commodity,
                                currency=book.default_currency,
                                date=TARGET_DATE,
                                value=price
                            )
                        )
                        print(f"成功添加 {commodity.mnemonic} 在 {TARGET_DATE.date()} 的报价: {price}")
                except Exception as e:
                    print(f"获取 {commodity.mnemonic} 报价失败: {str(e)}")
        # 保存修改
        book.save()
    
  3. 运行脚本
    把脚本里的文件路径和目标日期替换成你的实际信息,然后运行脚本,就能自动把指定日期的报价批量写入价格数据库了。

方案二:手动整理CSV导入(适合非技术用户)

如果不想写代码,也可以手动收集历史报价,整理成CSV文件后导入GNU Cash:

  1. 整理CSV文件
    按照GNU Cash要求的格式整理报价,CSV的列需要包含:

    • 日期(格式必须是YYYY-MM-DD,比如2023-10-01
    • 商品代码(要和你GNU Cash里设置的完全一致,比如AAPLEUR
    • 计价货币(比如USD
    • 价格数值

    示例CSV内容:

    Date,Commodity,Currency,Price
    2023-10-01,AAPL,USD,172.34
    2023-10-01,EUR,USD,1.05
    2023-10-01,VTSAX,USD,102.11
    
  2. 导入到价格数据库

    • 打开GNU Cash,点击顶部菜单的Tools -> Price Database
    • 在弹出的窗口里点击Import按钮,选择你整理好的CSV文件
    • 按照导入向导的提示,把CSV的列和GNU Cash的字段对应起来(比如把Date映射到DatePrice映射到Price
    • 确认无误后完成导入,所有历史报价就会添加到价格数据库里了

注意事项

  • 用API拉取数据时,注意不同平台的调用限制:比如Yahoo Finance的免费API有请求频率限制,Alpha Vantage的免费版每天最多500次请求
  • 手动导入时,一定要确保商品代码和GNU Cash里的完全匹配,否则会导入失败
  • 操作前建议先备份GNU Cash文件,避免误操作导致数据丢失

备注:内容来源于stack exchange,提问作者Michael Altfield

火山引擎 最新活动