问题描述
/
解决方案
完全可以实现。在 ptrade 量化平台中,虽然 set_universe 接口本身接收的是一个股票代码列表(list),但你可以利用 Python 强大的文件处理能力(如标准库或 pandas),结合 ptrade 提供的 get_research_path() 函数,从外部文件(如 CSV、TXT)中读取股票代码并动态生成该列表,从而实现股票池的文件化配置。
实现步骤与代码示例
假设你在 ptrade 的研究环境中上传了一个名为 my_stocks.csv 的文件,文件内容包含一列股票代码(例如表头为 code)。
1. 使用 pandas 读取 CSV 文件设置股票池
import pandas as pd
import os
def initialize(context):
# 获取研究环境的根目录路径
research_path = get_research_path()
file_path = os.path.join(research_path, 'my_stocks.csv')
try:
# 使用 pandas 读取 CSV 文件
df = pd.read_csv(file_path)
# 假设 CSV 中有一列名为 'code',将其转换为 list
stock_list = df['code'].tolist()
# 将读取到的股票列表设置为策略股票池
g.security = stock_list
set_universe(g.security)
log.info(f"成功从文件加载股票池,共 {len(g.security)} 只股票。")
except Exception as e:
log.error(f"读取股票池文件失败: {e}")
# 失败时的降级处理,设置默认股票池
g.security = ['600570.SS']
set_universe(g.security)
def handle_data(context, data):
# 策略逻辑处理
pass
2. 使用标准 Python 文件操作读取 TXT 文件
如果你的股票代码保存在一个简单的文本文件 stocks.txt 中,每行一个代码:
import os
def initialize(context):
research_path = get_research_path()
file_path = os.path.join(research_path, 'stocks.txt')
stock_list = []
try:
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
code = line.strip()
if code: # 过滤空行
stock_list.append(code)
g.security = stock_list
set_universe(g.security)
log.info(f"成功从 TXT 加载股票池: {g.security}")
except Exception as e:
log.error(f"读取 TXT 文件失败: {e}")
def handle_data(context, data):
pass
注意事项
- 文件路径:务必使用
get_research_path()获取基础路径,以确保在回测和交易环境中都能正确找到你上传的文件。 - 代码格式:确保文件中的股票代码带有正确的市场尾缀(如
600570.SS、000001.SZ),以符合 ptrade 的 API 规范。 - 异常处理:在读取文件时,建议加入
try...except异常处理逻辑(如上例所示),防止因文件丢失或格式错误导致策略直接崩溃。 - 动态更新:如果你希望在盘中或每天盘前动态更新股票池,可以将读取文件的逻辑放在
before_trading_start或通过run_daily定时触发的函数中,然后再次调用set_universe()更新。