python in finance大作业及作答
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.000000GSYH 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.closeprice.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().valueshold[name+'_sell']=price[name].values*100*hold['day_counter'].valueshold[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])#將單支基金的歷史凈值信息放入xy=pro.fund_manager(ts_code=code[i])#將單支基金的經理人信息放入yif x[x['end_date']=='20210114'][['adj_nav']].empty:#若基金在今年選取的日子力沒有凈值信息則跳過該支基金continue#依次將基金代碼、今年某日(1.14)相對于一年前根據其累計凈值變化算得的年收益率、該基金經理人學歷和性別按行存入hundredhundred.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])]總結
以上是生活随笔為你收集整理的python in finance大作业及作答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中间商存在的意义
- 下一篇: 微信小程序登录一键登录,出现异常,报错4