Notebook

アルゴリズムその2

セクターが違う5つの銘柄を毎週ポジションを調整しながら保有し続ける

  • 調整の方法は、各銘柄の30日平均と10日平均のDiffをとって、それが30日平均からみてどのくらいの大きさなのかを確認
  • その大きさを元に自己資金に対して何パーセント投資するかを決める

終値の10日平均と30日平均の差を算出する

In [1]:
df = get_pricing(["AAPL"], start_date="2016-1-1", end_date="2017-11-20", fields="close_price", frequency='daily',)
#defaultはコラム名が銘柄オブジェクトなのでアクセスしづらいため、銘柄文字列に変更
df.columns = map(lambda x: x.symbol, df.columns)
In [2]:
df.tail()
Out[2]:
AAPL
2017-11-14 00:00:00+00:00 171.34
2017-11-15 00:00:00+00:00 169.09
2017-11-16 00:00:00+00:00 171.10
2017-11-17 00:00:00+00:00 170.11
2017-11-20 00:00:00+00:00 169.99
In [3]:
df["MA30"] = df["AAPL"].rolling(30).mean()
df["MA10"] = df["AAPL"].rolling(10).mean()
In [4]:
df.tail()
Out[4]:
AAPL MA30 MA10
2017-11-14 00:00:00+00:00 171.34 162.552600 172.4251
2017-11-15 00:00:00+00:00 169.09 163.091600 172.7089
2017-11-16 00:00:00+00:00 171.10 163.633500 173.0721
2017-11-17 00:00:00+00:00 170.11 164.146033 172.8969
2017-11-20 00:00:00+00:00 169.99 164.636967 172.5263
In [5]:
df.plot()
Out[5]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f56d6f76850>
In [6]:
df["Weight"] = (df["MA10"] - df["MA30"]) / df["MA30"] 
In [7]:
df.tail()
Out[7]:
AAPL MA30 MA10 Weight
2017-11-14 00:00:00+00:00 171.34 162.552600 172.4251 0.060734
2017-11-15 00:00:00+00:00 169.09 163.091600 172.7089 0.058969
2017-11-16 00:00:00+00:00 171.10 163.633500 173.0721 0.057681
2017-11-17 00:00:00+00:00 170.11 164.146033 172.8969 0.053311
2017-11-20 00:00:00+00:00 169.99 164.636967 172.5263 0.047920
In [8]:
df.plot(secondary_y ="Weight")
Out[8]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f56d7347cd0>
In [9]:
# 5銘柄の過去データを取得
hist = get_pricing(["FB", "JPM", "JNJ", "DIS", "KO"], start_date="2016-1-1", end_date="2017-11-20", fields="price")
In [10]:
len(hist)
Out[10]:
476
In [11]:
hist.tail()
Out[11]:
Equity(42950 [FB]) Equity(25006 [JPM]) Equity(4151 [JNJ]) Equity(2190 [DIS]) Equity(4283 [KO])
2017-11-14 00:00:00+00:00 178.06 97.26 139.49 103.16 47.45
2017-11-15 00:00:00+00:00 177.96 98.19 139.11 103.71 46.81
2017-11-16 00:00:00+00:00 179.58 98.50 138.85 103.60 46.56
2017-11-17 00:00:00+00:00 178.98 98.12 137.98 103.44 45.70
2017-11-20 00:00:00+00:00 178.74 99.02 137.95 102.74 45.47
In [12]:
## 30日MAと10日MAを出力
hist30MA=hist.rolling(30).mean()
hist10MA=hist.rolling(10).mean()
In [13]:
hist10MA.tail()
Out[13]:
Equity(42950 [FB]) Equity(25006 [JPM]) Equity(4151 [JNJ]) Equity(2190 [DIS]) Equity(4283 [KO])
2017-11-14 00:00:00+00:00 179.5005 99.128 140.004 101.4885 46.222
2017-11-15 00:00:00+00:00 179.0365 98.855 139.923 101.9560 46.323
2017-11-16 00:00:00+00:00 179.1035 98.549 139.816 102.4810 46.388
2017-11-17 00:00:00+00:00 179.1095 98.220 139.606 102.9640 46.361
2017-11-20 00:00:00+00:00 178.9665 98.045 139.426 103.1730 46.360
In [14]:
raw_weights = (hist10MA - hist30MA) / hist30MA
In [15]:
raw_weights.tail()
Out[15]:
Equity(42950 [FB]) Equity(25006 [JPM]) Equity(4151 [JNJ]) Equity(2190 [DIS]) Equity(4283 [KO])
2017-11-14 00:00:00+00:00 0.022198 0.004297 0.007365 0.018895 0.002204
2017-11-15 00:00:00+00:00 0.017713 0.000724 0.005283 0.022493 0.003466
2017-11-16 00:00:00+00:00 0.016487 -0.002848 0.003159 0.026564 0.004134
2017-11-17 00:00:00+00:00 0.015217 -0.006579 0.000494 0.030229 0.003383
2017-11-20 00:00:00+00:00 0.013212 -0.009231 -0.001847 0.031227 0.003304
In [16]:
raw_weights.ix["2017-11-20"]
Out[16]:
Equity(42950 [FB])     0.013212
Equity(25006 [JPM])   -0.009231
Equity(4151 [JNJ])    -0.001847
Equity(2190 [DIS])     0.031227
Equity(4283 [KO])      0.003304
Name: 2017-11-20 00:00:00+00:00, dtype: float64
In [17]:
raw_weights.ix["2017-11-20"].abs()
Out[17]:
Equity(42950 [FB])     0.013212
Equity(25006 [JPM])    0.009231
Equity(4151 [JNJ])     0.001847
Equity(2190 [DIS])     0.031227
Equity(4283 [KO])      0.003304
Name: 2017-11-20 00:00:00+00:00, dtype: float64
In [18]:
x = raw_weights.ix["2017-11-20"].abs().sum()
x
Out[18]:
0.058821081071983555
In [19]:
normalized_weights = raw_weights.ix["2017-11-20"] / x
normalized_weights
Out[19]:
Equity(42950 [FB])     0.224613
Equity(25006 [JPM])   -0.156936
Equity(4151 [JNJ])    -0.031405
Equity(2190 [DIS])     0.530877
Equity(4283 [KO])      0.056169
Name: 2017-11-20 00:00:00+00:00, dtype: float64
In [20]:
normalized_weights[normalized_weights > 0].index.tolist()
Out[20]:
[Equity(42950 [FB]), Equity(2190 [DIS]), Equity(4283 [KO])]
In [21]:
normalized_weights[normalized_weights < 0].index.tolist()
Out[21]:
[Equity(25006 [JPM]), Equity(4151 [JNJ])]
In [22]:
normalized_weights.index.tolist()
Out[22]:
[Equity(42950 [FB]),
 Equity(25006 [JPM]),
 Equity(4151 [JNJ]),
 Equity(2190 [DIS]),
 Equity(4283 [KO])]
