提示:采集行情仅用于个人量化分析,不做为交易依据
量化分析,行情先行。
股票价格在一段时间中:
(1)资金流入:股价上升状态所产生的成交额,代表推动价格上涨的动力
(2)资金流出:股价下跌过程中产生的成交额,代表推动价格下跌的力量
当天的资金流入与流出的差额,是当天买卖双方力量抵消之后,推动价格变化的净作用量,被定义为当天的资金净流量(MF)。
每一个买单都对应有一个卖单,真实的资金流入无法准确的计算。我们只能选择通过高频数据,将每笔交易按推动股价上涨和下跌的差异分类,判断为资金的流入或流出,最终汇总成一天的资金流净额。
股票的涨跌因素很多,但归根结底就是资金的进出变化造成的。不管是长期、中期、还是短期,都是资金的进出影响了股价的波动。所以观察资金的流向,尤其是大资金流向有助于对行情的把握。
前面给大家展示了【行情采集】解析JS 1秒获取5000支股票瞬时行情(送代码,含筛选方法),相信大家对这套JS采集方法已经熟悉。
本篇,给大家分享一个0.5秒级可获取主力资金流向的函数,通过观察今日、5日内、10日内资金流向分析资金在行业、概念、地域的变化,优化我们的持仓。
废话不多少,show me your code!
本段代码,涉及2个参数:
days = [‘1d’,‘5d’,‘10d’] # 默认提取1d,也即当天的,当然有人想一把提取当天、5天、10天的自己变化,我们的函数也是支持的。
kind = ‘行业’ # 默认按行业进行划分提取,还可设置为 ‘概念’或’地域’
根据参数不同,请求的url地址及参数,以及获取后的列及列名称均不一样,所以通过判断进行的修改。确保可以适应多种情况。
当然,小伙伴如果不想那么多,直接使用get_zijinliu_dfcfw()也不会报错,因为已经设置了默认值,及时提取当天行业的资金流向,并默认按资金净流入按大小排序。
完整代码如下,就不分段展示了,有疑问的小伙伴可在评论里留言。
# coding=utf-8
import requests
import json
import pandas as pd
from datetime import datetime
def get_zijinliu_dfcfw(days='1d',kind='行业'):
# 获取资金流。
if kind == '行业':
url = "https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery1123041371509725124067_1667389985005&fid=f62&po=1&pz=500&pn=1&np=1&fltt=2&invt=2&ut=b2884a393a59ad64002292a3e90d46a5&fs=m%3A90+t%3A2&fields=f12%2Cf14%2Cf2%2Cf3%2Cf62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf204%2Cf205%2Cf124%2Cf1%2Cf13"
if kind == '概念':
url = "https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery1123041371509725124067_1667389985011&fid=f62&po=1&pz=500&pn=1&np=1&fltt=2&invt=2&ut=b2884a393a59ad64002292a3e90d46a5&fs=m%3A90+t%3A3&fields=f12%2Cf14%2Cf2%2Cf3%2Cf62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf204%2Cf205%2Cf124%2Cf1%2Cf13"
if kind == '地域':
url = "https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery1123041371509725124067_1667389985005&fid=f62&po=1&pz=50&pn=1&np=1&fltt=2&invt=2&ut=b2884a393a59ad64002292a3e90d46a5&fs=m%3A90+t%3A1&fields=f12%2Cf14%2Cf2%2Cf3%2Cf62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf204%2Cf205%2Cf124%2Cf1%2Cf13"
cols = ['f1','f12','f13','f14','f2','f3','f62','f184','f66','f69','f72','f75','f78','f81','f84','f87','f204','f205']
cols_c = {'f1':'2','f12':'板块代码','f13':'类型','f14':'版块名称','f2':'最新价','f3':'今日涨跌幅','f62':'今日主力净流入净额','f184':'今日主力净流入净占比','f66':'今日超大单净流入净额','f69':'今日超大单净流入净占比','f72':'今日大单净流入净额','f75':'今日大单净流入净占比','f78':'今日中单净流入净额','f81':'今日中单净流入净占比','f84':'今日小单净流入净额','f87':'今日小单净流入净占比','f204':'今日流入最大股','f205':'今日code'}
url_5d = '%2Cf160%2Cf174%2Cf175%2Cf176%2Cf177%2Cf178%2Cf179%2Cf180%2Cf181%2Cf182%2Cf183%2Cf260%2Cf261'
cols_5d = ['f109','f164','f165','f166','f167','f168','f169','f170','f171','f172','f173','f257','f258']
cols_5d_c = {'f109':'5日涨跌幅','f164':'5日主力净流入净额','f165':'5日主力净流入净占比','f166':'5日超大单净流入净额','f167':'5日超大单净流入净占比','f168':'5日大单净流入净额','f169':'5日大单净流入净占比','f170':'5日中单净流入净额','f171':'5日中单净流入净占比','f172':'5日小单净流入净额','f173':'5日小单净流入净占比','f257':'5日流入最大股','f258':'5日code'}
url_10d = '%2Cf109%2Cf164%2Cf165%2Cf166%2Cf167%2Cf168%2Cf169%2Cf170%2Cf171%2Cf172%2Cf173%2Cf257%2Cf258'
cols_10d = ['f160','f174','f175','f176','f177','f178','f179','f180','f181','f182','f183','f260','f261']
cols_10d_c = {'f160':'10日涨跌幅','f174':'10日主力净流入净额','f175':'10日主力净流入净占比','f176':'10日超大单净流入净额','f177':'10日超大单净流入净占比','f178':'10日大单净流入净额','f179':'10日大单净流入净占比','f180':'10日中单净流入净额','f181':'10日中单净流入净占比','f182':'10日小单净流入净额','f183':'10日小单净流入净占比','f260':'10日流入最大股','f261':'10日code'}
if '5d' in days:
url = url + url_5d
cols = cols + cols_5d
cols_c = dict( cols_c, **cols_5d_c )
if '10d' in days:
url = url + url_10d
cols = cols + cols_10d
cols_c = dict( cols_c, **cols_10d_c )
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36'
}
# 循环执行,直至获取成功
loop = True
while loop == True:
try:
response=requests.get(url,headers=headers,timeout=3)
response.encoding='utf-8'
except Exception as e:
loop = True
else:
if response.content:
a = response.text.find('(',1)+1#从第一个左括号+1位置开始
b = response.text.rfind(')')-len(response.text)#结束于右括号
json_str=response.text[a:b]#截取字符串
# print(json_str)
if len(json_str)>50: #获取行情信息长度如果小于50字符,则失败
kdata = json.loads(json_str)
if kdata['data']:
# print(kdata['data'])
df_data = pd.DataFrame(kdata['data']['diff'])
df_data = df_data[cols]
df_data = df_data.replace('-', 0)
# 中文字段名
df_data = df_data[cols].rename(index=str, columns=cols_c)
# 增加交易时间,方便后期显示
df_data['trade_time'] = str(datetime.now().strftime('%Y-%m-%d'))
df_data.index = pd.DatetimeIndex(df_data['trade_time'])
loop == False
return {
"success": True,
"df_data":df_data.round(2)
}
else:
return {
"success": False,
"msg": '获取行情信息结果为None'
}
else:
return {
"success": False,
"msg": '获取行情信息失败'
}
# ===============表格美化输出===============
def df_table(df,index):
import prettytable as pt
#利用prettytable对输出结果进行美化,index为索引列名:df_table(df,'market')
tb = pt.PrettyTable()
df = df.reset_index(drop = True)
tb.add_column(index,df.index)
for col in df.columns.values:#df.columns.values的意思是获取列的名称
tb.add_column(col, df[col])
print(tb)
if __name__ == '__main__':
'''使用此函数可以快速获取主力资金流向,通过观察今日、5日内、10日内资金流向分析行业、概念、地域变化'''
# from KTstock import get_zijinliu_dfcfw # 将文件保存为KTstock,同目录引用方法取消注释即可
import time
# 计时开始
time1 = time.time()
if 1:
days = ['1d','5d','10d'] # 默认提取1d,也即当天的,当然有人想一把提取当天、5天、10天的自己变化,我们的函数也是支持的。
kind = '行业' # 默认按行业进行划分提取,还可设置为 '概念'或'地域'
ret = get_zijinliu_dfcfw(days,kind)
cols = ['板块代码','类型','版块名称','最新价','今日涨跌幅','今日主力净流入净额','今日主力净流入净占比','今日超大单净流入净额','今日超大单净流入净占比','今日大单净流入净额','今日大单净流入净占比','今日中单净流入净额','今日中单净流入净占比','今日小单净流入净额','今日小单净流入净占比','今日流入最大股','今日code']
cols_5d = ['5日涨跌幅','5日主力净流入净额','5日主力净流入净占比','5日超大单净流入净额','5日超大单净流入净占比','5日大单净流入净额','5日大单净流入净占比','5日中单净流入净额','5日中单净流入净占比','5日小单净流入净额','5日小单净流入净占比','5日流入最大股','5日code']
cols_10d = ['10日涨跌幅','10日主力净流入净额','10日主力净流入净占比','10日超大单净流入净额','10日超大单净流入净占比','10日大单净流入净额','10日大单净流入净占比','10日中单净流入净额','10日中单净流入净占比','10日小单净流入净额','10日小单净流入净占比','10日流入最大股','10日code']
if '5d' in days:
cols = cols + cols_5d
if '10d' in days:
cols = cols + cols_10d
if ret['success']:
df_data = ret['df_data']
df_data = df_data.sort_values(by = '今日主力净流入净额',ascending=False)
print(df_data.head(10))
df_table(df_data[cols],'df_data')
df_data.to_excel('c:\\get_zijinliu_dfcfw.xlsx',index = False)
#df.to_csv('c:\\get_zijinliu_dfcfw.csv',index = False)
# 计时结束
time_end = time.time()
print("Python读取lmdb总耗时:",time_end-time1,'秒')
经测试,0.5秒即可获取到以上信息。
如果自己建立数据表,也可以每分钟提取一次,然后跟踪版块间的资金流动。有兴趣的小伙伴可以试试,有好消息欢迎评论区沟通。
另外,JS采集虽爽,但有可能被阻塞,大家且用且珍惜!