银行间市场的USDCNY即期一天交易量到底有多少?

        银行间市场又叫批发市场,是USDCNY即期交易的主战场。这个市场每日的外汇交易量相当惊人,不时有一些大的客盘买卖会主导短期走势,也是大家所说的flow driven时刻。这时候市场参与者哪怕是大的交易商,多少都希望能了解客盘的动况。但这个市场的总体交易量并不容易实时观测得到,毕竟客盘是越低调越能保障自身利益,最好就是买卖完毕,市场不动分毫。
        如果交易商真要实时统计,最好的办法是看着CFETs的交易终端数数tick柱。相信不少银行间筒子对数tick柱是熟手工。但是一天下来,tick柱不少,顾得上交易就顾不来数柱子。想要知道整个市场到底交易了多少金额,更多时候我们只能依靠中国货币网的人民币兑美元日内走势图。于是我相信,下面这张图家应该是不陌生的:

         闲来无事,用python写了一个小工具搜集这个数据。可以定时每10分钟刷一次搜集。但目前对于我,每天也就11:30pm跑一次就够用了。

        1、数据爬取思路:
        1)进入下列网页,摁F12,通过抓包工具定位下面网页内的json结果就是我们需要搜集的数据。

         2)从header内可以看到二次请求的url如下,json?t后面跟着的是一个时间戳(1667980194303) 。修改这一时间戳为历史时间,并不能获取历史数据。目前只能当天数据当天下载并保存:
https://www.chinamoney.com.cn/r/cms/www/chinamoney/data/fx/rfx-sp-iday-chrt.json?t=1667980194303

         3)由于返回的并不是标准的json格式数据,而是一字符串。也无法用json库解析。所以我就直接用一个正则提取所需要的字段数据,直接把这个字典逐行写入csv文档内。

         2、开始编写小工具:

        1)有了思路,先直接导入所需用到的库:

import requests,re #由于json字段提取的数据格式是不太规则的字符串,无法用json序列化成字典。用正则能比较好的提取出所需要的字段值,直接用csv的dicwriter写入到csv文档中。
import csv
from datetime import datetime,timedelta   #生成当日的时间戳,拼接到url内提交网页请求,返回数据。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

        2)准备文件句柄,设置写入模式为:追加。然后传给csvwriter对象。同时把csv的表头字段准备好:

f=open("央行日内成交价成交量数据收集.csv", mode='a', encoding='utf-8', newline="")
csv_header=['Date','time',"spotprice",'spotAmt']  #time的用处主要是用于double check自己生成的日期是否与实际数据对齐,如果有缺漏需要排查data str是否格式有变动
csvwriter=csv.DictWriter(f,fieldnames=csv_header)

        3)准备header,避免反爬。准备时间戳,拼接成当天的url。用requests.post发起请求获取数据,编码设置为utf-8。然后直接从相应中提取json里面的data,再从里面切chartsDataStr。这就是我们需要用来解析的字符串:

headers={
"User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64)........"}  #这句大家自己去自己浏览器复制粘贴吧
t=datetime.today()
td_timestamp=round(datetime.timestamp(t))
url=f"https://www.chinamoney.com.cn/r/cms/www/chinamoney/data/fx/rfx-sp-iday-chrt.json?t={td_timestamp}"
resp=requests.post(url,headers=headers);resp.encoding='utf-8'
data=resp.json()['data']['chartsDataStr']

        4)用正则提取数据,并返回迭代器对象:

obj=re.compile(r'time.*?:.*?"(?P<time>.*?)".*?spotPrice.*?:.*?(?P<spotprice>.*?),spotAmount : (?P<spotAmt>.*?)}',re.S)
result=obj.finditer(data)  #用正则提取数据并返回迭代对象

        5)初始化每天第一条数据的时间(day_time),格式为【年月日 时分秒】,然后在读取到数据后的循环里,逐次增加10分钟,把时间标签写到Date列,作为后续数据分析的索引列:

day_time=datetime.strptime(resp.json()['data']['lastDateEn'][0:10],"%d/%m/%Y")+timedelta(hours=9,minutes=30) #把时间初始化为每天早上九点半
for num,it in enumerate(result):
    print(num,"-----",it.groupdict())
    temp_dict=it.groupdict()
    temp_dict['Date']=day_time #把日期铺到date列
    if temp_dict['spotprice']!=str(0):      #如果spot没有价格,说明市场没运动到该时点,因此无需写入csv
        csvwriter.writerow(temp_dict)
    else:
        continue
    day_time+=timedelta(minutes=10)        #自行调整时间标签(每10分钟出一根柱子
f.close()
resp.close()

        6)pandas简易去重(有时不灵光,先用着),删除dataframe的time列,把index设置成datetimeIndex格式:

df=pd.read_csv("央行日内成交价成交量数据收集.csv", encoding='utf-8', index_col='Date')
df=df.drop_duplicates()                 #每次提取的数据,通过pandas进行简易去重
df.to_csv("央行日内成交价成交量数据收集.csv")
del df['time']
df.index=pd.DatetimeIndex(df.index)      #把索引转化成日期索引

        7)画个图瞅瞅呗,近几日的USDCNY即期交易量稳定在350亿美金左右。目测今天下午的交易还是比较活跃的,价格下来一百多点,而每10分钟的交易量比较平均的维持在较高水平:

          3、小贴士

         我们平时看一些新闻,说的银行间外汇市场运行报告。像8月份的运行报告,说的日均成交量为1893亿美元。这个数字明显比我们上面看到的日均350亿美元多得多得多得多。原因是【运行报告】的口径包括了掉期,非USDCNY币种的外汇交易等交易品种。数字当然比纯粹的USDCNY spot要大的。

         PS:写完这个,继续去聚宽啃啃5因子模型。最近有点儿卡壳了,希望能早点儿整里出来跟大伙儿分享吧:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外汇量化__炼丹房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值