In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as ply
%matplotlib inline
from pandas import DataFrame, Series
import datetime as datetime

In [2]:
import pandas.io.data as web
price = web.get_data_yahoo('AAPL', '2011-01-01', '2012-07-27')['Adj Close']
price[-5:]


d:\Anaconda2\lib\site-packages\pandas\io\data.py:35: FutureWarning: 
The pandas.io.data module is moved to a separate package (pandas-datareader) and will be removed from pandas in a future version.
After installing the pandas-datareader package (https://github.com/pydata/pandas-datareader), you can change the import ``from pandas.io import data, wb`` to ``from pandas_datareader import data, wb``.
  FutureWarning)
Out[2]:
Date
2012-07-23    79.402348
2012-07-24    79.019686
2012-07-25    75.607321
2012-07-26    75.595487
2012-07-27    76.947281
Name: Adj Close, dtype: float64

In [3]:
price['2011-10-03'] / price['2011-3-01'] -1


Out[3]:
0.072399882142698768

In [4]:
returns = price.pct_change()
ret_index = (1 + returns).cumprod()
ret_index[0] = 1 # 将第一个值设置为1
ret_index


Out[4]:
Date
2011-01-03    1.000000
2011-01-04    1.005219
2011-01-05    1.013442
2011-01-06    1.012622
2011-01-07    1.019874
2011-01-10    1.039081
2011-01-11    1.036623
2011-01-12    1.045059
2011-01-13    1.048882
2011-01-14    1.057378
2011-01-18    1.033620
2011-01-19    1.028128
2011-01-20    1.009437
2011-01-21    0.991352
2011-01-24    1.023910
2011-01-25    1.035895
2011-01-26    1.043329
2011-01-27    1.041387
2011-01-28    1.019814
2011-01-31    1.029584
2011-02-01    1.046910
2011-02-02    1.044755
2011-02-03    1.042085
2011-02-04    1.051370
2011-02-07    1.067694
2011-02-08    1.077768
2011-02-09    1.086749
2011-02-10    1.075765
2011-02-11    1.082775
2011-02-14    1.089844
                ...   
2012-06-15    1.742058
2012-06-18    1.777407
2012-06-19    1.782353
2012-06-20    1.777285
2012-06-21    1.752799
2012-06-22    1.766241
2012-06-25    1.731863
2012-06-26    1.735686
2012-06-27    1.743180
2012-06-28    1.726644
2012-06-29    1.772006
2012-07-02    1.797858
2012-07-03    1.818764
2012-07-05    1.850715
2012-07-06    1.838395
2012-07-09    1.862700
2012-07-10    1.845465
2012-07-11    1.833996
2012-07-12    1.817216
2012-07-13    1.835634
2012-07-16    1.841521
2012-07-17    1.841612
2012-07-18    1.839549
2012-07-19    1.864005
2012-07-20    1.833601
2012-07-23    1.832175
2012-07-24    1.823346
2012-07-25    1.744607
2012-07-26    1.744334
2012-07-27    1.775526
Name: Adj Close, dtype: float64

In [5]:
m_returns = ret_index.resample('BM', how='last').pct_change()
m_returns['2012']


d:\Anaconda2\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated
the new syntax is .resample(...).last()
  if __name__ == '__main__':
Out[5]:
Date
2012-01-31    0.127111
2012-02-29    0.188311
2012-03-30    0.105283
2012-04-30   -0.025970
2012-05-31   -0.010702
2012-06-29    0.010853
2012-07-31    0.001986
Freq: BM, Name: Adj Close, dtype: float64

In [6]:
m_rets = (1 + returns).resample('M', kind='period').prod() - 1
m_rets['2012']


Out[6]:
Date
2012-01    0.127111
2012-02    0.188311
2012-03    0.105283
2012-04   -0.025970
2012-05   -0.010702
2012-06    0.010853
2012-07    0.001986
Freq: M, Name: Adj Close, dtype: float64

In [7]:
returns[dividend_dates] += divident_pcts


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-6db9fa5c6dc5> in <module>()
----> 1 returns[dividend_dates] += divident_pcts

NameError: name 'dividend_dates' is not defined

In [8]:
import random; random.seed(0)
import string

N = 1000
def rands(n):
    choices = string.ascii_uppercase
    return ''.join([random.choice(choices) for _ in xrange(n)])

tickers = np.array([rands(5) for _ in xrange(N)])
tickers


