HI:
I try manually run zipline algo - date from load_bars_from_yahoo , pipeline with dataframeloader . but failed
below is my code ,very simple , it seem get_pipeline_loader not use right ! ( customfactor compute function receive nan input -- print("---",today,assets,highs,lows) #highs ,lows is nan)
please give me some advices . thansk
from zipline import TradingAlgorithm
from zipline.api import (
attach_pipeline,
date_rules,
order_target_percent,
pipeline_output,
record,
schedule_function,
symbol,
)
from zipline.pipeline import Pipeline
from zipline.pipeline.factors import RSI
from zipline.pipeline.data import USEquityPricing
from zipline.pipeline.data import Column
from zipline.pipeline.data import DataSet
from zipline.pipeline.engine import SimplePipelineEngine
from zipline.pipeline.loaders.frame import DataFrameLoader
from itertools import chain
import numpy as np
import pandas.io.data as web
import pandas_datareader.data as web
from pandas.stats.api import ols
import pandas as pd
import math
import pytz
from datetime import timedelta, date, datetime
from zipline.pipeline.factors import AverageDollarVolume, CustomFactor, Latest
dates = pd.date_range('2014-01-01', '2014-01-31')
my_stock = ['AMD', 'CERN']
test_start = datetime(2014, 1, 1, 0, 0, 0, 0, pytz.utc)
test_end = datetime(2014, 1, 31, 0, 0, 0, 0, pytz.utc)
from zipline.utils.factory import load_bars_from_yahoo
panel = load_bars_from_yahoo(stocks=my_stock, start=test_start, end=test_end)
loaders = {
USEquityPricing.open: DataFrameLoader(USEquityPricing.open, panel.minor_xs('open')),
USEquityPricing.high: DataFrameLoader(USEquityPricing.high, panel.minor_xs('high')),
USEquityPricing.low: DataFrameLoader(USEquityPricing.low, panel.minor_xs('low')),
USEquityPricing.close: DataFrameLoader(USEquityPricing.close, panel.minor_xs('close')),
USEquityPricing.volume: DataFrameLoader(USEquityPricing.volume, panel.minor_xs('volume'))
}
def my_dispatcher(column):
return loaders[column]
class TenDayRange(CustomFactor):
inputs = [USEquityPricing.high, USEquityPricing.low]
window_length = 2
def compute(self, today, assets, out, highs, lows):
print("---",today,assets,highs,lows) #highs ,lows is nan
from numpy import nanmin, nanmax
highest_highs = nanmax(highs, axis=0)
lowest_lows = nanmin(lows, axis=0)
out[:] = highest_highs - lowest_lows
def make_pipeline():
tdr = TenDayRange()
return Pipeline(
columns={
'longs': tdr.top(2),
'shorts': tdr.bottom(2),
},
)
def rebalance(context, data):
# Pipeline data will be a dataframe with boolean columns named 'longs' and
# 'shorts'.
pipeline_data = context.pipeline_data
all_assets = pipeline_data.index
print("-----------------",pipeline_data,all_assets)
def initialize(context):
attach_pipeline(make_pipeline(), 'my_pipeline')
schedule_function(rebalance, date_rules.every_day())
def handle_data(context, data):
pass
def before_trading_start(context, data):
context.pipeline_data = pipeline_output('my_pipeline')
pass
if name == 'main':
algo = TradingAlgorithm(initialize=initialize,
handle_data=handle_data,
before_trading_start=before_trading_start,
get_pipeline_loader=my_dispatcher,
capital_base = 100000)
results = algo.run(panel)