In [23]:
for security in normalized_weights.index:
    print (security, normalized_weights[security])
(Equity(42950 [FB]), 0.22461273980796884)
(Equity(25006 [JPM]), -0.15693595186142148)
(Equity(4151 [JNJ]), -0.03140480086580056)
(Equity(2190 [DIS]), 0.53087703883328596)
(Equity(4283 [KO]), 0.056169468631523237)

アルゴリズムその3

Pipelineを使おう

アルゴリズムその2では、最初から5つの銘柄を決めて取引しました.

その3では、アメリカの株式市場で取引されているほとんどすべての銘柄の中から, 条件にあった銘柄を毎週探しだし取引することにしましょう.

つまり

  1. 毎週月曜日の朝一に
  2. アメリカの株式市場で取引されている全銘柄から,SP500に入っている銘柄だけを取得し
  3. 過去30日と10日の平均を出して、
  4. Diffの絶対値の大きい順に取得し
  5. その2と同様の取引を行う。
  6. ただし、金曜の取引終了時間に全部クローズする

これを瞬時に行うためのAPIがQuantopianには用意されています

Pipelineを初期化

In [24]:
from quantopian.pipeline import Pipeline
from quantopian.research import run_pipeline
# 空のパイプラインを作る
pipe = Pipeline()  
In [25]:
# pipeline オブジェクトを実行.
results = run_pipeline(pipe, start_date="2017-11-1", end_date="2017-11-20")
In [26]:
#results
len(results.ix["2017-11-1"])
Out[26]:
8433

ほしい情報を追加,要らない情報を削除

パイプラインにほしい情報を追加していきます. 情報は,株価や出来高だけじゃなく,株価の平均やDiffなど演算した結果や,その銘柄がどの業種の銘柄なのか,等色々な情報が取得出来ます. 取得した情報を元に,必要な情報だけをFilterして,要らない情報を削除することもできます.