Out[8]:
array(['VTKGN', 'KUHMP', 'XNHTQ', 'GXZVX', 'ISXRM', 'CLPXZ', 'MWGUO',
       'ASKVR', 'AMWGI', 'WEOGZ', 'ULCIN', 'YCOSO', 'VOZPP', 'LPKOH',
       'EEPRM', 'CTWYV', 'XYOKS', 'HVWXP', 'YPLRZ', 'XUCPM', 'QVGTD',
       'FUIVC', 'DSBOX', 'NRAQP', 'OKJZA', 'AYEDF', 'UYALC', 'GFQJE',
       'NBCZF', 'JTVXE', 'RZBRV', 'IGPLE', 'MKONI', 'JVGOA', 'TIBHG',
       'YJHJY', 'QQSKK', 'QAFIG', 'QJWOK', 'KSKRB', 'LGENM', 'OTWMI',
       'MVWVE', 'ZQCSZ', 'KRIFS', 'AVNCD', 'QWHZC', 'WKCHL', 'UWDNQ',
       'JWHAB', 'ROYYX', 'BTSRS', 'XQJNF', 'PADIU', 'SIQBE', 'ZHKOH',
       'MGBEN', 'BKIKC', 'XMVZI', 'MSLHT', 'XXQJZ', 'QBCTB', 'AKNLM',
       'PRKJZ', 'GULJB', 'WSXLR', 'DKFBY', 'FDFJO', 'DZZDK', 'RWMXI',
       'MMRFP', 'FIZXV', 'ADGUV', 'PSUBC', 'WBFBA', 'VIEDR', 'ZNXNO',
       'RUTZT', 'XFNPV', 'MUKPW', 'URAEN', 'GBWYH', 'KVBQD', 'HVBAK',
       'MWSRD', 'ZKPKB', 'MDAQQ', 'COJJU', 'MWPMQ', 'IDRQU', 'DXUXW',
       'RVNUE', 'ULTLU', 'BBYMX', 'YROFC', 'VXUSK', 'HCLOX', 'YKCUT',
       'ALRAX', 'ZSCBJ', 'AJAZV', 'BXFFR', 'YDAJA', 'PWECI', 'YDZJM',
       'HYYQE', 'ZCPEX', 'YUIGT', 'HKBDA', 'CBKOT', 'DKQCL', 'JYBKK',
       'SIFHM', 'YUHOR', 'ULKTL', 'GLYDM', 'QMFAS', 'QAHTQ', 'OESMR',
       'TGTHZ', 'DWBGN', 'PKCGH', 'TXPAU', 'HINGX', 'EKHNO', 'QNKQK',
       'UUHJQ', 'ESJPD', 'RJMKM', 'SIQBH', 'TBQAM', 'XANBW', 'RTRAB',
       'QZWSS', 'FTHCL', 'IEKXL', 'LSNDX', 'LUKUK', 'FFYPB', 'KGCEB',
       'QEPPS', 'NHWJL', 'QNYYY', 'YPMSF', 'GBEAR', 'DURZK', 'XLICW',
       'UILIA', 'BJFNE', 'FRTIW', 'GISBY', 'BLSBV', 'ZLDCC', 'TKXLC',
       'LTVBE', 'MDWYI', 'LOHOF', 'HLPNG', 'GDUCT', 'GHTRT', 'NWDQD',
       'TJRSR', 'FVGNR', 'GQHEV', 'OIPAD', 'KZNBT', 'UUOSF', 'TVTJP',
       'QXCVN', 'JLAFQ', 'RMYMI', 'WGPSV', 'UJBAS', 'ZILSR', 'GRHJO',
       'TDAQA', 'BFRBB', 'ZKXFL', 'JEIZT', 'JKGNT', 'RMBXK', 'KADWN',
       'TDIVV', 'GAUEU', 'RECYP', 'QLDPG', 'UTAYA', 'CHDGJ', 'TKHMK',
       'IXOZU', 'OGRLS', 'KMATA', 'RPUHR', 'FNIZZ', 'FOIZY', 'PSRJX',
       'XITAV', 'OYJQI', 'UPZAD', 'BDYYM', 'YVUTE', 'OLYEE', 'RECNU',
       'PTGHL', 'ZSYNO', 'ZEUUV', 'TERYO', 'JYOKP', 'UFANY', 'RQQMT',
       'GXHYY', 'CLTLN', 'USYEY', 'YQYGW', 'UPCAA', 'GTKUQ', 'KWAMV',
       'DSIAM', 'NBOJA', 'ECOBY', 'VYIXZ', 'THRPK', 'HBDDM', 'QTBVB',
       'OTQYI', 'PCOVF', 'GSGGY', 'ZEXOB', 'PQATV', 'BQLGL', 'EIRMO',
       'OVIVC', 'LJLVN', 'ZWDIA', 'TAXFK', 'BIKBT', 'SJVCB', 'JXTRO',
       'UKAUE', 'KJDJE', 'QQALO', 'WMCBW', 'UWGQC', 'VIYMA', 'XQHAJ',
       'EODEX', 'QGWQY', 'MXRBG', 'HEGFW', 'MWDOA', 'YAKUZ', 'AVNAU',
       'CPURJ', 'ALXIG', 'DNNBK', 'RZLLM', 'FKQKP', 'VZXJA', 'PMGBI',
       'UZCWB', 'SAKWK', 'YSPEI', 'KPZHN', 'YIQTQ', 'TFYEP', 'HQHLR',
       'GSJDP', 'ELKBS', 'RUOOE', 'FFNVJ', 'WTSID', 'ZWKWX', 'INISX',
       'ZTHWZ', 'JYNZZ', 'VREAP', 'SYNSQ', 'FQZCR', 'PJUAX', 'VMCLP',
       'GMUXO', 'VCWXE', 'VWWNP', 'FSKAD', 'KXOXY', 'CPINL', 'MCVMQ',
       'MEOEW', 'VDBBK', 'YOGFC', 'DVDWV', 'DOAWO', 'TMRYO', 'WICAF',
       'VIFMY', 'NICOF', 'JJTGY', 'TMWJJ', 'DUKNM', 'RJXLJ', 'KTZWM',
       'HLIGE', 'YMCJK', 'NZZOQ', 'RNMIR', 'CIXFZ', 'ZOBCF', 'ICUJG',
       'BJADP', 'YFTFA', 'XVBEG', 'YJULJ', 'TQHPS', 'VRQPC', 'YSHSQ',
       'RJORF', 'NDCXD', 'XMLIK', 'JOIVG', 'GMYAS', 'AKTLL', 'GMFHQ',
       'PYZNC', 'HNRYE', 'AWUTM', 'RKEKU', 'UYXRN', 'SEYSP', 'LQQXO',
       'FLGXV', 'OFBDL', 'RFRWT', 'LQZXI', 'REOJL', 'LRVMD', 'TTYKM',
       'OXSAF', 'WPWKF', 'AZDQM', 'JNCZM', 'AKTIT', 'TGZAW', 'NDGPH',
       'VFJNI', 'VGCEQ', 'OBZMI', 'SALRZ', 'TXDLA', 'HJIJU', 'EVOIO',
       'EMAWI', 'IZPKU', 'BONWP', 'MNUJO', 'SZSZK', 'PTJGZ', 'JZWFV',
       'ZHRUC', 'VISYA', 'PHCSZ', 'NJLKN', 'KCZZE', 'GLSAV', 'QHWRI',
       'OZBSW', 'SDPUK', 'PGIVM', 'LDJNG', 'VJGIV', 'XYATN', 'DGHKM',
       'YBSWJ', 'GFHDO', 'GAGVK', 'WYGOW', 'PEGZH', 'WUTSU', 'WBENF',
       'NMDCA', 'VCZZT', 'LHKIK', 'SXEGF', 'BWNBL', 'LUTDQ', 'NADRJ',
       'ZNRDM', 'TVFKM', 'LMHVX', 'JQJPS', 'NRTVE', 'FNNVN', 'XUNVM',
       'ILLQB', 'SZLBF', 'CGUAW', 'YEEZJ', 'VAZAP', 'YVIVK', 'MJJPU',
       'STANJ', 'FXFEE', 'RPNPY', 'WXBXA', 'QYNKI', 'XYQSI', 'DZRHZ',
       'PIXCU', 'ECGSP', 'KEYTR', 'VUCUV', 'TMRCT', 'GUQNN', 'BBAUD',
       'DKZXI', 'VCKPZ', 'BKXAP', 'KOSKX', 'YZBVW', 'DYDFY', 'VOHGK',
       'AQBUB', 'AHUVN', 'YCITI', 'DPBJG', 'IMNCI', 'JKMLB', 'FQVND',
       'BEJOR', 'NOJRS', 'KVTXM', 'IUAJZ', 'INGCC', 'LQONC', 'BJYEH',
       'MXYAQ', 'GRTXR', 'WUEBT', 'NZEKH', 'WMXSZ', 'PZELP', 'ZOWQN',
       'KJHFZ', 'NWXYG', 'IQIDT', 'ONSCX', 'MRPPS', 'CMFKN', 'JKTBY',
       'PEOCN', 'RKIRY', 'WKWCB', 'ZTPOI', 'XWMFR', 'SZUCZ', 'WPITP',
       'COAUV', 'SCPKD', 'XYXNW', 'FHXPF', 'DFMHT', 'HCXRZ', 'EWANM',
       'DVHXS', 'WWUTA', 'DFPAD', 'MBIFE', 'IWGQT', 'REJHO', 'ZFOBJ',
       'YXCWS', 'XLKXN', 'TEBLI', 'NIWTJ', 'DSODA', 'QNOKM', 'KCNDR',
       'TEFGP', 'KXONF', 'CYCDF', 'OQLKQ', 'GUQPA', 'ITFQZ', 'LNFAG',
       'MPVHI', 'SRSWC', 'DMPRF', 'DXGAH', 'NQTDN', 'ISJVE', 'ZNLSJ',
       'ALHRN', 'VMEDO', 'GFYDX', 'NYVHM', 'CJYCG', 'BWRPM', 'GPSUE',
       'QRPSN', 'YQQAD', 'PTDQE', 'TVQBH', 'HMUPZ', 'SDZBI', 'QKAHG',
       'UPDWF', 'IWTKN', 'ZSSRZ', 'YHLQG', 'QXHJL', 'KQBUH', 'QLPON',
       'EACKG', 'MMNDM', 'YEAIS', 'WCAIQ', 'XIUDQ', 'GTXLR', 'JWKPZ',
       'OLCYN', 'SRGQC', 'BVPHN', 'ORADC', 'TLFJR', 'LOYKC', 'CSICU',
       'XCQTG', 'VRLEG', 'VESOO', 'ADIQJ', 'GJMPO', 'JLUPZ', 'PHNMW',
       'TWSGH', 'EWXIA', 'MUSRA', 'CSVEV', 'YPOAK', 'MYLAO', 'BZRSS',
       'YKHCA', 'MTTAQ', 'VWUKS', 'SBBIQ', 'JQTUH', 'ZOQQR', 'ERLZS',
       'ZZVPP', 'MJKXQ', 'EALLB', 'FIJQE', 'VMBCY', 'AQERZ', 'XLLHL',
       'YAMXC', 'DVHUH', 'AVILB', 'QVFYQ', 'OFWLB', 'YJHBA', 'BWWMC',
       'DYOUB', 'BUDVY', 'LCSLN', 'XODJW', 'NCNAW', 'GSZXN', 'ISOXG',
       'SDKUJ', 'HJJAD', 'TSQDD', 'MMDZV', 'WERVI', 'ZCUDG', 'EDRGU',
       'UYUZO', 'AIKZK', 'HUXBZ', 'SZQAR', 'FZYWS', 'GYVQE', 'FOPKV',
       'RGAPI', 'XGOFZ', 'QTXLO', 'LQIVJ', 'UAJMX', 'STQXS', 'QXTAW',
       'ETKKE', 'LZVTQ', 'FBYXA', 'XTCEE', 'GXKOL', 'MGIGH', 'PAYNN',
       'KTTSZ', 'KCUSA', 'MVYJM', 'LTSME', 'PAJIB', 'CULDY', 'ILSEU',
       'VMSSZ', 'UJNKN', 'XCXND', 'YFAMO', 'BQOOC', 'JDMJI', 'WQCRZ',
       'JURMK', 'FKGMR', 'XDVTQ', 'EBDIH', 'VIEZS', 'UMCPL', 'ICIHJ',
       'SDJTI', 'WWEQQ', 'EOMGS', 'XXCJC', 'MRSBC', 'QVPCC', 'PFTHV',
       'XNSTQ', 'QKXEE', 'SFNXJ', 'TWRCN', 'UZLBJ', 'MYBXL', 'CTDDG',
       'ORWPQ', 'MNRHH', 'QQEFO', 'VIEBN', 'NPORW', 'IUFIM', 'NTATU',
       'AOADW', 'BXRTR', 'TTXJJ', 'QNRJK', 'KBTOX', 'TKUBQ', 'YXIHH',
       'XIKIG', 'WLNKI', 'KXHSF', 'XMHLT', 'WVDZM', 'YEYFW', 'HVEWR',
       'DYLEV', 'BATCT', 'CYDOQ', 'JCMIX', 'FFPLH', 'DVCXY', 'DYGUI',
       'LSOTK', 'BIXUY', 'PIMMG', 'WBIZO', 'YAVQW', 'TZITV', 'SUVHH',
       'KAXVD', 'VIPML', 'PXKAW', 'YUEKT', 'WWYQD', 'KYDYJ', 'PVCCM',
       'XZREU', 'JGPLN', 'ZAWLV', 'WTMNP', 'KSWIY', 'OHESH', 'VYJJH',
       'GZVWA', 'YVVYK', 'BONFT', 'ZSUUV', 'EPPWL', 'GNMAB', 'EMRNO',
       'ZCJOU', 'WQRXU', 'PAKBZ', 'VICOJ', 'SVPVA', 'GLMVE', 'ONQAB',
       'CKPTQ', 'CWKVE', 'JRQNY', 'VPRKN', 'QVFLE', 'FADTI', 'HDOKB',
       'JUTZW', 'MUUKK', 'OLQVX', 'QNFKF', 'SODEA', 'CQQNU', 'OGTJB',
       'FLPUW', 'UTPFR', 'SGJHZ', 'SJFIG', 'VEJNG', 'EYXAN', 'BLCUF',
       'HCZNK', 'OEUHW', 'THMHY', 'WORCU', 'JGIXC', 'ZMQNB', 'TKMVI',
       'DBRBP', 'BCKHC', 'YYZZX', 'OKTNF', 'UEQYN', 'DJNLD', 'PWZER',
       'ADNPG', 'TXZCR', 'NSYHW', 'CBYGS', 'FPIST', 'XULDR', 'LSZIL',
       'IIGJJ', 'JYJAZ', 'PIUAW', 'DADVB', 'XHFRG', 'OTRIQ', 'QALQJ',
       'EXAWE', 'ZXCTR', 'WMIUT', 'NZUMY', 'NVBDF', 'GDBOP', 'SPLLA',
       'QQQZS', 'FPORP', 'TLOYG', 'RTVOZ', 'ZNLCP', 'IRSWT', 'VVZIP',
       'OORYA', 'IMNXM', 'GWNUG', 'YKLMI', 'TOPPH', 'ICKGJ', 'QRTFE',
       'ZMMCR', 'EBGZI', 'BREHM', 'OHYTQ', 'BVVVV', 'EXHGA', 'EJGWB',
       'LJWVI', 'RLGSM', 'STOGD', 'ALRVH', 'BMIIB', 'NLSRJ', 'BZFTO',
       'ATZDS', 'OOLLE', 'JRWTQ', 'FAWTY', 'DZIOA', 'UYYED', 'OKAHU',
       'TGXJU', 'IZRJB', 'EYOUF', 'NPYNY', 'IPQCE', 'GGEKC', 'DWELC',
       'UGRVK', 'FELPR', 'PGADL', 'ZOZVZ', 'HRLWP', 'KYVML', 'KKIEV',
       'DQEWF', 'DAXUI', 'WNFOA', 'SHJWQ', 'YFAWP', 'DGYPO', 'UXKVW',
       'YMXVM', 'SDTKV', 'IUHMK', 'ZGVVY', 'SMYAX', 'TFHWC', 'HDFDJ',
       'WPECZ', 'GHEHY', 'JKIPN', 'GCOOB', 'ILMIR', 'UDKRP', 'WWOXU',
       'DAKJA', 'VNZVV', 'KYSCO', 'FQKBX', 'XQFKS', 'DFCYT', 'DGRZF',
       'WLWAN', 'KUYCT', 'JWWZN', 'MFBXC', 'LCAIC', 'HZGUU', 'BKDID',
       'DSBMO', 'LGQCE', 'HLFQG', 'MURPV', 'KLKDP', 'MUPIW', 'HHWZF',
       'FPAVL', 'TAUOA', 'BKQLQ', 'XJKUB', 'IBQRR', 'QTAQQ', 'VTAPK',
       'HCDEG', 'MPGFN', 'MBFKY', 'LGWZE', 'WMGVO', 'OSKST', 'VBHPR',
       'PUIQN', 'VHNGY', 'ZHWLH', 'JTZVV', 'HFGYE', 'FUWGN', 'JWPMR',
       'ZQVVG', 'KFPUK', 'ILSBY', 'ROACD', 'QOEWI', 'DHTMQ', 'HQGAS',
       'LHNJU', 'ZQBRA', 'KCWAR', 'MNGJL', 'LMVQW', 'NNQST', 'OKHTB',
       'YZXXY', 'PVELA', 'JLESE', 'ETXYW', 'FPNBF', 'OWTVL', 'YPHIJ',
       'DQNVC', 'DIFGJ', 'JNTNX', 'BRRYO', 'SLBCL', 'QJEWY', 'IHDZO',
       'OIUER', 'RYVLS', 'NDOSY', 'OGNSH', 'DFHFH', 'BLRAE', 'CKWGK',
       'JECFB', 'KTHZN', 'TOOUU', 'FEEGC', 'GKQAP', 'SXROH', 'JPUJR',
       'JQBCR', 'WITUB', 'RLFFV', 'RKMEZ', 'NBKWI', 'TCTPL', 'FMUBG',
       'HHRYP', 'RMMSR', 'JMBIT', 'ZMLDR', 'XBQFD', 'RHCSW', 'PTRNL',
       'OHAQX', 'JLSAG', 'UQBJP', 'DYEPB', 'GDTZX', 'FQXRB', 'LIQBR',
       'BBFWT', 'GAGYO', 'CSQWZ', 'WRWQF', 'NHGEB', 'HWNNC', 'YDZEB',
       'YAHRO', 'TITBA', 'GVCTY', 'ZCGBT', 'LGXPZ', 'RCDDJ', 'UXBKY',
       'UHXDI', 'FLNBE', 'QVCYN', 'UBJMO', 'ZNXZX', 'JWISS', 'PXUVL',
       'XSIKG', 'WJJKO', 'HVRUB', 'JFFIW', 'JBWUO', 'BDJKH', 'TZLEL',
       'DMKZJ', 'DYSSI', 'FSHPC', 'LQOQF', 'LBBFQ', 'UPJAS', 'WAQIK',
       'TLOSR', 'MNQAA', 'MSYNR', 'XCDMO', 'HKWNO', 'YPMEE', 'NBNWK',
       'VTVIP', 'QCERS', 'BMMLT', 'ZAYTJ', 'GPNYZ', 'UWRUN', 'SLXXZ',
       'GFQJK', 'URWVM', 'CKUJV', 'KVTRA', 'YJCAW', 'KPZYQ', 'TQKDF',
       'HFYFG', 'SZQHV', 'EQMTM', 'QAVSF', 'YZQVZ', 'HEIZH', 'LWELG',
       'KYLBX', 'WIBMQ', 'LBCTN', 'QHLIR', 'LCRZK', 'AOQJX', 'YMNLR',
       'BHUFN', 'FCKOG', 'ILSDP', 'PZPKM', 'PNRHG', 'ZYTZZ'], 
      dtype='|S5')

