示例#1
0
def preprocess(source,
               index,
               start_date,
               end_date,
               force_rerun=True,
               force_rerun_ta=True):
    # load symbol name
    with open(make_input_file(index)) as csvfile:
        symbols = [
            row[0]
            for ind, row in enumerate(csv.reader(csvfile.read().splitlines()))
            if ind > 0
        ]

    # download Yahoo finance trading data for all symbols in the index
    if force_rerun:
        # download trading data
        download_batch(source, symbols, index, start_date, end_date, 'd',
                       make_output_file(index, 'daily'))
        daily_data = pd.read_csv(make_output_file(index, 'daily'))

        if source == 'yahoo':  # only yahoo provide weekly data
            download_batch(source, symbols, index, start_date, end_date, 'w',
                           make_output_file(index, 'weekly'))
            weekly_data = pd.read_csv(make_output_file(index, 'weekly'))

    if force_rerun_ta:
        # calculate TA indicators for each symbol
        symbols = daily_data.Symbol.unique()
        directory = os.path.join(settings['folder']['trading'], index)
        if not os.path.exists(directory):
            os.mkdir(directory)
        for symbol in symbols:
            fname = os.path.join(directory, symbol + '_ta.csv')

            if source in ('g_1year', 'quandl'):  # avoid overwrite
                if force_rerun == False and os.path.exists(fname):
                    continue
                df = daily_data.loc[daily_data['Symbol'] == symbol]
                df = df.iloc[::-1].reset_index().drop('index', axis=1)
                df = ma(df, 20)
                df = ma(df, 50)
                df = b_bands(df, 20)
                df = rsi(df, 14)
                df = sto_k(df, 14)
                df = sto_d(df, 14)
                df = macd(df, 12, 26)
                df.to_csv(fname, index=False)

            if source == 'yahoo':  #only yahoo provides weekly data
                wfname = os.path.join(directory, symbol + '_weekly_ta.csv')
                wdf = weekly_data.loc[weekly_data['Symbol'] == symbol]
                wdf = wdf.iloc[::-1].reset_index().drop('index', axis=1)
                wdf = ma(wdf, 20)
                wdf = ma(wdf, 50)
                wdf = rsi(wdf, 14)
                wdf.to_csv(wfname, index=False)