どんなデータがあるのかは https://www.quantopian.com/data で確認できます.

In [27]:
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.factors import SimpleMovingAverage
from quantopian.pipeline.filters.morningstar import Q500US

# パイプラインを初期化
pipe = Pipeline()

# USEquityPricingからcloseデータを取得し、 'close' という名前=コラム名をつける
pipe.add(USEquityPricing.close.latest, 'close') 

# SP500銘柄だけに絞る
pipe.set_screen(Q500US())

## 各銘柄,過去10日間の平均を出す
pipe.add(SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=10), 'SMA10') 
## 同様に30日間の移動平均
pipe.add(SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=30), 'SMA30') 
In [28]:
results = run_pipeline(pipe, start_date="2017-11-1", end_date="2017-11-20")
In [29]:
results.ix["2017-11-1"]
Out[29]:
SMA10 SMA30 close
Equity(2 [ARNC]) 25.340000 26.195833 25.120
Equity(24 [AAPL]) 159.788000 156.614000 169.050
Equity(62 [ABT]) 55.451000 54.202662 54.220
Equity(67 [ADSK]) 121.065000 116.881333 124.960
Equity(76 [TAP]) 81.749000 82.441633 80.860
Equity(114 [ADBE]) 171.823000 156.994333 175.170
Equity(122 [ADI]) 90.002000 87.725700 91.300
Equity(128 [ADM]) 43.067000 43.148000 40.860
Equity(161 [AEP]) 73.867500 72.346500 74.410
Equity(168 [AET]) 165.274000 159.267192 170.050
Equity(185 [AFL]) 84.028500 83.473500 83.880
Equity(216 [HES]) 44.011500 44.864500 44.165
Equity(239 [AIG]) 64.737100 62.728933 64.614
Equity(270 [AKRX]) 32.970400 33.020600 32.580
Equity(300 [ALK]) 73.045100 76.373700 66.030
Equity(337 [AMAT]) 55.975000 52.699833 56.430
Equity(351 [AMD]) 12.821000 13.194833 10.985
Equity(357 [TWX]) 100.063000 101.628778 98.280
Equity(368 [AMGN]) 179.323000 183.576000 175.220
Equity(438 [AON]) 148.869070 147.479178 143.430
Equity(448 [APA]) 40.823203 42.929285 41.370
Equity(455 [APC]) 48.493500 48.596000 49.410
Equity(460 [APD]) 156.398000 153.277724 159.430
Equity(630 [ADP]) 116.317000 112.835000 116.260
Equity(679 [AXP]) 93.785000 91.521529 95.500
Equity(693 [AZO]) 590.798000 589.279333 589.640
Equity(698 [BA]) 260.330700 258.311133 257.990
Equity(700 [BAC]) 27.322300 26.168833 27.380
Equity(734 [BAX]) 64.339400 63.330133 64.470
Equity(739 [BBBY]) 20.836000 21.986833 19.900
... ... ... ...
Equity(45558 [BURL]) 89.931000 91.386167 93.890
Equity(45815 [TWTR]) 18.941400 18.052967 20.619
Equity(45971 [AAL]) 49.967000 49.753333 46.820
Equity(45993 [HLT]) 71.544500 70.132833 72.280
Equity(46015 [ALLY]) 25.240540 24.342002 26.120
Equity(46240 [RICE]) 27.807000 28.096333 28.370
Equity(46693 [GRUB]) 55.706000 53.370467 61.020
Equity(46989 [PE]) 25.301000 26.183167 26.610
Equity(47063 [ANET]) 192.945000 190.591000 199.780
Equity(47163 [INFO]) 43.300500 44.347000 42.610
Equity(47415 [SYF]) 32.503900 31.372300 32.610
Equity(47777 [CFG]) 37.928375 37.175911 38.010
Equity(47833 [W]) 67.132400 69.743300 69.910
Equity(48384 [QRVO]) 72.204000 71.616667 75.810
Equity(49060 [SHOP]) 103.190000 105.792333 99.490
Equity(49210 [CC]) 56.533000 54.390667 56.610
Equity(49229 [KHC]) 76.907000 77.692333 77.330
Equity(49242 [PYPL]) 70.268000 67.024333 72.570
Equity(49288 [LITE]) 60.468700 57.391233 63.150
Equity(49506 [HPE]) 14.168000 14.502000 13.910
Equity(49610 [SQ]) 33.750400 31.349333 37.190
Equity(50070 [HTZ]) 24.551800 24.512533 24.870
Equity(50077 [TWLO]) 31.792500 31.307233 31.960
Equity(50242 [DVMT]) 82.644500 79.789033 82.770
Equity(50392 [YUMC]) 41.140000 41.007667 40.350
Equity(50428 [AA]) 48.199500 47.354533 47.770
Equity(50499 [EVHC]) 43.252500 43.376333 42.600
Equity(50683 [SNAP]) 15.115000 14.883633 15.350
Equity(50716 [DXC]) 91.362000 88.401000 91.530
Equity(51157 [DWDP]) 71.694000 70.907367 72.310

