半成品3,谢谢。

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 28 14:15:59 2020

@author: zoutianshu
"""

import pandas as pd
from WindPy import w
from zts.adj_nav import add_fund_exchange,add_stock_exchange
import datetime as dt
import numpy as np
w.start()


# wind中获取报告期持仓细节
def get_fund_holding(fund,date):
    try:
        data = w.wset("allfundhelddetail","rptdate="+date+";windcode="+fund+".OF;field=stock_code,proportiontototalstockinvestments,proportiontonetvalue")
        df_oc = pd.DataFrame(data.Data[1:],columns = data.Data[0],index = ['占股票市值','占净值']).T
    except:
        df_oc = pd.DataFrame(index = ['占股票市值','占净值']).T
    return df_oc
    
# 仓位计算
def position(df_oc_temp):
    oc = df_oc_temp.iloc[0]['占净值']/df_oc_temp.iloc[0]['占股票市值'] * 100
    return oc

def get_exposure(date):
    data = w.tdaysoffset(0, date[0:4]+"-"+date[4:6]+"-"+date[6:8], "")
    date = data.Data[0][0].strftime("%Y%m%d")
    tdy = pd.read_csv("\\\\10.180.90.60/f/daily_data/barra_model/Exposure/Exposure_"+date+".csv",index_col = 0)
    tdy = tdy.iloc[1:,:10]
    tdy = tdy.apply(pd.to_numeric, errors='ignore',downcast = 'float' )
    tdy.index = [x[0:6] for x in tdy.index]
    tdy.columns = [x[6:] for x in tdy.columns]
    return tdy


df = pd.read_excel('宽基收益率.xlsx',sheet_name = 'Sheet1')
df['成立日期'] = pd.to_datetime(df['成立日期'])
df2 = pd.read_excel('宽基收益率.xlsx',sheet_name = 'Sheet2')
df2.set_index('证券代码',inplace = True)
industry = df2[['所属申万行业名称[行业级别] 一级行业']].drop_duplicates('所属申万行业名称[行业级别] 一级行业')['所属申万行业名称[行业级别] 一级行业']
date_list = list(df.columns[4:])

fund_list_str,fund_list = add_fund_exchange(df['代码'])
df['代码'] = fund_list



###
for idate in date_list:
    date = idate.strftime("%Y%m%d")    
    
    ###
    df_distill = df[df['成立日期']<idate]
    distill_num = df_distill.shape[0]
    df_distill = df_distill.sort_values(idate,ascending = False)
    df_top20 = df_distill.iloc[:int(distill_num/5)]
    
    df_out = pd.DataFrame(index = df_top20['代码'],columns = industry.values)
    df_out ['盲区'] = np.nan;    df_out ['仓位'] = np.nan;
    
    df_exposure = get_exposure(date)
    a,b = add_stock_exchange(list(df_exposure.index))
    df_exposure.index = a
    df_out['贝塔'] = np.nan;    df_out['动量'] = np.nan;    df_out['市值'] = np.nan;    df_out['盈利'] = np.nan;    df_out['波动'] = np.nan;
    df_out['增长'] = np.nan;    df_out['价值'] = np.nan;    df_out['杠杆'] = np.nan;    df_out['流动性'] = np.nan;    df_out['非线性市值'] = np.nan;
    for ifund in df_top20['代码']:
### from file
        try:
            df_oc_temp = pd.read_csv('data\\'+date+'_'+ifund+'.csv',index_col=0)
            print(1)    
### download
        except:
            df_oc_temp = get_fund_holding(ifund,date)
            df_oc_temp.to_csv('data\\'+date+'_'+ifund+'.csv')
            print(0)
###
#仓位
###     
        try:
            df_out['仓位'].loc[ifund] = position(df_oc_temp)
###
#行业
###
            df_oc_temp['行业'] = df2[['所属申万行业名称[行业级别] 一级行业']].loc[df_oc_temp.index]
            df_oc_group = df_oc_temp.groupby('行业').sum()
            for ix in df_oc_group.index:
                df_out[ix].loc[ifund] = df_oc_group['占股票市值'].loc[ix]
            df_out ['盲区'].loc[ifund] = 100-df_oc_temp['占股票市值'].sum()
###
#风格
###
            result = pd.concat([df_oc_temp, df_exposure.loc[df_oc_temp.index]], axis=1)
            df_out ['贝塔'].loc[ifund] = (result['BETA']*result['占净值']).sum()/100
            df_out ['动量'].loc[ifund] = (result['MOMENTUM']*result['占净值']).sum()/100
            df_out ['市值'].loc[ifund] = (result['SIZE']*result['占净值']).sum()/100
            df_out ['盈利'].loc[ifund] = (result['EARNYILD']*result['占净值']).sum()/100
            df_out ['波动'].loc[ifund] = (result['RESVOL']*result['占净值']).sum()/100
            df_out ['增长'].loc[ifund] = (result['GROWTH']*result['占净值']).sum()/100
            df_out ['价值'].loc[ifund] = (result['BTOP']*result['占净值']).sum()/100
            df_out ['杠杆'].loc[ifund] = (result['LEVERAGE']*result['占净值']).sum()/100
            df_out ['流动性'].loc[ifund] = (result['LIQUIDTY']*result['占净值']).sum()/100
            df_out ['非线性市值'].loc[ifund] = (result['SIZENL']*result['占净值']).sum()/100
        except:
            pass
    
    df_out = df_out.fillna(0)
    df_out.to_excel(date+'.xlsx')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值