feishu / result.py
geqintan's picture
update
edd3f52
{
"candidates":[
{
"content":{
"parts":[
{
"text":"我是AI金融量化开发工程师。很高兴为您提供使用 `akshare` 获取数据并为 `backtrader` 回测做数据准备的Python代码。\n\n`backtrader` 通常需要一个包含特定列(如 Date, Open, High, Low, Close, Volume, OpenInterest)的pandas DataFrame或CSV文件作为输入。`akshare` 提供了丰富的金融数据接口,我们可以用它获取数据并处理成 `backtrader` 兼容的格式。\n\n下面是一个成熟的可执行代码示例,演示了如何获取某只股票的日线数据并进行基本处理:\n\n"
},
{
"text":"```python\nimport akshare as ak\nimport pandas as pd\n\n# --- 参数设置 ---\n# 股票代码,例如:'000001' (平安银行) 或 '600519' (贵州茅台)\nstock_code = '600519'\n# 数据起始日期,格式 'YYYYMMDD'\nstart_date = '20200101'\n# 数据结束日期,格式 'YYYYMMDD'\nend_date = '20231231'\n# 数据频率,'daily' (日线), 'weekly' (周线), 'monthly' (月线)\n# akshare 也支持分钟线等,但 backtrader 标准DataFeed通常使用日线\nfreq = 'daily'\n\n# --- 获取数据 ---\nprint(f\"正在获取股票 {stock_code} 从 {start_date} 到 {end_date} 的 {freq} 数据...\")\ntry:\n # 使用 akshare 获取股票历史数据\n # 这里以沪深A股为例,akshare 提供了多种数据接口,请根据需要选择\n if freq == 'daily':\n # 'frequence=\"daily\"', 'adjust=\"qfq\"' 表示日线数据,前复权\n stock_data = ak.stock_zh_a_hist(symbol=stock_code, period=freq, start_date=start_date, end_date=end_date, adjust=\"qfq\")\n # elif freq == 'weekly':\n # stock_data = ak.stock_zh_a_hist(symbol=stock_code, period=freq, start_date=start_date, end_date=end_date, adjust=\"qfq\")\n # elif freq == 'monthly':\n # stock_data = ak.stock_zh_a_hist(symbol=stock_code, period=freq, start_date=start_date, end_date=end_date, adjust=\"qfq\")\n else:\n raise ValueError(f\"不支持的数据频率: {freq}\")\n\n print(\"数据获取成功!\")\n print(f\"原始数据列名: {stock_data.columns.tolist()}\")\n\n # --- 数据处理与格式化 ---\n # backtrader 标准DataFeed期望的列名和顺序: Date, Open, High, Low, Close, Volume, OpenInterest\n # akshare 获取的数据列名通常是: 日期, 开盘, 收盘, 最高, 最低, 成交量, 成交额, 振幅, 涨跌幅, 涨跌额, 换手率\n # 我们需要重命名和选取必要的列\n\n # 检查必需的列是否存在\n required_cols_akshare = ['日期', '开盘', '最高', '最低', '收盘', '成交量']\n if not all(col in stock_data.columns for col in required_cols_akshare):\n raise ValueError(f\"获取的数据缺少 backtrader 所需的关键列。akshare原始列名: {stock_data.columns.tolist()}\")\n\n # 重命名列\n stock_data = stock_data.rename(columns={\n '日期': 'Date',\n '开盘': 'Open',\n '最高': 'High',\n '最低': 'Low',\n '收盘': 'Close',\n '成交量': 'Volume'\n # akshare 获取的 A 股数据通常不包含 OpenInterest,可以填充为 0\n })\n\n # 确保 Date 列是 datetime 对象,并设置为索引\n # backtrader 通常要求 Date 列为索引,且类型为 datetime\n stock_data['Date'] = pd.to_datetime(stock_data['Date'])\n stock_data = stock_data.set_index('Date')\n\n # 选取 backtrader 需要的列,并按顺序排列\n bt_data = stock_data[['Open', 'High', 'Low', 'Close', 'Volume']]\n\n # 添加 OpenInterest 列,通常填充为 0\n bt_data['OpenInterest'] = 0\n\n # 确认最终的数据格式和列名\n print(\"\\n处理后用于 backtrader 的数据格式:\")\n print(bt_data.head())\n print(f\"\\n处理后数据列名: {bt_data.columns.tolist()}\")\n print(f\"数据类型: {bt_data.index.dtype}\") # 确保索引是 datetime64[ns]\n print(f\"数据行数: {len(bt_data)}\")\n\n # --- 保存数据 (可选) ---\n # backtrader 可以直接从 pandas DataFrame 加载数据,也可以从 CSV 文件加载\n # 保存为 CSV 方便后续直接加载或检查\n output_filename = f\"{stock_code}_{start_date}_{end_date}_{freq}.csv\"\n bt_data.to_csv(output_filename)\n print(f\"\\n数据已保存至文件: {output_filename}\")\n\n # --- 如何在 backtrader 中使用这些数据 ---\n print(\"\\n--- 如何在 backtrader 中使用 ---\")\n print(\"1. 直接从 DataFrame 加载:\")\n print(\" import backtrader as bt\")\n print(\" data = bt.feeds.PandasData(dataname=bt_data)\")\n print(\" cerebro = bt.Cerebro()\")\n print(\" cerebro.adddata(data)\")\n print(\" # 添加策略等...\")\n print(\" # cerebro.run()\")\n print(\"\\n2. 从 CSV 文件加载:\")\n print(\" import backtrader as bt\")\n print(f\" data = bt.feeds.GenericCSVData(\")\n print(f\" dataname='{output_filename}',\")\n print( \" dtformat='%Y-%m-%d', # 日期格式\")\n print( \" datetime=0, # 日期在第0列 (索引列)\")\n print( \" open=1, # 开盘价在第1列\")\n print( \" high=2, # 最高价在第2列\")\n print( \" low=3, # 最低价在第3列\")\n print( \" close=4, # 收盘价在第4列\")\n print( \" volume=5, # 成交量在第5列\")\n print( \" openinterest=6, # 持仓量在第6列 (或使用 -1 如果CSV中没有此列)\")\n print( \" # headers=True, # 如果第一行是列名,则设置为 True\")\n print( \" )\")\n print(\" cerebro = bt.Cerebro()\")\n print(\" cerebro.adddata(data)\")\n print(\" # 添加策略等...\")\n print(\" # cerebro.run()\")\n\n\nexcept Exception as e:\n print(f\"处理过程中发生错误: {e}\")\n\n```"
},{
"text":"\n\n**代码说明:**\n\n1. **导入库**: 导入 `akshare` 用于获取数据,`pandas` 用于数据处理。\n2. **参数设置**: 定义股票代码、起止日期和数据频率。您可以根据需要修改这些参数。\n3. **获取数据**: 使用 `akshare.stock_zh_a_hist` 函数获取沪深A股的历史数据。`period` 设置频率,`adjust=\"qfq\"` 表示获取前复权数据,这对于回测很重要。\n4. **数据处理与格式化**:\n * 获取到的数据是一个pandas DataFrame。\n * 我们将 `akshare` 返回的中文或不同的列名重命名为 `backtrader` 标准的英文列名 (`Date`, `Open`, `High`, `Low`, `Close`, `Volume`)。\n * 将 `Date` 列转换为 `datetime` 类型,并设置为 DataFrame 的索引,这是 `backtrader` 期望的格式。\n * 选取需要的列,并添加 `OpenInterest` 列,通常股票数据没有持仓量,可以填充为 0。\n5. **保存数据 (可选)**: 将处理好的 DataFrame 保存为 CSV 文件。这样您可以在 `backtrader` 中选择从 DataFrame 直接加载 (`bt.feeds.PandasData`) 或从 CSV 文件加载 (`bt.feeds.GenericCSVData`)。\n6. **`backtrader` 使用示例**: 代码最后给出了在 `backtrader` 中加载这两种数据源的简单示例代码片段。\n\n**使用步骤:**\n\n1. 确保您已经安装了 `akshare` 和 `pandas`:\n "
},{
"text":"```bash\n pip install akshare pandas backtrader\n ```"
},{
"text":"\n2. 将上面的 Python 代码复制到您的开发环境中。\n3. 修改代码中的参数 (`stock_code`, `start_date`, `end_date`, `freq`) 以获取您需要的数据。\n4. 运行代码。代码将获取数据,处理格式,并(可选地)保存为 CSV 文件。\n5. 然后您就可以在您的 `backtrader` 回测脚本中使用生成的数据(DataFrame 或 CSV 文件)。\n\n请注意,`akshare` 的接口可能会有更新,如果运行代码时遇到错误,请查阅 `akshare` 的最新文档确认接口使用方法。同时,确保您的网络连接正常,以便成功获取数据。"
}
],
"role":"model"
},
"finish_reason":"STOP",
"index":0
}
],
"model_version":"models/gemini-2.5-flash-preview-04-17",
"usage_metadata":{
"candidates_token_count":2227,
"prompt_token_count":624,
"prompt_tokens_details":[
{
"modality":"TEXT","token_count":624
}
],
"thoughts_token_count":317,
"total_token_count":3168
},
"automatic_function_calling_history":[]
}