问题描述
经过验证,比如把下面的代码放入到国信的iquant里运行
#encoding:gbk
import requests
def get_baidu():
url = 'https://www.baidu.com'
req = requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
print(req.text)
def init(ContextInfo):
get_baidu()
def handlebar(ContextInfo):
pass
会报错,同时访问baidu.com 超时:
解决方案
问题原因:券商服务器的网络隔离机制
在国信 iQuant、ptrade 等券商提供的量化交易平台中,当您尝试使用 requests 访问外部网站(如百度),或者使用依赖外网接口的第三方数据库(如 tushare、akshare)时,通常会遇到**连接超时(Timeout)**的报错。
这是因为券商的实盘和模拟交易服务器出于极高的安全与合规要求,实行了严格的网络物理隔离或白名单机制。策略运行环境通常被禁止直接访问公共互联网。因此,任何向外网发起的 HTTP/HTTPS 请求都会被防火墙直接拦截或丢弃,导致程序一直等待响应直到超时。
解决方案与替代思路
既然无法直接在策略中联网爬取数据,您可以采用以下几种替代方案来满足数据需求:
方案一:使用量化平台内置的 API 获取数据(推荐)
绝大多数券商量化平台(如 ptrade)已经内置了极其丰富的行情数据、财务数据和特色数据接口,这些接口直接连接券商内网的高速数据源,不仅速度快,而且稳定合法。您完全可以使用内置 API 替代 tushare 或 akshare。
ptrade 常用数据获取接口示例:
- 获取历史 K 线数据:使用
get_history()或get_price()。 - 获取财务数据:使用
get_fundamentals()(支持资产负债表、利润表、现金流量表及各类财务指标)。 - 获取股票基础信息:使用
get_stock_info()、get_stock_blocks()(获取所属板块)。
示例:在 ptrade 中获取历史行情替代外部请求
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 直接使用内置接口获取过去5天的收盘价,无需使用 tushare
df = get_history(5, '1d', 'close', g.security, fq='pre', include=False)
log.info(df)
方案二:在本地获取数据后,通过文件(CSV)导入平台
如果您需要的数据(如某些特定的宏观经济数据、另类情绪数据)平台 API 确实无法提供,您可以采用“本地爬取 -> 存为文件 -> 上传平台 -> 策略读取”的异步方式。
- 本地爬取:在您自己的个人电脑上运行 Python 脚本,使用
requests、akshare或tushare获取所需数据。 - 保存文件:将数据保存为
.csv格式。 - 上传文件:将该 CSV 文件上传到量化平台的研究环境(Research)目录下。
- 策略读取:在策略代码中,使用
pandas.read_csv()或平台提供的文件读取接口加载数据。
示例:在 ptrade 中读取上传的 CSV 文件
import pandas as pd
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 获取研究环境的根目录路径
path = get_research_path()
# 读取您提前上传好的外部数据文件
g.custom_data = pd.read_csv(path + 'my_akshare_data.csv')
log.info("外部数据加载成功!")
def handle_data(context, data):
pass
方案三:联系券商申请网络白名单(仅限部分机构客户)
如果您是资金量较大的机构客户或专业私募,且策略确实强依赖于某个特定的外部数据源(如您公司自建的信号服务器),您可以尝试联系券商的客户经理或技术支持,申请将您的目标服务器 IP 或域名加入防火墙白名单。不过,出于合规考量,券商对此类申请的审批通常非常严格,普通个人投资者一般无法获批。
总结
在券商量化环境中,“断网”是常态。转变思路,充分挖掘和利用平台自带的 API 接口,或者通过离线文件的方式引入外部数据,是解决此类问题的最佳实践。