In [9]:
M = 500
df = DataFrame({'Momentum' : np.random.randn(M) / 200 + 0.03,
               'Value' : np.random.randn(M) / 200 + 0.08,
               'ShortInterest' : np.random.randn(M) / 200 - 0.02},
              index=tickers[:M])
df


Out[9]:
Momentum ShortInterest Value
VTKGN 0.030252 -0.025851 0.075716
KUHMP 0.031333 -0.017262 0.085313
XNHTQ 0.027676 -0.017474 0.083883
GXZVX 0.030265 -0.020773 0.079650
ISXRM 0.036161 -0.015241 0.083956
CLPXZ 0.032481 -0.019028 0.078684
MWGUO 0.028266 -0.014960 0.081872
ASKVR 0.033440 -0.008907 0.080576
AMWGI 0.032228 -0.022306 0.077167
WEOGZ 0.034249 -0.023833 0.087438
ULCIN 0.025134 -0.015823 0.080886
YCOSO 0.027479 -0.020673 0.075566
VOZPP 0.025669 -0.017753 0.081783
LPKOH 0.029138 -0.006139 0.083078
EEPRM 0.031389 -0.016175 0.085135
CTWYV 0.025670 -0.020667 0.081187
XYOKS 0.030987 -0.025458 0.084345
HVWXP 0.035643 -0.014323 0.072319
YPLRZ 0.025641 -0.018447 0.080820
XUCPM 0.027221 -0.017073 0.077149
QVGTD 0.031566 -0.024028 0.081726
FUIVC 0.026940 -0.019562 0.078920
DSBOX 0.039175 -0.022375 0.079014
NRAQP 0.031716 -0.021236 0.083630
OKJZA 0.030887 -0.017173 0.078517
AYEDF 0.026342 -0.030592 0.084596
UYALC 0.030822 -0.016250 0.071053
GFQJE 0.036657 -0.023250 0.079520
NBCZF 0.031226 -0.009648 0.076089
JTVXE 0.030719 -0.020086 0.082302
... ... ... ...
XLKXN 0.030181 -0.013193 0.077280
TEBLI 0.028751 -0.016291 0.080258
NIWTJ 0.036973 -0.008758 0.083749
DSODA 0.025856 -0.017643 0.075864
QNOKM 0.022408 -0.021946 0.087074
KCNDR 0.025966 -0.021605 0.080606
TEFGP 0.032741 -0.015082 0.078500
KXONF 0.020755 -0.024018 0.080387
CYCDF 0.030880 -0.027784 0.078861
OQLKQ 0.038904 -0.014623 0.079959
GUQPA 0.029281 -0.020786 0.075783
ITFQZ 0.038002 -0.021833 0.083662
LNFAG 0.026082 -0.018043 0.079464
MPVHI 0.031550 -0.023186 0.084630
SRSWC 0.021458 -0.020191 0.084772
DMPRF 0.025948 -0.014970 0.072990
DXGAH 0.025413 -0.012860 0.086883
NQTDN 0.033960 -0.018133 0.093732
ISJVE 0.031832 -0.012529 0.080678
ZNLSJ 0.030736 -0.018967 0.076438
ALHRN 0.033201 -0.023111 0.084055
VMEDO 0.032841 -0.025482 0.088921
GFYDX 0.021091 -0.023345 0.079363
NYVHM 0.029487 -0.012628 0.079830
CJYCG 0.034474 -0.014043 0.086287
BWRPM 0.034207 -0.015778 0.085739
GPSUE 0.027940 -0.023192 0.075925
QRPSN 0.040732 -0.023159 0.079225
YQQAD 0.027756 -0.014938 0.074428
PTDQE 0.030271 -0.014142 0.076989