def trigger_index_stats(index, a, b, success_window):
    with open(make_input_file(index)) as csvfile:
        symbols = [
            row[0]
            for ind, row in enumerate(csv.reader(csvfile.read().splitlines()))
            if ind > 0
        ]

    stats_table = [[
        'Trigger_name', 'Index', 'Avg_gain', 'Success_rate', 'Frequency'
    ]]

    weighted_gain = weighted_rate = cnt = 0
    for symbol in symbols:
        trigger = triggers.trigger_sporadic(symbol, index, success_window)
        stats = success_rate(trigger, success_window)
        weighted_gain += stats.avg_gain * stats.frequency
        weighted_rate += stats.success_rate * stats.frequency
        cnt += stats.frequency
    stats_table.append([
        'trigger_sporadic', index, weighted_gain / cnt, weighted_rate / cnt,
        cnt
    ])

    weighted_gain = weighted_rate = cnt = 0
    for symbol in symbols:
        trigger = triggers.trigger_macd_trend(symbol, index, a, b,
                                              success_window)
        stats = success_rate(trigger, success_window)
        weighted_gain += stats.avg_gain * stats.frequency
        weighted_rate += stats.success_rate * stats.frequency
        cnt += stats.frequency
    stats_table.append([
        'trigger_macd_trend', index, weighted_gain / cnt, weighted_rate / cnt,
        cnt
    ])

    weighted_gain = weighted_rate = cnt = 0
    for symbol in symbols:
        trigger = triggers.trigger_rsi_trend(symbol, index, a, b,
                                             success_window)
        stats = success_rate(trigger, success_window)
        weighted_gain += stats.avg_gain * stats.frequency
        weighted_rate += stats.success_rate * stats.frequency
        cnt += stats.frequency
    stats_table.append([
        'trigger_rsi_trend', index, weighted_gain / cnt, weighted_rate / cnt,
        cnt
    ])

    weighted_gain = weighted_rate = cnt = 0
    for symbol in symbols:
        trigger = triggers.trigger_rsi_low(symbol, index, success_window)
        stats = success_rate(trigger, success_window)
        weighted_gain += stats.avg_gain * stats.frequency
        weighted_rate += stats.success_rate * stats.frequency
        cnt += stats.frequency
    stats_table.append([
        'trigger_rsi_low', index, weighted_gain / cnt, weighted_rate / cnt, cnt
    ])

    weighted_gain = weighted_rate = cnt = 0
    for symbol in symbols:
        trigger = triggers.trigger_rsi_high(symbol, index, success_window)
        stats = success_rate(trigger, success_window)
        weighted_gain += stats.avg_gain * stats.frequency
        weighted_rate += stats.success_rate * stats.frequency
        cnt += stats.frequency
    stats_table.append([
        'trigger_rsi_high', index, weighted_gain / cnt, weighted_rate / cnt,
        cnt
    ])

    weighted_gain = weighted_rate = cnt = 0
    for symbol in symbols:
        trigger = triggers.trigger_bband_lowerflat(symbol, index, a,
                                                   success_window)
        stats = success_rate(trigger, success_window)
        weighted_gain += stats.avg_gain * stats.frequency
        weighted_rate += stats.success_rate * stats.frequency
        cnt += stats.frequency
    stats_table.append([
        'trigger_bband_lowerflat', index, weighted_gain / cnt,
        weighted_rate / cnt, cnt
    ])

    weighted_gain = weighted_rate = cnt = 0
    for symbol in symbols:
        trigger = triggers.trigger_bband_upbreak(symbol, index, a,
                                                 success_window)
        stats = success_rate(trigger, success_window)
        weighted_gain += stats.avg_gain * stats.frequency
        weighted_rate += stats.success_rate * stats.frequency
        cnt += stats.frequency
    stats_table.append([
        'trigger_bband_upbreak', index, weighted_gain / cnt,
        weighted_rate / cnt, cnt
    ])

    weighted_gain = weighted_rate = cnt = 0
    for symbol in symbols:
        trigger = triggers.trigger_bband_downbreak(symbol, index, a,
                                                   success_window)
        stats = success_rate(trigger, success_window)
        weighted_gain += stats.avg_gain * stats.frequency
        weighted_rate += stats.success_rate * stats.frequency
        cnt += stats.frequency
    stats_table.append([
        'trigger_bband_downbreak', index, weighted_gain / cnt,
        weighted_rate / cnt, cnt
    ])

    weighted_gain = weighted_rate = cnt = 0
    for symbol in symbols:
        trigger = triggers.trigger_above_20wma(
            symbol, index, 10, 2
        )  # weekly data has n=10, successwindow=2, different from daily data
        stats = success_rate(trigger, success_window)
        weighted_gain += stats.avg_gain * stats.frequency
        weighted_rate += stats.success_rate * stats.frequency
        cnt += stats.frequency
    stats_table.append([
        'trigger_above_20wma', index, weighted_gain / cnt, weighted_rate / cnt,
        cnt
    ])

    with open(
            os.path.join(settings['folder']['results'],
                         index + '_results.csv'), 'wt') as csvfile:
        csv.writer(csvfile, delimiter=",").writerows(stats_table)
    return stats_table
import datetime
import os
import pandas as pd
import sys

index = 'dow30'
source = 'quandl'
today = datetime.date.today()
start_date = str(today - datetime.timedelta(365))
end_date = str(today)
trigger_start_date = str(today - datetime.timedelta(14))
a, b, success_window = 5, 2, 0  # success_window=0 for forecast realtime
# a and b is for particular trigger, e.g. GS, macd corss up, 5 consecutive neg values followed by 2 positive values

# load symbols
with open(make_input_file(index)) as csvfile:
    symbols = [
        row[0]
        for ind, row in enumerate(csv.reader(csvfile.read().splitlines()))
        if ind > 0
    ]

# get recent data and ta indicators
preprocess(source,
           index,
           start_date,
           end_date,
           force_rerun=True,
           force_rerun_ta=True)

# apply trigger based on ta indicators
from __future__ import absolute_import

from collections import namedtuple
import csv

from strategy_platform.preprocess.yahoo_download import download_batch
from strategy_platform.preprocess.make_file import make_input_file, make_output_file

start_date = '1997-01-01'
end_date = '2017-01-15'
index = 'nasdaq100'

# load symbol name, note that nasdaq and sp500 has overlap, take overlap off nasdaq
with open(make_input_file('nasdaq100')) as csvfile:
    nasdaq100_symbols = [
        row[0]
        for ind, row in enumerate(csv.reader(csvfile.read().splitlines()))
        if ind > 0
    ]
with open(make_input_file('sp500')) as csvfile:
    sp500_symbols = [
        row[0] for ind, row in enumerate(csv.reader(csvfile)) if ind > 0
    ]
symbols = list(set(nasdaq100_symbols) - set(sp500_symbols))

# download trading data
daily_data = download_batch(symbols, index, start_date, end_date, 'd',
                            make_output_file(index, 'daily'))

weekly_data = download_batch(symbols, index, start_date, end_date, 'w',
                             make_output_file(index, 'weekly'))