0

我在 Equity Research 工作,几周前刚开始将我的市场量化模型从 Excel 转换为 Python 代码。我的主要目标是创建一个多因子模型的回测器,然后将其演变为主动量化投资组合算法。

所以,想问一下 - 我怎样才能一次命名所有切片周期?另外,我需要将每个子样本分成 31 个不同的时期,其中 5 个时期是浮动的,应该从网上上传。有没有办法从公司的网站或其他方式解析它?

现在的代码是这样的,数据集还不是很大,但稍后会添加其他部分 -

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df=pd.read_csv(r'path.csv')
print(df.tail(3))

x=df[['Date','Open','High','Low','Close']]
print(x[0:253])
x[1:254]
x[2:255]
x[3:256]
x[4:257]
x[5:258]
x[6:259]
x[7:260]
x[8:261]
x[9:262]
x[10:263]
x[11:264]
x[12:265]
x[13:266]
x[14:267]
x[15:268]
x[16:269]
x[17:270]
x[18:271]
x[19:272]
x[20:273]
x[21:274]
x[22:275]
x[23:276]
x[24:277]
x[25:278]
x[26:279]
x[27:280]
x[28:281]
x[29:282]
x[30:283]
x[31:284]
x[32:285]
x[33:286]
x[34:287]
x[35:288]
x[36:289]
x[37:290]
x[38:291]
x[39:292]
x[40:293]
x[41:294]
x[42:295]
x[43:296]
x[44:297]
x[45:298]
x[46:299]
x[47:300]
x[48:301]
x[49:302]
x[50:303]
x[51:304]
x[52:305]
x[53:306]
x[54:307]
x[55:308]
x[56:309]
x[57:310]
x[58:311]
x[59:312]
x[60:313]
x[61:314]
x[62:315]
x[63:316]
x[64:317]
x[65:318]
x[66:319]
x[67:320]
x[68:321]
x[69:322]
x[70:323]
x[71:324]
x[72:325]
x[73:326]
x[74:327]
x[75:328]
x[76:329]
x[77:330]
x[78:331]
x[79:332]
x[80:333]
x[81:334]
x[82:335]
x[83:336]
x[84:337]
x[85:338]
x[86:339]
x[87:340]
x[88:341]
x[89:342]
x[90:343]
x[91:344]
x[92:345]
x[93:346]
x[94:347]
x[95:348]
x[96:349]
x[97:350]
x[98:351]
x[99:352]
x[100:353]
x[101:354]
x[102:355]
x[103:356]
x[104:357]
x[105:358]
x[106:359]
x[107:360]
x[108:361]
x[109:362]
x[110:363]
x[111:364]
x[112:365]
x[113:366]
x[114:367]
x[115:368]
x[116:369]
x[117:370]
x[118:371]
x[119:372]
x[120:373]
x[121:374]
x[122:375]
x[123:376]
x[124:377]
x[125:378]
x[126:379]
x[127:380]
x[128:381]
x[129:382]
x[130:383]
x[131:384]
x[132:385]
x[133:386]
x[134:387]
x[135:388]
x[136:389]
x[137:390]
x[138:391]
x[139:392]
x[140:393]
x[141:394]
x[142:395]
x[143:396]
x[144:397]
x[145:398]
x[146:399]
x[147:400]
x[148:401]
x[149:402]
x[150:403]
x[151:404]
x[152:405]
x[153:406]
x[154:407]
x[155:408]
x[156:409]
x[157:410]
x[158:411]
x[159:412]
x[160:413]
x[161:414]
x[162:415]
x[163:416]
x[164:417]
x[165:418]
x[166:419]
x[167:420]
x[168:421]
x[169:422]
x[170:423]
x[171:424]
x[172:425]
x[173:426]
x[174:427]
x[175:428]
x[176:429]
x[177:430]
x[178:431]
x[179:432]
x[180:433]
x[181:434]
x[182:435]
x[183:436]
x[184:437]
x[185:438]
x[186:439]
x[187:440]
x[188:441]
x[189:442]
x[190:443]
x[191:444]
x[192:445]
x[193:446]
x[194:447]
x[195:448]
x[196:449]
x[197:450]
x[198:451]
x[199:452]
x[200:453]
x[201:454]
x[202:455]
x[203:456]
x[204:457]
x[205:458]
x[206:459]
x[207:460]
x[208:461]
x[209:462]
x[210:463]
x[211:464]
x[212:465]
x[213:466]
x[214:467]
x[215:468]
x[216:469]
x[217:470]
x[218:471]
x[219:472]
x[220:473]
x[221:474]
x[222:475]
x[223:476]
x[224:477]
x[225:478]
x[226:479]
x[227:480]
x[228:481]
x[229:482]
x[230:483]
x[231:484]
x[232:485]
x[233:486]
x[234:487]
x[235:488]
x[236:489]
x[237:490]
x[238:491]
x[239:492]
x[240:493]
x[241:494]
x[242:495]
x[243:496]
x[244:497]
x[245:498]
x[246:499]
x[247:500]
x[248:501]
x[249:502]
x[250:503]
x[251:504]
4