500 rows × 3 columns


In [10]:
ind_names = np.array(['FINANCIAL', 'TECH'])
sampler = np.random.randint(0, len(ind_names), N)
industries = Series(ind_names[sampler], index=tickers,
                   name='industry')
industries


Out[10]:
VTKGN    FINANCIAL
KUHMP         TECH
XNHTQ         TECH
GXZVX    FINANCIAL
ISXRM    FINANCIAL
CLPXZ         TECH
MWGUO    FINANCIAL
ASKVR    FINANCIAL
AMWGI    FINANCIAL
WEOGZ         TECH
ULCIN    FINANCIAL
YCOSO    FINANCIAL
VOZPP         TECH
LPKOH    FINANCIAL
EEPRM    FINANCIAL
CTWYV    FINANCIAL
XYOKS         TECH
HVWXP         TECH
YPLRZ         TECH
XUCPM    FINANCIAL
QVGTD    FINANCIAL
FUIVC         TECH
DSBOX    FINANCIAL
NRAQP         TECH
OKJZA    FINANCIAL
AYEDF    FINANCIAL
UYALC    FINANCIAL
GFQJE    FINANCIAL
NBCZF    FINANCIAL
JTVXE    FINANCIAL
           ...    
GPNYZ    FINANCIAL
UWRUN         TECH
SLXXZ    FINANCIAL
GFQJK         TECH
URWVM    FINANCIAL
CKUJV    FINANCIAL
KVTRA    FINANCIAL
YJCAW    FINANCIAL
KPZYQ         TECH
TQKDF    FINANCIAL
HFYFG         TECH
SZQHV         TECH
EQMTM         TECH
QAVSF    FINANCIAL
YZQVZ         TECH
HEIZH    FINANCIAL
LWELG    FINANCIAL
KYLBX    FINANCIAL
WIBMQ    FINANCIAL
LBCTN    FINANCIAL
QHLIR         TECH
LCRZK         TECH
AOQJX         TECH
YMNLR         TECH
BHUFN         TECH
FCKOG         TECH
ILSDP         TECH
PZPKM         TECH
PNRHG         TECH
ZYTZZ         TECH
Name: industry, dtype: object