500 rows × 3 columns

In [30]:
pipe = Pipeline()
pipe.add(USEquityPricing.close.latest, 'close') 
pipe.set_screen(Q500US())

SMA10 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=10)
SMA30 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=30)

pipe.add(SMA10, 'SMA10') 
pipe.add(SMA30, 'SMA30') 

## raw_weights 
raw_weights = (SMA10 - SMA30) / SMA30
abs_raw_weights = raw_weights.abs()

pipe.add(raw_weights, 'raw_weights')
pipe.add(abs_raw_weights, 'abs_raw_weights')

results = run_pipeline(pipe, start_date="2017-11-1", end_date="2017-11-15")
In [31]:
## 2017-11-1 の結果だけ取得
output = results.ix["2017-11-1"]
output
Out[31]:
SMA10 SMA30 abs_raw_weights close raw_weights
Equity(2 [ARNC]) 25.340000 26.195833 0.032671 25.120 -0.032671
Equity(24 [AAPL]) 159.788000 156.614000 0.020266 169.050 0.020266
Equity(62 [ABT]) 55.451000 54.202662 0.023031 54.220 0.023031
Equity(67 [ADSK]) 121.065000 116.881333 0.035794 124.960 0.035794
Equity(76 [TAP]) 81.749000 82.441633 0.008401 80.860 -0.008401
Equity(114 [ADBE]) 171.823000 156.994333 0.094454 175.170 0.094454
Equity(122 [ADI]) 90.002000 87.725700 0.025948 91.300 0.025948
Equity(128 [ADM]) 43.067000 43.148000 0.001877 40.860 -0.001877
Equity(161 [AEP]) 73.867500 72.346500 0.021024 74.410 0.021024
Equity(168 [AET]) 165.274000 159.267192 0.037715 170.050 0.037715
Equity(185 [AFL]) 84.028500 83.473500 0.006649 83.880 0.006649
Equity(216 [HES]) 44.011500 44.864500 0.019013 44.165 -0.019013
Equity(239 [AIG]) 64.737100 62.728933 0.032013 64.614 0.032013
Equity(270 [AKRX]) 32.970400 33.020600 0.001520 32.580 -0.001520
Equity(300 [ALK]) 73.045100 76.373700 0.043583 66.030 -0.043583
Equity(337 [AMAT]) 55.975000 52.699833 0.062148 56.430 0.062148
Equity(351 [AMD]) 12.821000 13.194833 0.028332 10.985 -0.028332
Equity(357 [TWX]) 100.063000 101.628778 0.015407 98.280 -0.015407
Equity(368 [AMGN]) 179.323000 183.576000 0.023168 175.220 -0.023168
Equity(438 [AON]) 148.869070 147.479178 0.009424 143.430 0.009424
Equity(448 [APA]) 40.823203 42.929285 0.049059 41.370 -0.049059
Equity(455 [APC]) 48.493500 48.596000 0.002109 49.410 -0.002109
Equity(460 [APD]) 156.398000 153.277724 0.020357 159.430 0.020357
Equity(630 [ADP]) 116.317000 112.835000 0.030859 116.260 0.030859
Equity(679 [AXP]) 93.785000 91.521529 0.024732 95.500 0.024732
Equity(693 [AZO]) 590.798000 589.279333 0.002577 589.640 0.002577
Equity(698 [BA]) 260.330700 258.311133 0.007818 257.990 0.007818
Equity(700 [BAC]) 27.322300 26.168833 0.044078 27.380 0.044078
Equity(734 [BAX]) 64.339400 63.330133 0.015937 64.470 0.015937
Equity(739 [BBBY]) 20.836000 21.986833 0.052342 19.900 -0.052342
... ... ... ... ... ...
Equity(45558 [BURL]) 89.931000 91.386167 0.015923 93.890 -0.015923
Equity(45815 [TWTR]) 18.941400 18.052967 0.049213 20.619 0.049213
Equity(45971 [AAL]) 49.967000 49.753333 0.004295 46.820 0.004295
Equity(45993 [HLT]) 71.544500 70.132833 0.020128 72.280 0.020128
Equity(46015 [ALLY]) 25.240540 24.342002 0.036913 26.120 0.036913
Equity(46240 [RICE]) 27.807000 28.096333 0.010298 28.370 -0.010298
Equity(46693 [GRUB]) 55.706000 53.370467 0.043761 61.020 0.043761
Equity(46989 [PE]) 25.301000 26.183167 0.033692 26.610 -0.033692
Equity(47063 [ANET]) 192.945000 190.591000 0.012351 199.780 0.012351
Equity(47163 [INFO]) 43.300500 44.347000 0.023598 42.610 -0.023598
Equity(47415 [SYF]) 32.503900 31.372300 0.036070 32.610 0.036070
Equity(47777 [CFG]) 37.928375 37.175911 0.020241 38.010 0.020241
Equity(47833 [W]) 67.132400 69.743300 0.037436 69.910 -0.037436
Equity(48384 [QRVO]) 72.204000 71.616667 0.008201 75.810 0.008201
Equity(49060 [SHOP]) 103.190000 105.792333 0.024599 99.490 -0.024599
Equity(49210 [CC]) 56.533000 54.390667 0.039388 56.610 0.039388
Equity(49229 [KHC]) 76.907000 77.692333 0.010108 77.330 -0.010108
Equity(49242 [PYPL]) 70.268000 67.024333 0.048395 72.570 0.048395
Equity(49288 [LITE]) 60.468700 57.391233 0.053623 63.150 0.053623
Equity(49506 [HPE]) 14.168000 14.502000 0.023031 13.910 -0.023031
Equity(49610 [SQ]) 33.750400 31.349333 0.076591 37.190 0.076591
Equity(50070 [HTZ]) 24.551800 24.512533 0.001602 24.870 0.001602
Equity(50077 [TWLO]) 31.792500 31.307233 0.015500 31.960 0.015500
Equity(50242 [DVMT]) 82.644500 79.789033 0.035788 82.770 0.035788
Equity(50392 [YUMC]) 41.140000 41.007667 0.003227 40.350 0.003227
Equity(50428 [AA]) 48.199500 47.354533 0.017843 47.770 0.017843
Equity(50499 [EVHC]) 43.252500 43.376333 0.002855 42.600 -0.002855
Equity(50683 [SNAP]) 15.115000 14.883633 0.015545 15.350 0.015545
Equity(50716 [DXC]) 91.362000 88.401000 0.033495 91.530 0.033495
Equity(51157 [DWDP]) 71.694000 70.907367 0.011094 72.310 0.011094

