从同花顺财经网页提取资金流向数据,最直接的方式不是人工复制表格,而是找到它页面背后的数据接口。同花顺的资金流页面通常采用异步加载,浏览器里看到的行业资金排名、主力净流入等数字,实际来自一组可被R语言请求的URL。用httr发送带Referer和User-Agent的GET请求,再配合rvest解析返回的HTML或JSON,就能把数据整理成适合分析的数据框。这套流程能省下大量重复劳动,后续的统计、绘图和自动监控也有稳定数据来源。

一、定位同花顺资金流向数据入口
同花顺财经的行业资金流页面地址通常包含 /funds/hyzj/ 这样的路径。打开页面后如果直接查看网页源码,往往看不到表格数据,因为数据是通过XHR接口异步填充的。在浏览器开发者工具的Network面板里刷新页面,可以过滤出以 ajax 或 v2 开头的请求,这些请求返回的内容就是资金流向的原始数据。
以行业资金流为例,常见接口会返回HTML片段或JSONP格式的数据。无论是哪种格式,R语言都可以处理。关键是要带上正确的请求头,尤其是Referer和User-Agent。同花顺对直接请求有基本校验,缺少来源信息时可能返回空数据或错误提示。请求频率也要控制,避免短时间大量抓取造成IP被限制。
下面这段代码演示了获取行业资金流HTML表格的过程。实际接口路径可能随页面改版调整,建议先在浏览器中确认当前可用的URL。
library(httr)
library(rvest)
url = "http://data.10jqka.com.cn/funds/hyzj/field/trade/order/desc/page/1/ajax/1/"
headers = c(
`User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
`Referer` = "http://data.10jqka.com.cn/funds/hyzj/"
)
res = GET(url, add_headers(.headers=headers))
# 同花顺部分页面使用GBK编码,读取时需指定
page = read_html(content(res, "text", encoding = "GBK"))
tbl = page %>%
html_node("table.m_table") %>%
html_table(fill = TRUE)
print(head(tbl))
如果接口返回的是JSONP,通常会在括号里包含JSON数据。可以先用字符串函数去掉外层回调,再交给jsonlite解析。解析后的数据需要关注字段类型,同花顺里的数值往往带有逗号或百分号,必须在分析前清洗成数值型。
二、资金流向数据清洗与指标计算
抓取到原始表格后,第一步是统一列名并转换数据类型。同花顺行业资金流通常包含行业名称、涨跌幅、主力净流入、超大单净流入、大单净流入、中单净流入、小单净流入等字段。主力净流入是超大单和大单的合计,但不同页面口径可能略有差异,清洗时要根据实际返回的表头判断。
数值字段里最常见的干扰是千位分隔符和百分号。R中可以用gsub去掉逗号和百分号,再用as.numeric转换。日期字段如果不是标准格式,也要统一成Date类型,便于做时间序列分析。清洗后的数据可以计算净流入占比、流入连续性以及行业内部分化程度。
library(dplyr)
clean_data = tbl %>%
rename(
industry = 1,
change_pct = 2,
main_net_inflow = 3,
super_net_inflow = 4,
large_net_inflow = 5
) %>%
mutate(
change_pct = as.numeric(gsub("%", "", change_pct)),
main_net_inflow = as.numeric(gsub(",", "", main_net_inflow)),
super_net_inflow = as.numeric(gsub(",", "", super_net_inflow)),
large_net_inflow = as.numeric(gsub(",", "", large_net_inflow)),
main_inflow_ratio = main_net_inflow /
ifelse(abs(main_net_inflow) > 0, abs(main_net_inflow), NA)
) %>%
arrange(desc(main_net_inflow))
print(head(clean_data, 10))
这段代码先把中文列名重命名为英文,方便后续引用。gsub负责剔除字符串中的干扰字符,as.numeric完成类型转换。main_inflow_ratio这一列只是示例,实际分析中更适合计算主力净流入占成交额的比例,或者把净流入按行业市值标准化,这样不同规模的行业才有可比性。
清洗完成后可以做排名分析。例如筛选主力净流入连续三天为正的行业,这类行业往往处于资金持续关注状态。R中用group_by和lag函数就能实现窗口判断。再结合涨跌幅,可以观察资金是主动流入还是被动跟随价格上涨。
三、大盘指数抓取与实时监控
大盘监控的核心是稳定获取主要指数的实时行情。同花顺提供了一些轻量级行情接口,例如通过 realhead 路径可以拿到上证指数、深证成指和创业板指的最新点位、涨跌额和涨跌幅。这些接口返回的数据量很小,适合定时任务反复请求。
实现监控前需要确定指数代码。上证指数通常对应1A0001,深证成指对应1A0002,创业板指对应1A0003。不同接口可能使用带前缀的代码,如hs_1A0001,因此在抓取前最好先用浏览器测试一次。获取到JSON后,提取字段并计算涨跌幅度,就可以生成一条监控记录。
library(jsonlite)
index_codes = c("1A0001", "1A0002", "1A0003")
index_names = c("上证指数", "深证成指", "创业板指")
base_url = "http://d.10jqka.com.cn/v2/realhead/hs_"
monitor_list = list()
for (i in seq_along(index_codes)) {
url = paste0(base_url, index_codes[i], "/last.js")
res_mon = GET(url, add_headers(.headers=headers))
txt = content(res_mon, "text", encoding = "GBK")
# 去掉JSONP外层,提取JSON部分
json_txt = sub("^[^(]*\\(", "", txt)
json_txt = sub("\\);?$", "", json_txt)
data = fromJSON(json_txt)
monitor_list[[i]] = data.frame(
index_name = index_names[i],
current = as.numeric(data$items$current),
change = as.numeric(data$items$change),
change_pct = as.numeric(data$items$changePct)
)
}
monitor_df = bind_rows(monitor_list)
print(monitor_df)
这里使用循环依次请求三个指数,把结果合并成数据框。JSONP清洗的部分用sub去掉外层函数名和括号,fromJSON就能正确解析。请求间隔可以设置Sys.sleep(1),避免同时发出多个请求。定时执行时,这个逻辑可以封装成函数,由cronR或taskscheduleR调度。
监控的目标不只是记录点位,更重要的是识别异常波动。比如开盘后半小时内指数涨跌幅超过阈值,或者资金流向与指数明显背离,都值得触发提醒。可以在R脚本里加入条件判断,用邮件或消息推送通知自己。
四、资金流向与大盘监控的联动分析
把行业资金流数据和大盘指数放在一起看,能发现一些单独看指数时容易忽略的信号。例如指数微涨但主力资金大幅净流出,说明上涨更多由小单推动,持续性可能较差。反过来,指数下跌但多个行业出现主力净流入,可能意味着资金在调仓而不是系统性离场。
实现联动分析需要把不同频率的数据对齐。行业资金流通常是分钟级或每日收盘后更新,指数实时数据则可以秒级获取。简单做法是每天收盘后抓一次完整行业资金流,计算全市场主力净流入总和,再与当日指数涨跌幅比较,得到资金偏离度。偏离度过大时记录到监控日志。
# 假设 daily_inflow 是当天所有行业主力净流入的总和
# index_change 是当日上证指数涨跌幅
daily_inflow = sum(clean_data$main_net_inflow, na.rm = TRUE)
index_change = 0.35
divergence = daily_inflow / 100000000 + index_change
if (divergence > 2 || divergence < -2) {
cat("触发预警:资金与指数出现偏离,偏离度为", divergence, "\n")
} else {
cat("当前资金与指数基本同步,偏离度为", divergence, "\n")
}
上面的阈值只是示意,实际应用时应该用历史数据回测来设定更合理的区间。另外,主力净流入总和的单位可能是元,需要统一成亿元或百万元,否则数值口径不一致会导致判断错误。计算前必须核对原始数据的金额单位,同花顺不同接口可能存在差异。
监控脚本部署到服务器后,可以设置每个交易日定时运行。Windows环境用taskscheduleR,Linux环境用cronR,都只需要几行配置。运行时先抓指数,再抓行业资金流,完成计算后把结果追加写入CSV或SQLite数据库。这样积累一段时间后,就能回看资金流向与大盘走势的历史关系,持续优化预警规则。