1 回答 1

0

“-如何一次命名所有切片周期?”

这有一个技巧,不仅是命名,而且还允许在域中进行矢量化(高效和高性能)处理算法,[TIME]而不会浪费任何额外的[SPACE]域存储,这不是一个容易同时解决的问题. 如果您的数千个数据点没有遭受这种双重麻烦,相信我,一旦您的数据集足迹增长到超过几个 [GB]-s,您就会。

为此,存储高效的跨步技巧(智能间接地址映射)是最好的方法。

>>> import numpy as np
>>> x = np.arange( 504 )
>>> rolling_window( x, 254 )
array( [ [  0,   1,   2, ..., 251, 252, 253],     # [] ~~ "slice" 0:254
         [  1,   2,   3, ..., 252, 253, 254],     # [] ~~ "slice" 1:255
         [  2,   3,   4, ..., 253, 254, 255],     # etc
         ...,
         [248, 249, 250, ..., 499, 500, 501],
         [249, 250, 251, ..., 500, 501, 502],
         [250, 251, 252, ..., 501, 502, 503]
         ]
       )

你收到什么?

一次处理所有这些(仅限跨步)“切片”周期的机会,例如:

from QuantFX import rolling_window

x_strided       = rolling_window( x, 254 )

aVectorOfMEANs  = x_strided.mean(  axis = 0 )
aVectorOfStDEVs = x_strided.stdev( axis = 0 )

并且您可以一次自由地处理所有“切片”周期,而无需两次存储任何重新排列的数据。这就是从一开始就专业地使用跨步技巧的力量,作为您要设计的量化建模的主要特征。

>>> rolling_window( x, 254 ).std( axis = 0 )  ### aVectorOfStDEVs - Zero add-on storage for whatever size of x
array( [ 72.45688373, 72.45688373, 72.45688373, 72.45688373, 72.45688373,
         72.45688373, 72.45688373, 72.45688373, 72.45688373, 72.45688373,
         72.45688373, 72.45688373, 72.45688373, 72.45688373, 72.45688373,
         ...
         ]
       )

>>> rolling_window( x, 254 ).mean( axis = 0 ) ### aVectorOfMEANs - Zero add-on storage for whatever size of x
array( [ 125., 126., 127., 128., 129., 130., 131., 132., 133., 134., 135.,
         136., 137., 138., 139., 140., 141., 142., 143., 144., 145., 146.,
         ...
         378.
         ]
       )

使用的 QuantFX 示例:

def rolling_window( aMatrix, aRollingWindowLENGTH ):                    #                                                               # http://www.rigtorp.se/2011/01/01/rolling-statistics-numpy.html
            """                                                                 __doc__
            USAGE:   rolling_window( aMatrix, aRollingWindowLENGTH )

            PARAMS:  aMatrix                a numpy array
                     aRollingWindowLENGTH   a LENGTH of a Rolling Window

            RETURNS: a stride_trick'ed numpy array with rolling windows

            THROWS:  n/a

            EXAMPLE: >>> x = np.arange( 10 ).reshape( ( 2, 5 ) )

                     >>> rolling_window( x, 3 )
                     array([[[0, 1, 2], [1, 2, 3], [2, 3, 4]],
                            [[5, 6, 7], [6, 7, 8], [7, 8, 9]]])

                     >>> np.mean( rolling_window( x, 3 ), -1 )
                     array([[ 1.,  2.,  3.],
                            [ 6.,  7.,  8.]])
            """
            new_shape   = aMatrix.shape[:-1] + ( aMatrix.shape[-1] - aRollingWindowLENGTH + 1, aRollingWindowLENGTH )
            new_strides = aMatrix.strides    + ( aMatrix.strides[-1], )
            return np.lib.stride_tricks.as_strided( aMatrix,
                                                    shape   = new_shape,
                                                    strides = new_strides
                                                    )
于 2020-05-12T20:53:31.627 回答