In [11]:
by_industry = df.groupby(industries)
by_industry.mean()


Out[11]:
Momentum ShortInterest Value
industry
FINANCIAL 0.029660 -0.020095 0.080189
TECH 0.030656 -0.019972 0.080060

In [12]:
by_industry.describe()


Out[12]:
Momentum ShortInterest Value
industry
FINANCIAL count 262.000000 262.000000 262.000000
mean 0.029660 -0.020095 0.080189
std 0.004935 0.005034 0.004703
min 0.016757 -0.034119 0.066672
25% 0.026025 -0.023757 0.076614
50% 0.029988 -0.020023 0.079995
75% 0.033145 -0.016392 0.083264
max 0.044473 -0.006139 0.093067
TECH count 238.000000 238.000000 238.000000
mean 0.030656 -0.019972 0.080060
std 0.004897 0.004376 0.005344
min 0.017818 -0.031703 0.066739
25% 0.027261 -0.022793 0.076167
50% 0.030853 -0.019613 0.080068
75% 0.033798 -0.016988 0.083654
max 0.044828 -0.005150 0.093732

In [13]:
# 行业内标准化处理
def zscore(group):
    return (group - group.mean()) / group.std()

df_stand = by_industry.apply(zscore)
df_stand


Out[13]:
Momentum ShortInterest Value
VTKGN 0.120056 -1.143412 -0.950911
KUHMP 0.138146 0.619380 0.982968
XNHTQ -0.608514 0.570912 0.715397
GXZVX 0.122692 -0.134728 -0.114601
ISXRM 1.317274 0.964277 0.800923
CLPXZ 0.372747 0.215738 -0.257491
MWGUO -0.282479 1.020203 0.357895
ASKVR 0.765944 2.222817 0.082260
AMWGI 0.520287 -0.439277 -0.642486
WEOGZ 0.733650 -0.882084 1.380600
ULCIN -0.917058 0.848710 0.148197
YCOSO -0.441930 -0.114816 -0.982770
VOZPP -1.018402 0.507193 0.322433
LPKOH -0.105700 2.772688 0.614341
EEPRM 0.350428 0.778776 1.051742
CTWYV -0.808475 -0.113554 0.212161
XYOKS 0.067619 -1.253397 0.801867
HVWXP 1.018411 1.290930 -1.448644
YPLRZ -1.024011 0.348612 0.142201
XUCPM -0.494176 0.600444 -0.646213
QVGTD 0.386327 -0.781352 0.326886
FUIVC -0.758820 0.093726 -0.213345
DSBOX 1.928003 -0.453007 -0.249678
NRAQP 0.216377 -0.288853 0.668074
OKJZA 0.248712 0.580601 -0.355384
AYEDF -0.672178 -2.085311 0.937057
UYALC 0.235412 0.763846 -1.942416
GFQJE 1.417710 -0.626809 -0.142220
NBCZF 0.317282 2.075467 -0.871698
JTVXE 0.214624 0.001859 0.449397
... ... ... ...
XLKXN -0.096922 1.548996 -0.520194
TEBLI -0.184151 0.755670 0.014791
NIWTJ 1.481863 2.252381 0.757041
DSODA -0.770793 0.487165 -0.919574
QNOKM -1.469301 -0.367664 1.463853
KCNDR -0.957813 -0.373020 0.102236
TEFGP 0.425790 1.117564 -0.291852
KXONF -2.021788 -0.924548 0.061235
CYCDF 0.045727 -1.785007 -0.224457
OQLKQ 1.873053 1.087082 -0.048872
GUQPA -0.076776 -0.137167 -0.936668
ITFQZ 1.500148 -0.425183 0.674084
LNFAG -0.724909 0.407607 -0.154079
MPVHI 0.182625 -0.734239 0.855164
SRSWC -1.661823 -0.018951 0.974549
DMPRF -0.961461 1.143013 -1.323067
DXGAH -0.860379 1.437418 1.423222
NQTDN 0.674713 0.420277 2.558422
ISJVE 0.440176 1.503117 0.104036
ZNLSJ 0.217992 0.224137 -0.797524
ALHRN 0.519616 -0.717291 0.747594
VMEDO 0.644644 -1.070227 1.856518
GFYDX -1.736091 -0.645715 -0.175542
NYVHM -0.035009 1.483522 -0.076189
CJYCG 0.779708 1.354868 1.165329
BWRPM 0.725102 0.958414 1.062689
GPSUE -0.554705 -0.735788 -0.773824
QRPSN 2.243554 -0.608701 -0.205007
YQQAD -0.385733 1.024530 -1.224714
PTDQE 0.123915 1.182791 -0.680229

