# 量化分析師的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)
```
第一步:解壓點擊‘上傳新信號’,選擇信號文件夾并為信號命名,然后,開始上傳;

第二步:選中上傳的新信號,點擊 ‘開始回測’;

第三步:進行回測的各種配置;

第四步:開始回測,回測完成后,點擊報告的鏈接,查看回測結果;

第五步:查看回測結果。

以上研究過程演示了單個因子的產生和快速回測的過程,后面會介紹多因子的策略框架

- Python 量化交易教程
- 第一部分 新手入門
- 一 量化投資視頻學習課程
- 二 Python 手把手教學
- 量化分析師的Python日記【第1天:誰來給我講講Python?】
- 量化分析師的Python日記【第2天:再接著介紹一下Python唄】
- 量化分析師的Python日記【第3天:一大波金融Library來襲之numpy篇】
- 量化分析師的Python日記【第4天:一大波金融Library來襲之scipy篇】
- 量化分析師的Python日記【第5天:數據處理的瑞士軍刀pandas】
- 量化分析師的Python日記【第6天:數據處理的瑞士軍刀pandas下篇
- 量化分析師的Python日記【第7天:Q Quant 之初出江湖】
- 量化分析師的Python日記【第8天 Q Quant兵器譜之函數插值】
- 量化分析師的Python日記【第9天 Q Quant兵器譜之二叉樹】
- 量化分析師的Python日記【第10天 Q Quant兵器譜 -之偏微分方程1】
- 量化分析師的Python日記【第11天 Q Quant兵器譜之偏微分方程2】
- 量化分析師的Python日記【第12天:量化入門進階之葵花寶典:因子如何產生和回測】
- 量化分析師的Python日記【第13天 Q Quant兵器譜之偏微分方程3】
- 量化分析師的Python日記【第14天:如何在優礦上做Alpha對沖模型】
- 量化分析師的Python日記【第15天:如何在優礦上搞一個wealthfront出來】
- 第二部分 股票量化相關
- 一 基本面分析
- 1.1 alpha 多因子模型
- 破解Alpha對沖策略——觀《量化分析師Python日記第14天》有感
- 熔斷不要怕, alpha model 為你保駕護航!
- 尋找 alpha 之: alpha 設計
- 1.2 基本面因子選股
- Porfolio(現金比率+負債現金+現金保障倍數)+市盈率
- ROE選股指標
- 成交量因子
- ROIC&cashROIC
- 【國信金工】資產周轉率選股模型
- 【基本面指標】Cash Cow
- 量化因子選股——凈利潤/營業總收入
- 營業收入增長率+市盈率
- 1.3 財報閱讀 ? [米缸量化讀財報] 資產負債表-投資相關資產
- 1.4 股東分析
- 技術分析入門 【2】 —— 大家搶籌碼(06年至12年版)
- 技術分析入門 【2】 —— 大家搶籌碼(06年至12年版)— 更新版
- 誰是中國A股最有錢的自然人
- 1.5 宏觀研究
- 【干貨包郵】手把手教你做宏觀擇時
- 宏觀研究:從估值角度看當前市場
- 追尋“國家隊”的足跡
- 二 套利
- 2.1 配對交易
- HS300ETF套利(上)
- 【統計套利】配對交易
- 相似公司股票搬磚
- Paired trading
- 2.2 期現套利 ? 通過股指期貨的期現差與 ETF 對沖套利
- 三 事件驅動
- 3.1 盈利預增
- 盈利預增事件
- 事件驅動策略示例——盈利預增
- 3.2 分析師推薦 ? 分析師的金手指?
- 3.3 牛熊轉換
- 歷史總是相似 牛市還在延續
- 歷史總是相似 牛市已經見頂?
- 3.4 熔斷機制 ? 股海拾貝之 [熔斷錯殺股]
- 3.5 暴漲暴跌 ? [實盤感悟] 遇上暴跌我該怎么做?
- 3.6 兼并重組、舉牌收購 ? 寶萬戰-大戲開幕
- 四 技術分析
- 4.1 布林帶
- 布林帶交易策略
- 布林帶回調系統-日內
- Conservative Bollinger Bands
- Even More Conservative Bollinger Bands
- Simple Bollinger Bands
- 4.2 均線系統
- 技術分析入門 —— 雙均線策略
- 5日線10日線交易策略
- 用5日均線和10日均線進行判斷 --- 改進版
- macross
- 4.3 MACD
- Simple MACD
- MACD quantization trade
- MACD平滑異同移動平均線方法
- 4.4 阿隆指標 ? 技術指標阿隆( Aroon )全解析
- 4.5 CCI ? CCI 順勢指標探索
- 4.6 RSI
- 重寫 rsi
- RSI指標策略
- 4.7 DMI ? DMI 指標體系的構建及簡單應用
- 4.8 EMV ? EMV 技術指標的構建及應用
- 4.9 KDJ ? KDJ 策略
- 4.10 CMO
- CMO 策略模仿練習 1
- CMO策略模仿練習2
- [技術指標] CMO
- 4.11 FPC ? FPC 指標選股
- 4.12 Chaikin Volatility
- 嘉慶離散指標測試
- 4.13 委比 ? 實時計算委比
- 4.14 封單量
- 按照封單跟流通股本比例排序,剔除6月上市新股,前50
- 漲停股票封單統計
- 實時計算漲停板股票的封單資金與總流通市值的比例
- 4.15 成交量 ? 決戰之地, IF1507 !
- 4.16 K 線分析 ? 尋找夜空中最亮的星
- 五 量化模型
- 5.1 動量模型
- Momentum策略
- 【小散學量化】-2-動量模型的簡單實踐
- 一個追漲的策略(修正版)
- 動量策略(momentum driven)
- 動量策略(momentum driven)——修正版
- 最經典的Momentum和Contrarian在中國市場的測試
- 最經典的Momentum和Contrarian在中國市場的測試-yanheven改進
- [策略]基于勝率的趨勢交易策略
- 策略探討(更新):價量結合+動量反轉
- 反向動量策略(reverse momentum driven)
- 輕松跑贏大盤 - 主題Momentum策略
- Contrarian strategy
- 5.2 Joseph Piotroski 9 F-Score Value Investing Model · 基本面選股系統:Piotroski F-Score ranking system
- 5.3 SVR · 使用SVR預測股票開盤價 v1.0
- 5.4 決策樹、隨機樹
- 決策樹模型(固定模型)
- 基于Random Forest的決策策略
- 5.5 鐘擺理論 · 鐘擺理論的簡單實現——完美躲過股災和精準抄底
- 5.6 海龜模型
- simple turtle
- 俠之大者 一起賺錢
- 5.7 5217 策略 · 白龍馬的新手策略
- 5.8 SMIA · 基于歷史狀態空間相似性匹配的行業配置 SMIA 模型—取交集
- 5.9 神經網絡
- 神經網絡交易的訓練部分
- 通過神經網絡進行交易
- 5.10 PAMR · PAMR : 基于均值反轉的投資組合選擇策略 - 修改版
- 5.11 Fisher Transform · Using Fisher Transform Indicator
- 5.12 分型假說, Hurst 指數 · 分形市場假說,一個聽起來很美的假說
- 5.13 變點理論 · 變點策略初步
- 5.14 Z-score Model
- Zscore Model Tutorial
- 信用債風險模型初探之:Z-Score Model
- user-defined package
- 5.15 機器學習 · Machine Learning 學習筆記(一) by OTreeWEN
- 5.16 DualTrust 策略和布林強盜策略
- 5.17 卡爾曼濾波
- 5.18 LPPL anti-bubble model
- 今天大盤熔斷大跌,后市如何—— based on LPPL anti-bubble model
- 破解股市泡沫之謎——對數周期冪率(LPPL)模型
- 六 大數據模型
- 6.1 市場情緒分析
- 通聯情緒指標策略
- 互聯網+量化投資 大數據指數手把手
- 6.2 新聞熱點
- 如何使用優礦之“新聞熱點”?
- 技術分析【3】—— 眾星拱月,眾口鑠金?
- 七 排名選股系統
- 7.1 小市值投資法
- 學習筆記:可模擬(小市值+便宜 的修改版)
- 市值最小300指數
- 流通市值最小股票(新篩選器版)
- 持有市值最小的10只股票
- 10% smallest cap stock
- 7.2 羊駝策略
- 羊駝策略
- 羊駝反轉策略(修改版)
- 羊駝反轉策略
- 我的羊駝策略,選5只股無腦輪替
- 7.3 低價策略
- 專撿便宜貨(新版quartz)
- 策略原理
- 便宜就是 alpha
- 八 輪動模型
- 8.1 大小盤輪動 · 新手上路 -- 二八ETF擇時輪動策略2.0
- 8.2 季節性策略
- Halloween Cycle
- Halloween cycle 2
- 夏買電,東買煤?
- 歷史的十一月板塊漲幅
- 8.3 行業輪動
- 銀行股輪動
- 申萬二級行業在最近1年、3個月、5個交易日的漲幅統計
- 8.4 主題輪動
- 快速研究主題神器
- recommendation based on subject
- strategy7: recommendation based on theme
- 板塊異動類
- 風險因子(離散類)
- 8.5 龍頭輪動
- Competitive Securities
- Market Competitiveness
- 主題龍頭類
- 九 組合投資
- 9.1 指數跟蹤 · [策略] 指數跟蹤低成本建倉策略
- 9.2 GMVP · Global Minimum Variance Portfolio (GMVP)
- 9.3 凸優化 · 如何在 Python 中利用 CVXOPT 求解二次規劃問題
- 十 波動率
- 10.1 波動率選股 · 風平浪靜 風起豬飛
- 10.2 波動率擇時
- 基于 VIX 指數的擇時策略
- 簡單低波動率指數
- 10.3 Arch/Garch 模型 · 如何使用優礦進行 GARCH 模型分析
- 十一 算法交易
- 11.1 VWAP · Value-Weighted Average Price (VWAP)
- 十二 中高頻交易
- 12.1 order book 分析 · 基于高頻 limit order book 數據的短程價格方向預測—— via multi-class SVM
- 12.2 日內交易 · 大盤日內走勢 (for 擇時)
- 十三 Alternative Strategy
- 13.1 易經、傳統文化 · 老黃歷診股
- 第三部分 基金、利率互換、固定收益類
- 一 分級基金
- “優礦”集思錄——分級基金專題
- 基于期權定價的分級基金交易策略
- 基于期權定價的興全合潤基金交易策略
- 二 基金分析
- Alpha 基金“黑天鵝事件” -- 思考以及原因
- 三 債券
- 債券報價中的小陷阱
- 四 利率互換
- Swap Curve Construction
- 中國 Repo 7D 互換的例子
- 第四部分 衍生品相關
- 一 期權數據
- 如何獲取期權市場數據快照
- 期權高頻數據準備
- 二 期權系列
- [ 50ETF 期權] 1. 歷史成交持倉和 PCR 數據
- 【50ETF期權】 2. 歷史波動率
- 【50ETF期權】 3. 中國波指 iVIX
- 【50ETF期權】 4. Greeks 和隱含波動率微笑
- 【50ETF期權】 5. 日內即時監控 Greeks 和隱含波動率微笑
- 【50ETF期權】 5. 日內即時監控 Greeks 和隱含波動率微笑
- 三 期權分析
- 【50ETF期權】 期權擇時指數 1.0
- 每日期權風險數據整理
- 期權頭寸計算
- 期權探秘1
- 期權探秘2
- 期權市場一周縱覽
- 基于期權PCR指數的擇時策略
- 期權每日成交額PC比例計算
- 四 期貨分析
- 【前方高能!】Gifts from Santa Claus——股指期貨趨勢交易研究