<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 量化分析師的Python日記【第12天:量化入門進階之葵花寶典:因子如何產生和回測】 > 來源:https://uqer.io/community/share/5538c7d4f9f06c3c92306684 ## 0 預備知識 預備知識包括:數學,計算機,投資學 數學方面至少包括微積分,線性代數,優化理論,概率統計基礎,線性回歸等知識點。數學出生最佳,一般理工科都基本滿足要求,即使有所欠缺,花點時間也就自學補上了 計算機主要有兩點:一是會編程;二是會數據分析,相信在量化實驗室看到截止今天日記的同學都已經滿足了 投資學方面只要通過大學的《投資學》課程就好,像William Sharpe等3人合著的《投資學》,要是能夠通過CFA那就最好,知識面更廣 ## 1 入門階段 Barra USE3 handbook Barra是量化投資技術提供商,是量化投資先驅。其經典的美國股票風險模型第3版(USE3)手冊,詳細介紹了股票市場多因子模型的理論框架和實證細節。手冊共幾十頁,不太長,描述規范清晰,不陷入無意義的細節,非常適合于入門, 點此下載 ## 2 系統學習階段 系統學習1:Quantitative Equity Portfolio Management(QEPM), Ludwig Chincarini 偏學術風格。 偏學術界的作者撰寫的關于量化股票組合投資的系統教程。尤其是前幾章概述部分寫得非常精彩、易懂、準確。把該領域的各個方面高屋建瓴地串講了一遍。后面部分的章節似乎略有些學術了,但也值得一讀。由于其較高的可讀性,適于初學者學習。 系統學習2:Active Portfolio Management(APM), Grinold & Kahn 偏業界風格。 業界先驅所著,作者均曾任Barra公司的研究總監。本書深度相對較深,描述也偏實踐,介紹了許多深刻的真知。并且書中很多論述精彩而透徹。該書被奉為量化組合投資業界圣經。不過該書有些章節撰寫得深度不一,初學者容易感到閱讀起來有點困難。所以推薦:首次閱讀不必糾結看不懂的細節,只要不影響后續閱讀就跳過具體細節;有一定基礎后,建議經常反復閱讀本書。 系統學習3:Quantitative Equity Portfolio Management(QEPM), Qian & Hua & Sorensen APM的補充 業界人士所著。針對性地對APM沒有展開講的一些topic做了很好的深入探討。建議在APM之后閱讀。該書風格比較數學,不過對數學專業背景的人并不太難。撰寫文字也比較流暢。 注:修行上述3本葵花寶典是否要割舍些什么?主要是與親友坐在一起聊天喝茶的時光、一些睡覺的時間以及購書需要上千元錢(建議讀英文原著);好消息是,練成之后,不僅錢可以賺回來,空閑時間也會多起來。 ## 3 實踐階段 券商賣方金工研究報告:多因子模型、選股策略、擇時策略 系統學習上面的材料之后,你已經有了分辨能力,這是看數量眾多的券商賣方金工研究報告,就可以庖丁解牛,分辨真偽,總能篩選出優質信息積累下來了。 值得總結的是數學、計算機、分析框架等工具都只是量化投資的形,優質投資想法才是靈魂。所以在修煉上述量化投資的基本功的同時,請不要忘記向有洞察力、有獨立思考的其它派系的投資專家學習,無論他/她是價值投資、成長投資、漲停板敢死隊、技術分析、主題投資、逆向投資、各類套利。將你自己想出的或者從別人那里習得的投資想法,用量化框架驗證、改進、去偽存真,并最終上實盤創造價值。 最推薦的入行過程:學習上述材料的同時,在通聯量化實驗室利用海量數據編程實現,理論付諸實踐! ## 4 實戰操作示例 在關于`pandas`的前兩篇介紹中,我們已經接觸了不少關于`Series`和`DataFrame`的操作以及函數。本篇將以實際的例子來介紹`pandas`在處理實際金融數據時的應用。 因子選股是股票投資中最常用的一種分析手段,利用量化計算的因子從成百上千的股票中進行快速篩選,幫助投資者從海量的數據中快速確定符合要求的目標,以下我們以量化因子計算過程的實例來展示如何利用pandas處理數據。 首先,我們依然是導入需要的一些外部模塊: ```py import numpy as np import pandas as pd import datetime as dt from pandas import Series, DataFrame, isnull from datetime import timedelta, datetime from CAL.PyCAL import * pd.set_option('display.width', 200) ``` 接著我們定義股票池和計算時所需要的時間區間參數。通常而言,計算某個因子是基于全A股的,這里作為示例,以HS300作為股票池。以計算市凈率(PB)為例,我們取近一年的數據: ```py universe = set_universe('HS300') today = Date.todaysDate() start_date = (today - Period('1Y')).toDateTime().strftime('%Y%m%d') end_date = today.toDateTime().strftime('%Y%m%d') print 'start_date' print start_date print 'end_date' print end_date start_date 20150714 end_date 20160714 ``` 市凈率是每股市價(Price)和每股凈資產(Book Value)的比值,計算時通常使用總市值和歸屬于母公司所有者權益合計之比得到。前者通過訪問股票日行情數據可以獲得,后者在資產負債表上能夠查到。在量化實驗室中提供了訪問股票日行情和資產負債表的API,可以獲得相應數據。需要注意的一點是在獲取財務報表數據時,因為只能指定一種類型的財報(季報,半年報,年報),需要做一個循環查詢,并將獲取到的`DataFrame`數據按垂直方向拼接,這里使用了`concat`函數: ```py market_capital = DataAPI.MktEqudGet(secID=universe, field=['secID', 'tradeDate', 'marketValue', 'negMarketValue'], beginDate=start_date, endDate=end_date, pandas='1') equity = DataFrame() for rpt_type in ['Q1', 'S1', 'Q3', 'A']: try: tmp = DataAPI.FdmtBSGet(secID=universe, field=['secID', 'endDate', 'publishDate', 'TEquityAttrP'], beginDate=start_date, publishDateEnd=end_date, reportType=rpt_type) except: tmp = DataFrame() equity = pd.concat([equity, tmp], axis=0) print 'Data of TEquityAttrP:' print equity.head() print 'Data of marketValue:' print market_capital.head() Data of TEquityAttrP: secID endDate publishDate TEquityAttrP 0 000001.XSHE 2016-03-31 2016-04-21 1.875690e+11 1 000002.XSHE 2016-03-31 2016-04-28 1.006367e+11 2 000009.XSHE 2016-03-31 2016-04-29 4.467273e+09 3 000039.XSHE 2016-03-31 2016-04-29 5.668081e+09 4 000060.XSHE 2016-03-31 2016-04-28 7.340159e+09 Data of marketValue: secID tradeDate marketValue negMarketValue 0 000001.XSHE 2015-07-14 1.984613e+11 1.637222e+11 1 000001.XSHE 2015-07-15 1.943118e+11 1.602991e+11 2 000001.XSHE 2015-07-16 1.945980e+11 1.605351e+11 3 000001.XSHE 2015-07-17 1.977459e+11 1.631320e+11 4 000001.XSHE 2015-07-20 1.945980e+11 1.605351e+11 ``` 對于市值的數據,每個交易日均有提供,實際上我們多取了數據,我們只需要最新的市值數據即可。為此,我們將數據按股票代碼和交易日進行排序,并按股票代碼丟棄重復數據。以下代碼表示按股票代碼和交易日進行升序排序,并在丟棄重復值時,保留最后一個(默認是第一個): ```py market_capital = market_capital.sort(columns=['secID', 'tradeDate'], ascending=[True, True]) market_capital = market_capital.drop_duplicates(subset='secID', take_last=True) ``` 并非所有的數據都是完美的,有時候也會出現數據的缺失。我們在計算時無法處理缺失的數據,需要丟棄。下面這一行代碼使用了`isnull`函數檢查數據中總市值的缺失值,返回的是一個等長的邏輯`Series`,若數據缺失則為`True`。為盡可能多利用數據,我們考慮在總市值缺失的情況下,若流通市值有數值,則使用流通市值替換總市值,僅在兩者皆缺失的情況下丟棄數據(雖然多數情況下是流通市值缺失,有總市值的數據,這一處理方式在其它使用到流通市值計算的情形中可以參考): ```py market_capital['marketValue'][isnull(market_capital['marketValue'])] = market_capital['negMarketValue'][isnull(market_capital['marketValue'])] ``` 以下代碼使用`drop`函數舍去了流通市值這一列,使用`dropna`函數丟棄缺失值,并使用`rename`函數將列`marketValue`重命名為`numerator`: ```py market_capital = market_capital.drop('negMarketValue', axis=1) numerator = market_capital.dropna() numerator.rename(columns={'marketValue': 'numerator'}, inplace=True) ``` 我們可以看一下處理好的分子: ```py print numerator secID tradeDate numerator 244 000001.XSHE 2016-07-13 1.543620e+11 489 000002.XSHE 2016-07-13 2.022373e+11 734 000009.XSHE 2016-07-13 2.257608e+10 49244 000027.XSHE 2016-07-13 2.755322e+10 979 000039.XSHE 2016-07-13 4.434777e+10 49489 000046.XSHE 2016-07-13 5.222182e+10 1224 000060.XSHE 2016-07-13 2.739233e+10 1469 000061.XSHE 2016-07-13 2.161932e+10 1714 000063.XSHE 2016-07-13 6.184518e+10 1959 000069.XSHE 2016-07-13 5.743977e+10 24744 000100.XSHE 2016-07-13 4.335857e+10 24989 000156.XSHE 2016-07-13 2.833737e+10 2204 000157.XSHE 2016-07-13 3.287913e+10 49734 000166.XSHE 2016-07-13 1.291645e+11 25234 000333.XSHE 2016-07-13 1.750697e+11 2449 000338.XSHE 2016-07-13 3.266872e+10 2694 000402.XSHE 2016-07-13 3.000886e+10 49979 000413.XSHE 2016-07-13 3.831165e+10 50224 000415.XSHE 2016-07-13 4.217844e+10 2939 000423.XSHE 2016-07-13 3.700454e+10 3184 000425.XSHE 2016-07-13 2.249481e+10 50469 000503.XSHE 2016-07-13 3.908079e+10 3429 000538.XSHE 2016-07-13 7.392896e+10 50714 000540.XSHE 2016-07-13 3.147026e+10 50959 000559.XSHE 2016-07-13 3.634171e+10 3674 000568.XSHE 2016-07-13 4.571343e+10 25479 000623.XSHE 2016-07-13 2.298707e+10 3919 000625.XSHE 2016-07-13 7.134216e+10 4164 000630.XSHE 2016-07-13 2.753465e+10 4409 000651.XSHE 2016-07-13 1.065987e+11 ... ... ... ... 45079 601669.XSHG 2016-07-13 8.307799e+10 45324 601688.XSHG 2016-07-13 1.519940e+11 71425 601718.XSHG 2016-07-13 3.189739e+10 71670 601727.XSHG 2016-07-13 1.034922e+11 45569 601766.XSHG 2016-07-13 2.573330e+11 71915 601788.XSHG 2016-07-13 7.094565e+10 45814 601800.XSHG 2016-07-13 1.788926e+11 23764 601808.XSHG 2016-07-13 6.083780e+10 46059 601818.XSHG 2016-07-13 1.750466e+11 24009 601857.XSHG 2016-07-13 1.356185e+12 46304 601866.XSHG 2016-07-13 4.977011e+10 72160 601872.XSHG 2016-07-13 2.771617e+10 46549 601888.XSHG 2016-07-13 4.459454e+10 46794 601898.XSHG 2016-07-13 7.623731e+10 47039 601899.XSHG 2016-07-13 8.466495e+10 47284 601901.XSHG 2016-07-13 6.478664e+10 72405 601919.XSHG 2016-07-13 5.527004e+10 47529 601928.XSHG 2016-07-13 2.842653e+10 47774 601933.XSHG 2016-07-13 3.644512e+10 48019 601939.XSHG 2016-07-13 1.265056e+12 48264 601958.XSHG 2016-07-13 2.913624e+10 72650 601985.XSHG 2016-07-13 1.092693e+11 24254 601988.XSHG 2016-07-13 9.832552e+11 48509 601989.XSHG 2016-07-13 1.327548e+11 72895 601991.XSHG 2016-07-13 5.430495e+10 48754 601992.XSHG 2016-07-13 4.399242e+10 24499 601998.XSHG 2016-07-13 2.788525e+11 73140 603000.XSHG 2016-07-13 2.080911e+10 73385 603885.XSHG 2016-07-13 3.755758e+10 48999 603993.XSHG 2016-07-13 7.734337e+10 [300 rows x 3 columns] ``` 接下來處理分母數據。同樣,為保留最新數據,對權益數據按股票代碼升序,報表日期和發布日期按降序排列。隨后丟棄缺失數據并按照股票代碼去掉重復項,更改列名`TEquityAttrP`為`denominator`: ```py equity = equity.sort(columns=['secID', 'endDate', 'publishDate'], ascending=[True, False, False]) equity = equity.dropna() equity = equity.drop_duplicates(cols='secID') denominator = equity denominator.rename(columns={"TEquityAttrP": "denominator"}, inplace=True) ``` 處理好的分母: ```py print denominator secID endDate publishDate denominator 0 000001.XSHE 2016-03-31 2016-04-21 1.875690e+11 1 000002.XSHE 2016-03-31 2016-04-28 1.006367e+11 2 000009.XSHE 2016-03-31 2016-04-29 4.467273e+09 203 000027.XSHE 2016-03-31 2016-04-30 2.139399e+10 3 000039.XSHE 2016-03-31 2016-04-29 5.668081e+09 204 000046.XSHE 2016-03-31 2016-04-28 1.632725e+10 4 000060.XSHE 2016-03-31 2016-04-28 7.340159e+09 5 000061.XSHE 2016-03-31 2016-04-30 4.845586e+09 6 000063.XSHE 2016-03-31 2016-04-29 3.902424e+10 7 000069.XSHE 2016-03-31 2016-04-29 3.836175e+10 100 000100.XSHE 2016-03-31 2016-04-21 2.461872e+10 101 000156.XSHE 2016-03-31 2016-04-25 9.396250e+09 8 000157.XSHE 2016-03-31 2016-04-23 3.929794e+10 205 000166.XSHE 2016-03-31 2016-04-30 5.003656e+10 102 000333.XSHE 2016-03-31 2016-04-30 5.385758e+10 9 000338.XSHE 2016-03-31 2016-04-30 3.198088e+10 10 000402.XSHE 2016-03-31 2016-04-30 2.626535e+10 206 000413.XSHE 2016-03-31 2016-04-29 1.466822e+10 207 000415.XSHE 2016-03-31 2016-04-30 2.720240e+10 11 000423.XSHE 2016-03-31 2016-04-20 7.558454e+09 12 000425.XSHE 2016-03-31 2016-04-26 2.057239e+10 208 000503.XSHE 2016-03-31 2016-04-29 1.347180e+09 13 000538.XSHE 2016-03-31 2016-04-27 1.405493e+10 209 000540.XSHE 2016-03-31 2016-04-29 1.271475e+10 210 000559.XSHE 2016-03-31 2016-04-20 4.417438e+09 14 000568.XSHE 2016-03-31 2016-04-28 1.083373e+10 103 000623.XSHE 2016-03-31 2016-04-29 1.743589e+10 15 000625.XSHE 2016-03-31 2016-04-30 3.702576e+10 16 000630.XSHE 2016-03-31 2016-04-30 1.374468e+10 17 000651.XSHE 2016-03-31 2016-04-30 5.069274e+10 .. ... ... ... ... 185 601669.XSHG 2016-03-31 2016-04-30 5.714574e+10 186 601688.XSHG 2016-03-31 2016-04-29 8.060570e+10 295 601718.XSHG 2016-03-31 2016-04-19 1.303635e+10 296 601727.XSHG 2016-03-31 2016-04-30 3.758142e+10 187 601766.XSHG 2016-03-31 2016-04-28 9.868600e+10 297 601788.XSHG 2016-03-31 2016-04-26 3.993967e+10 188 601800.XSHG 2016-03-31 2016-04-27 1.479940e+11 96 601808.XSHG 2016-03-31 2016-04-29 4.578060e+10 189 601818.XSHG 2016-03-31 2016-04-30 2.323020e+11 97 601857.XSHG 2016-03-31 2016-04-29 1.169389e+12 190 601866.XSHG 2016-03-31 2016-04-29 1.801931e+10 298 601872.XSHG 2016-03-31 2016-04-22 1.404631e+10 191 601888.XSHG 2016-03-31 2016-04-23 1.188385e+10 192 601898.XSHG 2016-03-31 2016-04-28 8.306575e+10 193 601899.XSHG 2016-03-31 2016-04-30 2.722604e+10 194 601901.XSHG 2016-03-31 2016-04-29 3.514534e+10 300 601919.XSHG 2016-03-31 2016-04-29 2.253836e+10 195 601928.XSHG 2016-03-31 2016-04-30 1.093871e+10 196 601933.XSHG 2016-03-31 2016-05-06 1.269974e+10 198 601939.XSHG 2016-03-31 2016-04-30 1.499405e+12 199 601958.XSHG 2016-03-31 2016-04-29 1.271524e+10 301 601985.XSHG 2016-03-31 2016-04-29 3.860421e+10 98 601988.XSHG 2016-03-31 2016-04-27 1.348157e+12 200 601989.XSHG 2016-03-31 2016-04-29 5.696661e+10 302 601991.XSHG 2016-03-31 2016-04-28 4.568534e+10 201 601992.XSHG 2016-03-31 2016-04-27 3.824465e+10 99 601998.XSHG 2016-03-31 2016-04-28 3.286200e+11 303 603000.XSHG 2016-03-31 2016-04-29 2.734087e+09 304 603885.XSHG 2016-03-31 2016-04-21 3.820480e+09 202 603993.XSHG 2016-03-31 2016-04-29 1.757461e+10 [300 rows x 4 columns] ``` 分子分母處理好之后,我們將兩個`DataFrame`使用`merge`函數合并,使用參數`how='inner'`保留在兩者中均存在的股票。 ```py dat_info = numerator.merge(denominator, on='secID', how='inner') ``` 作為比值,分母不可以為零,這里我們通過設置分母絕對值大于一個很小的數來過濾不符合要求的數據。隨后直接通過`DataFrame['Column_name']`的復制添加一列PB: ```py dat_info = dat_info[abs(dat_info['denominator']) >= 1e-8] dat_info['PB'] = dat_info['numerator'] / dat_info['denominator'] ``` ```py pb_signal = dat_info[['secID', 'PB']] pb_signal = pb_signal.set_index('secID')['PB'] print pb_signal secID 000001.XSHE 0.822961 000002.XSHE 2.009577 000009.XSHE 5.053661 000027.XSHE 1.287895 000039.XSHE 7.824125 000046.XSHE 3.198446 000060.XSHE 3.731845 000061.XSHE 4.461653 000063.XSHE 1.584789 000069.XSHE 1.497319 000100.XSHE 1.761203 000156.XSHE 3.015817 000157.XSHE 0.836663 000166.XSHE 2.581403 000333.XSHE 3.250605 000338.XSHE 1.021508 000402.XSHE 1.142527 000413.XSHE 2.611881 000415.XSHE 1.550541 000423.XSHE 4.895781 000425.XSHE 1.093446 000503.XSHE 29.009320 000538.XSHE 5.260001 000540.XSHE 2.475100 000559.XSHE 8.226875 000568.XSHE 4.219546 000623.XSHE 1.318376 000625.XSHE 1.926825 000630.XSHE 2.003295 000651.XSHE 2.102841 ... 601669.XSHG 1.453791 601688.XSHG 1.885648 601718.XSHG 2.446804 601727.XSHG 2.753812 601766.XSHG 2.607594 601788.XSHG 1.776320 601800.XSHG 1.208783 601808.XSHG 1.328899 601818.XSHG 0.753530 601857.XSHG 1.159739 601866.XSHG 2.762044 601872.XSHG 1.973199 601888.XSHG 3.752535 601898.XSHG 0.917795 601899.XSHG 3.109705 601901.XSHG 1.843392 601919.XSHG 2.452265 601928.XSHG 2.598709 601933.XSHG 2.869754 601939.XSHG 0.843705 601958.XSHG 2.291442 601985.XSHG 2.830503 601988.XSHG 0.729333 601989.XSHG 2.330397 601991.XSHG 1.188674 601992.XSHG 1.150289 601998.XSHG 0.848556 603000.XSHG 7.610988 603885.XSHG 9.830593 603993.XSHG 4.400859 Name: PB, dtype: float64 ``` 好了接下來我們把以上PB因子計算過程變成一個函數,使得它可以計算回測開始時間到結束時間的PB值,這樣我們可以在通聯的多因子信號分析工具RDP中方便的測試 ```py def str2date(date_str): date_obj = dt.datetime(int(date_str[0:4]), int(date_str[4:6]), int(date_str[6:8])) return Date.fromDateTime(date_obj) def signal_pb_calc(universe, current_date): today = str2date(current_date) start_date = (today - Period('1Y')).toDateTime().strftime('%Y%m%d') end_date = today.toDateTime().strftime('%Y%m%d') # dealing with the numerator market_capital = DataAPI.MktEqudGet(secID=universe, field=['secID', 'tradeDate', 'marketValue', 'negMarketValue', 'turnoverVol'], beginDate=start_date, endDate=end_date, pandas='1') market_capital = market_capital[market_capital['turnoverVol'] > 0] market_capital = market_capital.sort(columns=['secID', 'tradeDate'], ascending=[True, True]) market_capital = market_capital.drop_duplicates(subset='secID', take_last=True) market_capital['marketValue'][isnull(market_capital['marketValue'])] = market_capital['negMarketValue'][isnull(market_capital['marketValue'])] market_capital = market_capital.drop('negMarketValue', axis=1) numerator = market_capital.dropna() numerator.rename(columns={'marketValue': 'numerator'}, inplace=True) # dealing with the denominator equity = DataFrame() for rpt_type in ['Q1', 'S1', 'Q3', 'A']: try: tmp = DataAPI.FdmtBSGet(secID=universe, field=['secID', 'endDate', 'publishDate', 'TEquityAttrP'], beginDate=start_date, publishDateEnd=end_date, reportType=rpt_type) except: tmp = DataFrame() equity = pd.concat([equity, tmp], axis=0) equity = equity.sort(columns=['secID', 'endDate', 'publishDate'], ascending=[True, False, False]) equity = equity.dropna() equity = equity.drop_duplicates(cols='secID') denominator = equity denominator.rename(columns={"TEquityAttrP": "denominator"}, inplace=True) # merge two dataframe and calculate price-to- book ratio dat_info = numerator.merge(denominator, on='secID', how='inner') dat_info = dat_info[abs(dat_info['denominator']) >= 1e-8] dat_info['PB'] = dat_info['numerator'] / dat_info['denominator'] pb_signal = dat_info[['secID', 'PB']] pb_signal["secID"] = pb_signal["secID"].apply(lambda x:x[:6]) return pb_signal ``` 此代碼完成的功能是: + 計算滬深300成分股在一段時間內的PB值作為信號 + 把這些PB數據按照天存儲為csv文件 + 把csv文件打包成zip 可以將這些文件下載到本地,解壓到一個文件夾(比如`PB_for_Mercury_DEMO`),然后上傳到RDP([通聯策略研究](https://gw.wmcloud.com/rdp//#/signalMgr))中當做信號使用。 ```py start = datetime(2015, 1, 1) end = datetime(2015, 4, 23) univ = set_universe('HS300') cal = Calendar('China.SSE') all_files = [] today = start while((today - end).days < 0): today_CAL = Date.fromDateTime(today) if(cal.isBizDay(today_CAL)): today_str = today.strftime("%Y%m%d") print "Calculating PB values on " + today_str pb_value = signal_pb_calc(univ, today_str) file_name = today_str + '.csv' pb_value.to_csv(file_name, index=False, header=False) all_files.append(file_name) today = today + timedelta(days=1) # exporting all *.csv files to PB.zip zip_files("PB"+ "_" + start.strftime("%Y%m%d") + "_" + end.strftime("%Y%m%d"), all_files) # delete all *.csv delete_files(all_files) ``` 第一步:解壓點擊‘上傳新信號’,選擇信號文件夾并為信號命名,然后,開始上傳; ![](https://box.kancloud.cn/2016-07-31_579d79fe7aa93.JPG) 第二步:選中上傳的新信號,點擊 ‘開始回測’; ![](https://box.kancloud.cn/2016-07-31_579d79fe99152.JPG) 第三步:進行回測的各種配置; ![](https://box.kancloud.cn/2016-07-31_579d79feb2c73.JPG) 第四步:開始回測,回測完成后,點擊報告的鏈接,查看回測結果; ![](https://box.kancloud.cn/2016-07-31_579d79feccac3.JPG) 第五步:查看回測結果。 ![](https://box.kancloud.cn/2016-07-31_579d79fee75fb.JPG) 以上研究過程演示了單個因子的產生和快速回測的過程,后面會介紹多因子的策略框架 ![](https://box.kancloud.cn/2016-07-31_579d79ff0c6ab.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看