500 rows × 3 columns


In [14]:
df_stand.groupby(industries).agg(['mean', 'std'])


Out[14]:
Momentum ShortInterest Value
mean std mean std mean std
industry
FINANCIAL 4.176579e-15 1.0 -3.551019e-15 1.0 -1.025770e-14 1.0
TECH 1.178796e-15 1.0 -1.426497e-15 1.0 -5.014663e-15 1.0

In [15]:
# 行业内降序排名
ind_rank = by_industry.rank(ascending=False)
ind_rank.groupby(industries).agg(['min', 'max'])


Out[15]:
Momentum ShortInterest Value
min max min max min max
industry
FINANCIAL 1.0 262.0 1.0 262.0 1.0 262.0
TECH 1.0 238.0 1.0 238.0 1.0 238.0

In [16]:
df_stand.describe()


Out[16]:
Momentum ShortInterest Value
count 5.000000e+02 5.000000e+02 5.000000e+02
mean 2.747635e-15 -2.535749e-15 -7.764234e-15
std 9.989975e-01 9.989975e-01 9.989975e-01
min -2.621634e+00 -2.786147e+00 -2.873896e+00
25% -7.146378e-01 -6.749722e-01 -7.312422e-01
50% 4.243021e-02 4.982901e-02 -1.705014e-02
75% 6.514487e-01 6.874139e-01 6.627268e-01
max 3.001393e+00 3.386921e+00 2.738095e+00

