问题描述
/
解决方案
在 ptrade 量化交易平台中,调用 get_market_list() 接口会返回一个包含当前所有市场列表的 pandas.DataFrame 对象。该 DataFrame 主要包含两个字段:finance_mic(市场编码)和 finance_name(市场名称)。
由于返回的是标准的 pandas DataFrame,你可以利用 pandas 强大的数据处理能力来进行筛选和遍历。以下是具体的操作方法和代码示例:
1. 了解返回的数据结构
首先,get_market_list() 返回的数据结构大致如下:
| index | finance_mic | finance_name |
|---|---|---|
| 67 | XHKG-SS | 沪港通 |
| 69 | XSGE | 上海期货交易所 |
| 70 | XSHO | 上海个股期权 |
2. 筛选特定市场的数据
如果你只想查找特定的市场(例如查找市场编码为 XHKG-SS 的沪港通市场),可以使用 pandas 的条件筛选功能:
import pandas as pd
def before_trading_start(context, data):
# 获取市场列表
market_df = get_market_list()
# 筛选 finance_mic 为 'XHKG-SS' 的行
target_market = market_df[market_df['finance_mic'] == 'XHKG-SS']
if not target_market.empty:
# 获取对应的市场名称
market_name = target_market.iloc[0]['finance_name']
log.info(f"找到目标市场: 编码 XHKG-SS, 名称 {market_name}")
else:
log.info("未找到指定的市场编码")
3. 遍历所有市场数据
如果你需要遍历整个市场列表,提取所有的市场编码和名称,推荐使用 DataFrame 的 iterrows() 或 itertuples() 方法:
def before_trading_start(context, data):
# 获取市场列表
market_df = get_market_list()
log.info("开始遍历市场列表:")
# 使用 iterrows() 遍历
for index, row in market_df.iterrows():
mic = row['finance_mic']
name = row['finance_name']
# 假设我们只对包含 '上海' 的市场感兴趣
if '上海' in str(name):
log.info(f"索引: {index}, 市场编码: {mic}, 市场名称: {name}")
4. 完整策略示例
请注意,get_market_list() 接口在回测和交易中仅限在 before_trading_start 和 after_trading_end 事件中使用。以下是一个完整的策略框架示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def before_trading_start(context, data):
# 获取并处理市场列表
market_df = get_market_list()
# 提取所有的市场编码为一个 list
all_mics = market_df['finance_mic'].tolist()
log.info(f"当前系统支持 {len(all_mics)} 个市场")
# 筛选特定市场
sh_futures = market_df[market_df['finance_mic'] == 'XSGE']
if not sh_futures.empty:
log.info(f"上海期货交易所存在,名称为: {sh_futures.iloc[0]['finance_name']}")
def handle_data(context, data):
pass
总结与建议
- 利用 Pandas 特性:由于返回的是 DataFrame,你可以使用
query(),loc[],iloc[]等所有 pandas 原生方法进行高效的数据切片。 - 注意调用时机:务必遵守 ptrade API 规范,仅在盘前 (
before_trading_start) 或盘后 (after_trading_end) 调用此接口,避免在handle_data或tick_data中调用导致报错。