アルゴリズムその2
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)
df.tail()
df["MA30"] = df["AAPL"].rolling(30).mean()
df["MA10"] = df["AAPL"].rolling(10).mean()
df.tail()
df.plot()
df["Weight"] = (df["MA10"] - df["MA30"]) / df["MA30"]
df.tail()
df.plot(secondary_y ="Weight")
# 5銘柄の過去データを取得
hist = get_pricing(["FB", "JPM", "JNJ", "DIS", "KO"], start_date="2016-1-1", end_date="2017-11-20", fields="price")
len(hist)
hist.tail()
## 30日MAと10日MAを出力
hist30MA=hist.rolling(30).mean()
hist10MA=hist.rolling(10).mean()
hist10MA.tail()
raw_weights = (hist10MA - hist30MA) / hist30MA
raw_weights.tail()
raw_weights.ix["2017-11-20"]
raw_weights.ix["2017-11-20"].abs()
x = raw_weights.ix["2017-11-20"].abs().sum()
x
normalized_weights = raw_weights.ix["2017-11-20"] / x
normalized_weights
normalized_weights[normalized_weights > 0].index.tolist()
normalized_weights[normalized_weights < 0].index.tolist()
normalized_weights.index.tolist()
for security in normalized_weights.index:
print (security, normalized_weights[security])
アルゴリズムその3
アルゴリズムその2では、最初から5つの銘柄を決めて取引しました.
その3では、アメリカの株式市場で取引されているほとんどすべての銘柄の中から, 条件にあった銘柄を毎週探しだし取引することにしましょう.
つまり
これを瞬時に行うためのAPIがQuantopianには用意されています
from quantopian.pipeline import Pipeline
from quantopian.research import run_pipeline
# 空のパイプラインを作る
pipe = Pipeline()
# pipeline オブジェクトを実行.
results = run_pipeline(pipe, start_date="2017-11-1", end_date="2017-11-20")
#results
len(results.ix["2017-11-1"])
パイプラインにほしい情報を追加していきます. 情報は,株価や出来高だけじゃなく,株価の平均やDiffなど演算した結果や,その銘柄がどの業種の銘柄なのか,等色々な情報が取得出来ます. 取得した情報を元に,必要な情報だけをFilterして,要らない情報を削除することもできます.
どんなデータがあるのかは https://www.quantopian.com/data で確認できます.
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')
results = run_pipeline(pipe, start_date="2017-11-1", end_date="2017-11-20")
results.ix["2017-11-1"]
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")
## 2017-11-1 の結果だけ取得
output = results.ix["2017-11-1"]
output
security_list = output.sort_values(by = "abs_raw_weights", ascending=False).head()
security_list
security_list["normalize_weights"] = security_list["raw_weights"] / security_list["abs_raw_weights"].sum()
security_list