python tushare库的使用例子

说明:
'''
1、结合tushare 简单封装的调用接口——大宗交易接口为例
2、对大宗交易数据的处理:
	达到效果:
	(1)买入和卖出机构相同的时候,去除该条数据(这个还涉及到同属于一个大机构的情况,暂时没做处理)
	(2)相同买方机构处理数据(去重和求和统计)
	(3)按照相同卖方机构处理数据(去重和统计)
	(4)计算不同机构的持仓情况和成交均价
'''
import tushare as ts

#1、结合tushare 简单封装的调用接口——大宗交易接口为例
class Stock_Api():
    def __init__(self,stock):
        self.stock = stock  #股票代码
        # 
        #初始化pro接口对象
        self.pro = ts.pro_api("")
    def big_trade(self,start='',end='',trade_date='',):
        '''
        查询大宗交易数据
        :param stock:股票代码--只支持查找一支股票
        :param trade_date: 交易日
        :param start: 开始时间
        :param end: 结束时间
        :return: dataframe

        输出参数:--一般支持fields:
        名称	类型	默认显示	描述
        ts_code	str	Y	TS代码
        trade_date	str	Y	交易日历
        price	float	Y	成交价
        vol	float	Y	成交量(万股)
        amount	float	Y	成交金额
        buyer	str	Y	买方营业部
        seller	str	Y	卖方营业部
        '''
        big_data = self.pro.query('block_trade',ts_code=self.stock,start_date=str(start),end_date=str(end),trade_date=trade_date,fields='')
        return big_data

    def stock_hold_number(self,end):
        '''
        查询股东人数:
        :param stock:股票代码
        :param end: 截止日期
        :return: dataframe
        '''
        holder_date = self.pro.query('stk_holdernumber',ts_code=self.stock, enddate=end)
        return holder_date

    def stockhold_trade(self,start,end,ann_date,type,holderpy=''):
        '''
        查询股东增减持信息:
        :param stock: 股票代码
        :param start: 开始时间
        :param end: 结束时间
        :param ann_date: 公告日期(查询某一天)
        :param type: IN增持;DE减持
        :param holderpy: C公司;P个人;G高管
        :return: dataframe
        '''
        trade_data = self.pro.query('stk_holdertrade',ts_code=self.stock,start_date=start,end_date=end,ann_date=ann_date, trade_type=type,holder_type=holderpy,
                               fields='ts_code,ann_date,holder_name,holder_type,in_de,change_ratio,after_ratio,avg_price,total_share,change_vol,after_share,begin_date,close_date'
                               )
        return trade_data

#2、对大宗交易数据的处理

#实例化对象,调用接口,获取原始数据
ST = Stock_Api('000009.SZ')
big_data = ST.big_trade(20160202,20210701) #原始数据
#(1)买入和卖出机构相同的时候,去除该条数据(这个还涉及到同属于一个大机构的情况,暂时没做处理)
'''
own_data = big_data.to_dict()
# print(own_data)
same_list = []
use_list = []
sum_buyer = 0
sum_seller = 0
for i in own_data["buyer"]:
    simple = own_data["buyer"][i][:5]
    # print(simple)
    if own_data["buyer"][i].startswith(simple) and own_data["seller"][i].startswith(simple):
        same_list.append(i)
        # print(same_list)
    else:
        use_list.append(i)
print(same_list)
print(use_list)
use_data = big_data[big_data.index.isin(use_list)]  #取到不是倒卖的数据(包括本身和同属于一机构的)
'''
use_data = big_data[big_data["buyer"] != big_data["seller"]] #取到不是倒卖的数据(仅包括机构本身)

# 取出所有的机构名(转化成列表)
buyer_name = use_data["buyer"].values.tolist()
seller_name = use_data["seller"].values.tolist()
#合并在一起并去重--1、名称相同;2、同属于一机构(这个不能处理,处理后交易会漏掉),合并后去重和分开去重后者更好
#all_name = buyer_name + seller_name
#all_name = set(all_name)
#all_name = list(all_name)

buyer_name = set(buyer_name)
seller_name = set(seller_name)
buyer_name = list(buyer_name)
seller_name = list(seller_name)