In [17]:
# 行业内排名和标准化
by_industry.apply(lambda x: zscore(x.rank()))


Out[17]:
Momentum ShortInterest Value
VTKGN 0.059385 -1.260275 -1.088720
KUHMP 0.283229 0.791589 1.198277
XNHTQ -0.806113 0.660868 0.922310
GXZVX 0.072581 -0.244137 -0.164958
ISXRM 1.405438 1.115113 1.022737
CLPXZ 0.588245 0.239655 -0.370376
MWGUO -0.257334 1.181096 0.481676
ASKVR 0.917164 1.695763 0.151761
AMWGI 0.574052 -0.613642 -0.785198
WEOGZ 1.009457 -1.053031 1.445194
ULCIN -1.128309 1.009540 0.217744
YCOSO -0.508069 -0.204547 -1.128309
VOZPP -1.198277 0.588245 0.370376
LPKOH -0.138564 1.722156 0.811591
EEPRM 0.402496 0.930360 1.233882
CTWYV -1.049130 -0.191351 0.323317
XYOKS 0.079885 -1.270900 1.023982
HVWXP 1.183752 1.430670 -1.459719
YPLRZ -1.212801 0.370376 0.181557
XUCPM -0.534462 0.745608 -0.798394
QVGTD 0.455283 -0.930360 0.442086
FUIVC -0.965884 0.036311 -0.297754
DSBOX 1.669370 -0.626839 -0.481676
NRAQP 0.355852 -0.472048 0.849687
OKJZA 0.270530 0.719215 -0.560856
AYEDF -0.772001 -1.669370 1.128309
UYALC 0.244137 0.903967 -1.656173
GFQJE 1.445028 -0.798394 -0.230941
NBCZF 0.362907 1.669370 -1.022737
JTVXE 0.204547 -0.019795 0.613642
... ... ... ...
XLKXN -0.225131 1.532342 -0.675392
TEBLI -0.178154 0.877574 0.072581
NIWTJ 1.458224 1.708960 0.983147
DSODA -0.956754 0.692822 -1.062326
QNOKM -1.471421 -0.521266 1.511011
KCNDR -1.111129 -0.573720 0.152508
TEFGP 0.617294 1.328998 -0.457524
KXONF -1.677587 -1.096605 0.065361
CYCDF 0.036311 -1.575916 -0.326803
OQLKQ 1.616584 1.233882 -0.019795
GUQPA -0.112171 -0.257334 -1.075523
ITFQZ 1.474244 -0.660868 0.864212
LNFAG -0.851181 0.547659 -0.257334
MPVHI 0.326803 -0.922310 1.082080
SRSWC -1.590190 -0.032992 1.181096
DMPRF -1.140179 1.358047 -1.343522
DXGAH -1.075523 1.471421 1.458224
NQTDN 0.951359 0.472048 1.721161
ISJVE 0.521266 1.524207 0.164958
ZNLSJ 0.217744 0.310120 -0.890771
ALHRN 0.748015 -0.907785 0.951359
VMEDO 0.811591 -1.194292 1.563797
GFYDX -1.616584 -0.824788 -0.283727
NYVHM -0.072581 1.511011 -0.072581
CJYCG 1.082080 1.488768 1.299949
BWRPM 0.994933 1.241850 1.241850
GPSUE -0.718966 -0.936835 -0.965884
QRPSN 1.708960 -0.745608 -0.362907
YQQAD -0.442086 1.194292 -1.365848
PTDQE 0.085778 1.326258 -0.824788

500 rows × 3 columns


In [21]:
ind_rank['Momentum'].max()


Out[21]:
262.0