CFA1901 1923040426
作业 一
请从Tushare中导入至2018年1月1日至2021年1月1日5支股票(任选)的收盘价,并生成一个数据框 DataFrame。 计算每天每支股票的涨跌幅,并计算累计涨跌幅序列。针对5支股票的涨跌幅,计算这5支股票收益率的协方差和相关系数。
#performance of stocks&covariance&correlation coefficient
import tushare as ts
import numpy as np
import pandas as pd
pro = ts.pro_api()
port={'601398.SH':'GSYH',#工商银行
'601857.SH':'ZGSY',#中国石油
'603605.SH':'BLY',#珀莱雅
'600104.SH':'SQJT',#上汽集团
'603899.SH':'CGWJ'}#晨光文具#选取5只股票并编号
r=pd.DataFrame()#建立空的日收益矩阵
acr=pd.DataFrame()#建立空的累计收益(accumulated return)矩阵
for code,number in port.items():
df = pro.daily(ts_code=code, start_date='20180101', end_date='20210101')#取得单只股票的历史价格
r.insert(column=number,value=(df.close-df.close.shift(-1))/df.close.shift(-1),loc=len(r.columns))#计算除第一天的日收益率放入r
#r['date']=df['trade_date']#将时间序列加入r
r.index = pd.to_datetime(df.trade_date)#将r的索引设为股票的时间序列
r.sort_index(ascending=True,inplace=True)#时间从旧到新排序,方便累计收益计算
for code,number in port.items():
acr.insert(column=number,value=(np.cumprod(r[number]+1))-1,loc=len(acr.columns))#计算从第二天开始的累计收益后放入acr
acr.sort_index(ascending=False,inplace=True)#将acr数据顺序调回至与tushare默认的相同以便设置时间序列
acr.index = pd.to_datetime(df.trade_date)#将acr的索引设为股票的时间序列
print(r)
print(acr)
print(acr.corr())
print(acr.cov())
GSYH ZGSY BLY SQJT CGWJ
trade_date
2018-01-02 NaN NaN NaN NaN NaN
2018-01-03 -0.003236 0.002424 -0.016314 -0.007554 -0.016506
2018-01-04 -0.014610 0.033857 -0.009880 0.003172 -0.009415
2018-01-05 0.001647 0.004678 0.000000 0.009169 0.028926
2018-01-08 -0.001645 -0.006985 0.018175 0.015351 0.008434
2018-01-09 0.003295 -0.002345 0.036052 0.000926 -0.005177
2018-01-10 0.011494 0.028202 -0.020608 0.044081 0.012410
2018-01-11 0.008117 0.001143 0.009659 -0.001181 0.018584
2018-01-12 0.006441 -0.001142 -0.021524 0.002365 -0.010093
2018-01-15 0.028800 0.006857 -0.052025 -0.012091 -0.018824
2018-01-16 0.024883 -0.011351 0.043462 -0.035224 -0.015987
2018-01-17 0.019727 0.012629 0.019767 0.006498 -0.010561
2018-01-18 0.061012 -0.010204 -0.002423 0.000000 0.008621
2018-01-19 -0.001403 0.030928 0.017349 0.009222 -0.045177
2018-01-22 0.007022 -0.005556 -0.008186 0.028023 0.043905
2018-01-23 0.044630 0.026816 -0.017538 0.006519 -0.003675
2018-01-24 -0.012016 0.015234 0.100105 -0.000294 0.038934
2018-01-25 -0.006757 -0.008574 -0.016863 0.027091 -0.011440
2018-01-26 0.002721 0.006486 -0.029450 0.002867 -0.001995
2018-01-29 0.008141 -0.001074 0.016005 -0.014866 0.000400
2018-01-30 -0.020188 -0.020430 -0.033147 -0.001161 0.016387
2018-01-31 0.027473 -0.010977 -0.033944 -0.000872 -0.006685
2018-02-01 0.026738 -0.001110 -0.072382 0.013958 -0.025337
2018-02-02 -0.010417 0.033333 -0.018939 -0.004875 0.029651
2018-02-05 0.019737 0.005376 -0.023166 -0.015850 0.000000
2018-02-06 -0.023226 -0.056684 -0.100000 0.000000 -0.050888
2018-02-07 -0.058124 -0.028345 0.038647 -0.003514 -0.031588
2018-02-08 -0.043478 -0.024504 0.013953 -0.035263 0.031760
2018-02-09 -0.020528 -0.049043 -0.036697 -0.024977 -0.042845
2018-02-12 -0.010479 0.003774 0.033333 0.009684 0.010430
... ... ... ... ... ...
2020-11-20 -0.001984 0.000000 0.004121 0.042676 -0.011963
2020-11-23 0.007952 0.016509 -0.006879 -0.009956 0.003696
2020-11-24 -0.003945 0.004640 -0.026192 -0.029795 -0.006603
2020-11-25 -0.001980 -0.004619 -0.045724 0.004990 -0.026588
2020-11-26 0.009921 -0.004640 -0.009207 -0.046982 0.008930
2020-11-27 0.058939 0.002331 -0.002655 0.085371 -0.010803
2020-11-30 -0.012987 0.002326 -0.021614 -0.021049 -0.042632
2020-12-01 0.028195 -0.002320 0.055973 -0.000377 0.027488
2020-12-02 -0.003656 0.000000 -0.002025 -0.029811 0.021937
2020-12-03 -0.012844 0.000000 0.013586 -0.003501 0.008508
2020-12-04 -0.013011 -0.002326 0.007096 -0.014832 0.042700
2020-12-07 -0.022599 -0.011655 -0.008311 -0.035658 0.006348
2020-12-08 -0.013487 -0.007075 0.027206 0.000822 -0.017934
2020-12-09 -0.003906 -0.007126 -0.020396 -0.027915 -0.003526
2020-12-10 -0.007843 0.002392 0.002776 0.003378 0.047270
2020-12-11 0.003953 0.007160 -0.025036 0.001684 -0.006517
2020-12-14 -0.005906 -0.007109 0.010494 0.023950 0.022838
2020-12-15 -0.007921 -0.009547 0.004459 -0.002872 0.006532
2020-12-16 -0.001996 0.000000 0.014718 -0.019342 -0.007788
2020-12-17 0.006000 0.016867 0.078813 0.022241 -0.000476
2020-12-18 -0.005964 0.009479 -0.020556 0.012726 -0.002617
2020-12-21 0.000000 -0.002347 0.000397 0.004054 0.034594
2020-12-22 -0.012000 -0.025882 -0.034983 -0.062172 -0.016719
2020-12-23 0.004049 0.000000 -0.008226 0.048214 -0.012547
2020-12-24 0.000000 0.004831 -0.025474 -0.017659 0.038119
2020-12-25 0.002016 0.002404 0.023465 -0.021739 -0.001830
2020-12-28 0.000000 -0.007194 -0.033440 0.100000 -0.009856
2020-12-29 0.002012 -0.002415 0.014564 -0.074592 0.015856
2020-12-30 -0.004016 0.000000 0.044034 0.024769 0.002507
2020-12-31 0.006048 0.004843 0.032662 0.001229 0.006478
[730 rows x 5 columns]
GSYH ZGSY BLY SQJT CGWJ
trade_date
2020-12-31 -0.192557 -0.496970 5.178410 -0.230721 2.565217
2020-12-30 -0.197411 -0.499394 4.982992 -0.231665 2.542271
2020-12-29 -0.194175 -0.499394 4.730649 -0.250236 2.533414
2020-12-28 -0.195793 -0.498182 4.648386 -0.189802 2.478261
2020-12-25 -0.195793 -0.494545 4.843804 -0.263456 2.512882
2020-12-24 -0.197411 -0.495758 4.709823 -0.247088 2.519324
2020-12-23 -0.197411 -0.498182 4.859077 -0.233554 2.390097
2020-12-22 -0.200647 -0.498182 4.907671 -0.268807 2.433172
2020-12-21 -0.190939 -0.484848 5.121833 -0.220334 2.491546
2020-12-18 -0.190939 -0.483636 5.119403 -0.223481 2.374799
2020-12-17 -0.186084 -0.488485 5.247831 -0.233239 2.383655
2020-12-16 -0.190939 -0.496970 4.791392 -0.249921 2.385266
2020-12-15 -0.189320 -0.496970 4.707393 -0.235127 2.411836
2020-12-14 -0.182848 -0.492121 4.682055 -0.232924 2.389694
2020-12-11 -0.177994 -0.488485 4.623048 -0.250866 2.314010
2020-12-10 -0.181230 -0.492121 4.767442 -0.252125 2.335749
2020-12-09 -0.174757 -0.493333 4.751475 -0.254643 2.185185
2020-12-08 -0.171521 -0.489697 4.871225 -0.233239 2.196457
2020-12-07 -0.160194 -0.486061 4.715724 -0.233868 2.254831
2020-12-04 -0.140777 -0.480000 4.763624 -0.205540 2.234300
2020-12-03 -0.129450 -0.478788 4.723013 -0.193579 2.101852
2020-12-02 -0.118123 -0.478788 4.646303 -0.190746 2.075684
2020-12-01 -0.114887 -0.478788 4.657758 -0.165880 2.009662
2020-11-30 -0.139159 -0.477576 4.357862 -0.165565 1.929147
2020-11-27 -0.127832 -0.478788 4.476224 -0.147624 2.059581
2020-11-26 -0.176375 -0.480000 4.490802 -0.214668 2.092995
2020-11-25 -0.184466 -0.477576 4.541826 -0.175952 2.065620
2020-11-24 -0.182848 -0.475152 4.807359 -0.180044 2.149356
2020-11-23 -0.179612 -0.477576 4.963554 -0.154863 2.170290
2020-11-20 -0.186084 -0.486061 5.004859 -0.146364 2.158615
... ... ... ... ... ...
2018-02-12 0.069579 -0.032727 -0.171468 0.017312 -0.064010
2018-02-09 0.080906 -0.036364 -0.198195 0.007554 -0.073671
2018-02-08 0.103560 0.013333 -0.167650 0.033365 -0.032206
2018-02-07 0.153722 0.038788 -0.179104 0.071136 -0.061997
2018-02-06 0.224919 0.069091 -0.209649 0.074913 -0.031401
2018-02-05 0.254045 0.133333 -0.121833 0.074913 0.020531
2018-02-02 0.229773 0.127273 -0.101007 0.092225 0.020531
2018-02-01 0.242718 0.090909 -0.083652 0.097576 -0.008857
2018-01-31 0.210356 0.092121 -0.012149 0.082468 0.016908
2018-01-30 0.177994 0.104242 0.022562 0.083412 0.023752
2018-01-29 0.202265 0.127273 0.057619 0.084671 0.007246
2018-01-26 0.192557 0.128485 0.040958 0.101039 0.006844
2018-01-25 0.189320 0.121212 0.072544 0.097891 0.008857
2018-01-24 0.197411 0.130909 0.090941 0.068933 0.020531
2018-01-23 0.211974 0.113939 -0.008330 0.069248 -0.017713
2018-01-22 0.160194 0.084848 0.009372 0.062323 -0.014090
2018-01-19 0.152104 0.090909 0.017702 0.033365 -0.055556
2018-01-18 0.153722 0.058182 0.000347 0.023922 -0.010870
2018-01-17 0.087379 0.069091 0.002777 0.023922 -0.019324
2018-01-16 0.066343 0.055758 -0.016661 0.017312 -0.008857
2018-01-15 0.040453 0.067879 -0.057619 0.054454 0.007246
2018-01-12 0.011327 0.060606 -0.005901 0.067359 0.026570
2018-01-11 0.004854 0.061818 0.015967 0.064841 0.037037
2018-01-10 -0.003236 0.060606 0.006248 0.066100 0.018116
2018-01-09 -0.014563 0.031515 0.027421 0.021089 0.005636
2018-01-08 -0.017799 0.033939 -0.008330 0.020145 0.010870
2018-01-05 -0.016181 0.041212 -0.026033 0.004721 0.002415
2018-01-04 -0.017799 0.036364 -0.026033 -0.004407 -0.025765
2018-01-03 -0.003236 0.002424 -0.016314 -0.007554 -0.016506
2018-01-02 NaN NaN NaN NaN NaN
[730 rows x 5 columns]
GSYH ZGSY BLY SQJT CGWJ
GSYH 1.000000 0.645564 -0.641343 0.650062 -0.580320
ZGSY 0.645564 1.000000 -0.945534 0.808036 -0.895084
BLY -0.641343 -0.945534 1.000000 -0.775193 0.929431
SQJT 0.650062 0.808036 -0.775193 1.000000 -0.633805
CGWJ -0.580320 -0.895084 0.929431 -0.633805 1.000000
GSYH ZGSY BLY SQJT CGWJ
GSYH 0.005898 0.009295 -0.085739 0.008053 -0.028836
ZGSY 0.009295 0.035152 -0.308603 0.024440 -0.108586
BLY -0.085739 -0.308603 3.030340 -0.217692 1.046872
SQJT 0.008053 0.024440 -0.217692 0.026024 -0.066157
CGWJ -0.028836 -0.108586 1.046872 -0.066157 0.418660
假设投资者A,他采用投资并持有的策略,在2018年1月1日后的第一个交易日,购买了5支股票,每支100万元。计算每个交易日A先生持有的每支股票市值情况并可视化,同时再计算每个交易日A先生投资组合的整体市值并可视化。
#Equally Weighted Indexes without rebalancing,即求5支股票的等权平均收益
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
pro=ts.pro_api()
port={'600597.SH':'GMRY',#光明乳业
'601398.SH':'GSYH',#工商银行
'601857.SH':'ZGSY',#中国石油
'603605.SH':'BLY',#珀莱雅
'600104.SH':'SQJT'}#上汽集团
price=pd.DataFrame()#建立收盘价矩阵
for code,name in port.items():
df=pro.daily_basic(ts_code=code,start_date='20180101',end_date='20210101')
price['a']=df.close.copy()
price.rename(columns={'a':name},inplace=True)#将5只股票的收盘价放入price
price.index=pd.to_datetime(df['trade_date'])#在price中以时间序列为索引方便计算与画图
price=price.sort_index(ascending='True')
acr=pd.DataFrame()#建立累计收益矩阵
for code,name in port.items():
price[name+'_return']=price[name].pct_change()#计算日收益序列
price[name+'_acr']=(price[name+'_return']+1).cumprod()-1#计算累计收益序列
acr[name]=price[name+'_acr']#将累计收益矩阵放入acr
price['EWI_acr']=acr.mean(axis=1)#根据等权重原则计算投资组合的累计收益序列
acr.plot()#各支股票累计收益变化作图
price['EWI_acr'].plot()#投资组合累计收益变化作图
假设投资者B,她采用定投的方式,自2018年1月1日后的第一个交易日起,每天以当日收盘价对每支股票购买100股,计算每个交易日B女士持有的每支股票的盈亏情况并可视化,同时再计算每个交易日B女士投资组合的整体盈亏情况,并可视化。
#performance of AutomaticInvestmentPlan
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
pro=ts.pro_api()
port={'600597.SH':'GMRY',#光明乳业
'601398.SH':'GSYH',#工商银行
'601857.SH':'ZGSY',#中国石油
'603605.SH':'BLY',#珀莱雅
'600104.SH':'SQJT'}#上汽集团
price=pd.DataFrame()
hold=pd.DataFrame()
for code,name in port.items():
df=pro.daily_basic(ts_code=code,start_date='20180101',end_date='20210101')
price['close']=df.close
price.rename(columns={'close':name},inplace=True)
price.index=pd.to_datetime(df.trade_date)
price=price.sort_index(ascending=True)
hold.insert(0,'day_counter',range(1,1+len(price)))
hold['port_cost']=0
hold['port_sell']=0
for code,name in port.items():
hold[name+'_cost']=100*price[name].cumsum().values
hold[name+'_sell']=price[name].values*100*hold['day_counter'].values
hold[name+'_return']=hold[name+'_sell']-hold[name+'_cost']
hold['port_cost']=hold['port_cost']+hold[name+'_cost']
hold['port_sell']=hold['port_sell']+hold[name+'_sell']
hold['port_return']=hold['port_sell']-hold['port_cost']
for code,name in port.items():
hold[name+'_return'].plot()
hold['port_return'].plot()
作业 二
使用Tushare的命令找出随机100个场外公募基金,并找出它们在过去一年的调整后净值。计算它们各自在过去一年中的收益(不到一年的需将其年化)。找到它们各自最近的基金经理的情况,看看收益和基金经理的学历和性别是否有关系(可以使用其他的特征)。
#RelationsBetweenTheNetValueOfAFundAndTheInformationOfItsManager
import tushare as ts
import pandas as pd
import numpy as np
import time
pro=ts.pro_api()
history=pro.fund_nav(end_date=20200114)#将去年今天的单日基金净值信息放入history
hundred=pd.DataFrame(columns=['code','return','edu','gender'])#创建基金信息分析矩阵
code=list(history['ts_code'])#将history中的基金代码放入code
for k in [0,55]:#因为基金净值端口有限制,用循环分两次调用
for i in range(k,k+55):#依次获取code中各支基金的数据
x=pro.fund_nav(ts_code=code[i])#将单支基金的历史净值信息放入x
y=pro.fund_manager(ts_code=code[i])#将单支基金的经理人信息放入y
if x[x['end_date']=='20210114'][['adj_nav']].empty:#若基金在今年选取的日子力没有净值信息则跳过该支基金
continue
#依次将基金代码、今年某日(1.14)相对于一年前根据其累计净值变化算得的年收益率、该基金经理人学历和性别按行存入hundred
hundred.loc[i]=[code[i],(x[x['end_date']=='20210114'][['adj_nav']].loc[0]['adj_nav']-history.loc[i,'adj_nav'])/history.loc[i,'adj_nav'],y.edu[0],y.gender[0]]
hundred=hundred.reset_index(drop=True)#重新编号
hundred=hundred[:100]#取前100个
print(hundred)
print(hundred[hundred['edu']=='本科']['return'].mean())#对其经理人学历为本科的基金的平均收益率求均值
print(hundred[hundred['edu']=='本科']['return'].count())#求其经理人学历为本科的基金个数
print(hundred[hundred['edu']=='硕士']['return'].mean())#对其经理人学历为硕士的基金的平均收益率求均值
print(hundred[hundred['edu']=='硕士']['return'].count())#求其经理人学历为硕士的基金个数
print(hundred[hundred['edu']=='博士']['return'].mean())#对其经理人学历为硕士的基金的平均收益率求均值
print(hundred[hundred['edu']=='博士']['return'].count())#求其经理人学历为博士的基金个数
print(hundred[hundred['gender']=='M']['return'].mean())#对其经理人为男性的基金的平均收益率求均值
print(hundred[hundred['gender']=='M']['return'].count())#求其经理人为男性的基金个数
print(hundred[hundred['gender']=='F']['return'].mean())#对其经理人为女性的基金的平均收益率求均值
print(hundred[hundred['gender']=='F']['return'].count())#求其经理人为女性的基金个数
code return edu gender
0 159955.SZ 0.614893 硕士 F
1 159975.SZ 0.588267 本科 M
2 160716.SZ 0.054012 硕士 F
3 160725.OF 0.049790 硕士 F
4 160722.SZ 0.482862 硕士 M
5 160726.SZ 0.516524 硕士 M
6 161706.SZ 0.866463 硕士 M
7 161713.SZ 0.026940 硕士 F
8 161715.SZ 0.205356 硕士 M
9 161716.SZ 0.032483 硕士 M
10 003297.OF 0.028727 硕士 M
11 161718.OF 0.250631 硕士 M
12 007320.OF 0.029393 硕士 M
13 007327.OF 0.018775 硕士 F
14 007338.OF 0.014666 硕士 F
15 007343.OF 0.756359 博士 M
16 007358.OF 0.047293 硕士 F
17 007359.OF 0.047219 硕士 F
18 007605.OF 0.056800 硕士 F
19 007606.OF 0.052502 硕士 F
20 007670.OF 0.024071 硕士 M
21 007825.OF 0.495895 硕士 M
22 007826.OF 0.488374 硕士 M
23 007831.OF 0.267704 硕士 F
24 007832.OF 0.263987 硕士 F
25 007879.OF 0.035812 硕士 M
26 007895.OF 0.662025 硕士 M
27 007986.OF 0.028563 硕士 M
28 008015.OF 0.030092 硕士 M
29 008016.OF 0.029985 硕士 M
.. ... ... .. ...
70 006594.OF 0.391852 硕士 F
71 006603.OF 0.309740 硕士 M
72 006604.OF 1.025556 硕士 M
73 006605.OF 1.015642 硕士 M
74 006801.OF 0.522606 硕士 M
75 006802.OF 0.516393 硕士 M
76 006803.OF 0.223402 硕士 M
77 006982.OF 0.096990 硕士 F
78 006983.OF 0.090454 硕士 F
79 007021.OF 0.027998 硕士 M
80 007022.OF 0.027393 硕士 M
81 007044.OF 0.442765 硕士 F
82 007045.OF 0.437064 硕士 F
83 007126.OF 0.412288 硕士 F
84 007127.OF 0.405497 硕士 F
85 007266.OF 0.128402 硕士 F
86 007267.OF 0.121601 硕士 F
87 007319.OF 0.031821 硕士 M
88 210006.OF 0.181334 硕士 M
89 110031.OF -0.045300 硕士 F
90 005675.OF -0.047438 硕士 F
91 161124.SZ 0.134350 硕士 M
92 006263.OF 0.133985 硕士 M
93 510900.SH -0.045092 硕士 F
94 513000.SH 0.190202 硕士 F
95 515000.SH 0.440073 硕士 F
96 000113.OF 0.022609 硕士 F
97 000115.OF 0.017606 硕士 F
98 000176.OF 0.346558 硕士 F
99 000414.OF 0.099187 博士 M
[100 rows x 4 columns]
0.5882669482917576
1
0.25766715119421996
97
0.42777292892089325
2
0.3466411428392335
47
0.1914225048779037
53
作业 三
使用爬虫爬取最近3个月每日的新浪新闻(可以使用讲义中的方法)。将新闻按照日进行分组,并对工作日的新闻进行舆情分析,使用Snow_NLP对于新闻进行打分,并计算每日的平均舆情得分。将舆情得分与当期的股票指数进行比较,计算它们两者间的相关系数,进而判断使用舆情分析是否可以做到预测股市的变化。
作业 四
使用Tushare任取场内或者场外基金历史超过2年的200个公募基金,取得过去两年的基金净值序列,通过计算夏普比率(可任意设定无风险利率),来找到19年表现最好的50个基金。通过计算平均收益率,找到2020年表现最好的50个基金。看看有多少基金在其夏普比例和平均收益率的表现是一致的。
#RelationsBetweenTheAverageOfReturnAndTheSharpRatio
import tushare as ts
import pandas as pd
import numpy as np
import time
pro=ts.pro_api()
df=pro.fund_basic()
df['date']=pd.to_datetime(df.issue_date)
old=df[df['date']<pd.to_datetime('20190101')].copy()#找到发行日期早于两年前的基金
fifty=pd.DataFrame(columns=['code','netValue'])
code=list(old['ts_code'])
for k in [0,50,100,150]:
for i in range(k,k+50):
fifty.loc[i]=[code[i],pro.fund_nav(ts_code=code[i])]