#(2)相同买方机构处理数据(去重和求和统计)
#(3)按照相同卖方机构处理数据(去重和统计)
#这种处理方式会因为卖方和卖方分别不是等同于去重的全部机构,这样查出来会有很多空值——不采用;采用分开形式
# for i in all_name:
#     # 买方
#     # if i in use_data["buyer"].values.tolist() or i in use_data["seller"].values.tolist():
#         choose_data_1 = use_data[use_data["buyer"]==i]
#         # choose_data = use_data["buyer"].isin(all_name)
#         print(choose_data_1)
#         b_t = choose_data_1["vol"].sum()  # 计算成交量--万股
#         # print(b_t)
#         b_p = choose_data_1["price"].mean()  # 计算买入均价--元
#
#
#     # 买方
#     # if i in use_data["seller"].values.tolist():
#         choose_data = use_data[use_data["seller"]==i]
#         # choose_data = use_data["seller"].isin(all_name)
#         print(choose_data)
#         s_t = choose_data["vol"].sum()  # 计算成交量--万股
#         # print(s_t)
#         s_p = choose_data["price"].mean()  # 计算卖出均价--元
#
#
#         #计算持有量
#         t = b_t - s_t
#
#         vol.append(t)
#         b_avr_price.append(b_p)
#         s_avr_price.append(s_p)
#         company_name.append(i)
b_avr_price = []
s_avr_price = []
company_name = []
vol_buy = []
vol_seller = []
seller_company_name = []
buyer_company_name = []
#分卖方和买方的分别统计
for i in buyer_name:
    # 买方
    # if i in use_data["buyer"].values.tolist() or i in use_data["seller"].values.tolist():
        choose_data_1 = use_data[use_data["buyer"]==i]
        b_t = choose_data_1["vol"].sum()  # 计算成交量--万股
        b_p = choose_data_1["price"].mean()  # 计算买入均价--元

        b_avr_price.append(b_p)
        vol_buy.append(b_t)
        buyer_company_name.append(i)

for i in seller_name:
    # 买方
        choose_data = use_data[use_data["seller"]==i]
        s_t = choose_data["vol"].sum()  # 计算成交量--万股
        s_p = choose_data["price"].mean()  # 计算卖出均价--元

        s_avr_price.append(s_p)
        vol_seller.append(s_t)
        seller_company_name.append(i)


print(vol_buy,len(vol_buy))
print(vol_seller,len(vol_seller))
print(b_avr_price,len(b_avr_price))
print(s_avr_price,len(s_avr_price))
print(seller_company_name,len(seller_company_name))
print(buyer_company_name,len(buyer_company_name))4)计算不同机构的持仓情况和成交均价
#分开处理数据dict-dataframe
big_dict_1 = {}  #买方
big_dict_2 = {}  #卖方
big_dict_1["company_name"]=buyer_company_name
big_dict_1["remain_holding"]=vol_buy
big_dict_1["avg_price"]=b_avr_price


big_dict_2["company_name"]=seller_company_name
big_dict_2["remain_holding"]=vol_seller
big_dict_2["avg_price"]=s_avr_price

import  pandas as pd
a_b = pd.DataFrame(big_dict_1)
a_s = pd.DataFrame(big_dict_2)

# 错误
# for i in a_s["company_name"].values:
#     if i in a_b["company_name"].values:
#         a_b[a_b["company_name"]==i]["remain_holding"] = a_b[a_b["company_name"]==i]["remain_holding"]-a_b[a_b["company_name"]==i]["remain_holding"]
#         a_b[a_b["company_name"] == i]["avg_price"] = (a_b[a_b["company_name"] == i]["avg_price"] + a_b[a_b["company_name"] == i][ "avg_price"])*1/2
#
#     else:
#         a_b.append(a_s[a_s["company_name"]==i])


# dataframe-dict(转换后因为keys为index,比较好操作)
'''
外层keys:company_name,remain_holding,avg_price
内层keys:index
'''
a_b_data = a_b.to_dict()
a_s_data = a_s.to_dict()

# 如果卖出机构的名称没在买入机构里面:则添加卖出数据到买入的信息里面
# 如果卖出信息的机构名称在买入机构里面:则改变持有量和持有价格
for i in a_s_data["company_name"]:
    if a_s_data["company_name"][i] in a_b_data["company_name"].values():
        a_b_data["remain_holding"][i] = int(a_b_data["remain_holding"][i] - a_s_data["remain_holding"][i])
        a_b_data["avg_price"][i] = (float(a_b_data["avg_price"][i]) + float(a_s_data["avg_price"][i])*0.5)

    else:
        # dict.setdefault('word', []).append([1, 2, 3])--给字典新增一个item
        a_b_data["company_name"][len(a_b_data["company_name"]) + 1] = a_s_data["company_name"][i]
        a_b_data["remain_holding"][len(a_b_data["remain_holding"])+1] = a_s_data["remain_holding"][i]
        a_b_data["avg_price"][len(a_b_data["avg_price"]) + 1] = a_s_data["avg_price"][i]

print(pd.DataFrame(a_b_data))



如果对于有更好的处理方式,欢迎指教哟~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XB_tonticc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值