500 rows × 5 columns

In [32]:
security_list = output.sort_values(by = "abs_raw_weights", ascending=False).head() 
security_list
Out[32]:
SMA10 SMA30 abs_raw_weights close raw_weights
Equity(45503 [AAOI]) 41.0590 53.129533 0.227191 40.75 -0.227191
Equity(20284 [SKX]) 31.4714 27.072300 0.162495 31.92 0.162495
Equity(5214 [NBR]) 6.2755 7.275000 0.137388 5.63 -0.137388
Equity(19336 [WFT]) 3.4325 3.954267 0.131950 3.48 -0.131950
Equity(1406 [CELG]) 115.6665 133.187167 0.131549 100.98 -0.131549
In [33]:
security_list["normalize_weights"] = security_list["raw_weights"] / security_list["abs_raw_weights"].sum()
In [34]:
security_list
Out[34]:
SMA10 SMA30 abs_raw_weights close raw_weights normalize_weights
Equity(45503 [AAOI]) 41.0590 53.129533 0.227191 40.75 -0.227191 -0.287375
Equity(20284 [SKX]) 31.4714 27.072300 0.162495 31.92 0.162495 0.205540
Equity(5214 [NBR]) 6.2755 7.275000 0.137388 5.63 -0.137388 -0.173783
Equity(19336 [WFT]) 3.4325 3.954267 0.131950 3.48 -0.131950 -0.166905
Equity(1406 [CELG]) 115.6665 133.187167 0.131549 100.98 -0.131549 -0.166397