from quantopian.pipeline import Pipeline
from quantopian.research import run_pipeline
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.factors import SimpleMovingAverage, AverageDollarVolume
2.19. フィルタの結合¶
ファクタと同じく、フィルタも結合できます。
フィルタの結合には &
(and)や |
(or)演算子を使います。
例えば直近の終値が20ドルよりも高く、かつ、平均売買代金が全銘柄の上位10パーセントという条件でスクリーニングを実施したいとしましょう。
まず売買代金フィルタを AverageDollarVolume
ファクター と percentile_between
を使って作成します:
dollar_volume = AverageDollarVolume(window_length=30)
high_dollar_volume = dollar_volume.percentile_between(90, 100)
(備考) percentile_between
は、 フィルタ
を返す ファクター
メソッドです。
次に latest_close
ファクターを作成し、終値が20ドルよりも高い証券に絞り込むフィルタを定義します:
latest_close = USEquityPricing.close.latest
above_20 = latest_close > 20
そして high_dollar_volume
フィルタと above_20
フィルタを &
演算子を使って結合します:
tradeable_filter = high_dollar_volume & above_20
このフィルタは high_dollar_volume
と above_20
の双方が True
となる証券に対して True
と判定します。
それら以外は False
となります。
類似の演算が |
(or) 演算子を使って実行可能です。
このフィルタをパイプライン内でスクリーニングに利用したい場合、 screen
引数として tradeable_filter
を指定するだけです。
def make_pipeline():
mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=10)
mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=30)
percent_difference = (mean_close_10 - mean_close_30) / mean_close_30
dollar_volume = AverageDollarVolume(window_length=30)
high_dollar_volume = dollar_volume.percentile_between(90, 100)
latest_close = USEquityPricing.close.latest
above_20 = latest_close > 20
tradeable_filter = high_dollar_volume & above_20
return Pipeline(
columns={
'percent_difference': percent_difference
},
screen=tradeable_filter
)
実行すると、パイプラインは約700銘柄を出力します。
result = run_pipeline(make_pipeline(), '2015-05-05', '2015-05-05')
print 'Number of securities that passed the filter: %d' % len(result)
result
課題
print文を python3用に書き換えるか検討
Number of securities that passed the filter: 737
percent_difference | ||
---|---|---|
2015-05-05 00:00:00+00:00 | Equity(24 [AAPL]) | 0.016905 |
Equity(62 [ABT]) | 0.014385 | |
Equity(67 [ADSK]) | -0.003921 | |
Equity(76 [TAP]) | -0.008759 | |
Equity(114 [ADBE]) | 0.009499 | |
Equity(122 [ADI]) | 0.009271 | |
Equity(128 [ADM]) | 0.015760 | |
Equity(154 [AEM]) | 0.026035 | |
Equity(161 [AEP]) | 0.010405 | |
Equity(168 [AET]) | 0.005853 | |
Equity(185 [AFL]) | -0.002239 | |
Equity(216 [HES]) | 0.036528 | |
Equity(239 [AIG]) | 0.012322 | |
Equity(270 [AKRX]) | -0.024963 | |
Equity(300 [ALK]) | 0.015147 | |
Equity(301 [ALKS]) | -0.033228 | |
Equity(328 [ALTR]) | 0.012284 | |
Equity(357 [TWX]) | 0.000365 | |
Equity(368 [AMGN]) | 0.008860 | |
Equity(438 [AON]) | 0.002327 | |
Equity(448 [APA]) | 0.035926 | |
Equity(455 [APC]) | 0.049153 | |
Equity(460 [APD]) | -0.006999 | |
Equity(624 [ATW]) | 0.014957 | |
Equity(630 [ADP]) | -0.002134 | |
Equity(679 [AXP]) | -0.011809 | |
Equity(693 [AZO]) | 0.002395 | |
Equity(698 [BA]) | -0.016685 | |
Equity(734 [BAX]) | 0.009414 | |
Equity(739 [BBBY]) | -0.027796 | |
... | ... | |
Equity(45269 [EVHC]) | -0.004877 | |
Equity(45451 [FEYE]) | 0.042108 | |
Equity(45558 [BURL]) | -0.053654 | |
Equity(45570 [JNUG]) | 0.053977 | |
Equity(45618 [AR]) | 0.091085 | |
Equity(45769 [WUBA]) | 0.234141 | |
Equity(45804 [ASHR]) | 0.082573 | |
Equity(45815 [TWTR]) | -0.077268 | |
Equity(45971 [AAL]) | 0.008087 | |
Equity(45978 [ATHM]) | 0.063568 | |
Equity(45993 [HLT]) | -0.000895 | |
Equity(46015 [ALLY]) | 0.009605 | |
Equity(46308 [ASPX]) | 0.054145 | |
Equity(46631 [GOOG]) | 0.004730 | |
Equity(46693 [GRUB]) | -0.016904 | |
Equity(46979 [JD]) | 0.058362 | |
Equity(47169 [KITE]) | -0.049366 | |
Equity(47208 [GPRO]) | 0.061078 | |
Equity(47230 [NSAM]) | -0.037879 | |
Equity(47430 [MBLY]) | 0.050288 | |
Equity(47740 [BABA]) | -0.008354 | |
Equity(47777 [CFG]) | 0.025703 | |
Equity(47779 [CYBR]) | 0.101844 | |
Equity(48065 [AXTA]) | 0.034600 | |
Equity(48317 [JUNO]) | -0.103370 | |
Equity(48384 [QRVO]) | -0.050578 | |
Equity(48892 [IGT]) | 0.005591 | |
Equity(48934 [ETSY]) | -0.030142 | |
Equity(48962 [CSAL]) | 0.000000 | |
Equity(48972 [EVA]) | 0.000000 |
737 rows × 1 columns
次のレッスンでは、ファクターとフィルタのマスキングについて見ていきます。