Example #1
0
def analyze_qvix():
    filename = 'vixBar.csv'
    fp = os.path.join(getDataDir(), RESEARCH, OPTION, 'qvix', filename)
    df = pd.read_csv(fp)

    df.datetime = df.datetime.map(lambda timestamp: datetime.fromtimestamp(timestamp / 1000))
    df['pre_close'] = df['close'].shift(1)
    df['open_change'] = (df['open'] - df['pre_close']) / df['pre_close']
    df['open_change'].hist(bins=100)
    df['open_change'].hist(bins=100, cumulative=True, normed=True)
Example #2
0
def get_neutral_continuous_bar(group='atm', level=1):
    """
    获取中性组合的分钟bar
    :param group: str, 'atm' or 'straddle'
    :param level:
    :return:
    """
    if group == 'atm':
        filename = 'atm_continuous_bar.csv'
    elif group == 'straddle':
        filename = 'straddle_continuous_bar_{}.csv'.format(level)
    else:
        return
    fp = os.path.join(getDataDir(), 'research', 'option', 'dailytask', filename)
    df = pd.read_csv(fp, index_col=0, parse_dates=True)
    return df
Example #3
0
def load_qvix_data(start=None, end=None):
    start = datetime(2016, 6, 13) if start is None else strToDate(start)
    # end = datetime.now() if end is None else strToDate(end)

    filename = 'vixBar.csv'
    fp = os.path.join(getDataDir(), RESEARCH, OPTION, 'qvix', filename)
    df = pd.read_csv(fp, index_col=0, parse_dates=True)
    df['pre_close'] = df['close'].shift(1)
    df.dropna(inplace=True)
    if end is None:
        df = df[start:]
    else:
        end = strToDate(end)
        df = df[start: end]
    df = copy(df)
    return df
Example #4
0
def analyze_atm_range(start_time, end_time):
    start_l = start_time.split(':')
    start_time = time(int(start_l[0]), int(start_l[1]))
    end_l = end_time.split(':')
    end_time = time(int(end_l[0]), int(end_l[1]))

    filename = 'atm_continuous_bar.csv'
    fp = os.path.join(getDataDir(), 'research', 'option', 'dailytask',
                      'atm_continuous_bar.csv')
    df = pd.read_csv(fp, index_col=0, parse_dates=True)
    df = df.groupby('tradeDay').apply(analyze_single_atm_range, start_time,
                                      end_time)

    all_count = len(df)
    higer_count = len(df[df.abs_change > 0])
    lower_count = len(df[df.abs_change <= 0])
    min = df.abs_change.min()
    max = df.abs_change.max()
    mean = df.abs_change.mean()
    median = df.abs_change.median()

    # df2 = df.iloc[-240:]
    # volume_mean = df2.volume.mean()

    print('-' * 30)
    print(u'昨日平值期权今日%s-%s价和对比:' % (':'.join(start_l), ':'.join(end_l)))
    print('-' * 30)
    print(u'总交易日:%s' % all_count)
    print(u'后面的时间价和更高交易日:%s' % higer_count)
    print(u'后面的时间价和更低交易日:%s' % lower_count)
    print(u'价和跌最低:%.2f' % (min * 10000))
    print(u'价和涨最高:%.2f' % (max * 10000))
    print(u'价和涨跌平均值:%.2f' % (mean * 10000))
    print(u'价和涨跌中位数:%.2f' % (median * 10000))
    # print(u'近一年成交量平均值:%.2f' % volume_mean)

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.set_title(u'%s-%s' % (':'.join(start_l), ':'.join(end_l)))
    ax.set_ylabel('trade_days')
    df.abs_change.hist(bins=100, ax=ax)
    filename = '{}_open.png'.format(
        u'%s-%s' % (start_time.strftime('%H%M'), end_time.strftime('%H%M')))
    fig.savefig(getTestPath(filename))
Example #5
0
def analyze_qvix_high_close():
    df = load_qvix_data()

    all_trade_days = len(df)

    df['h-c'] = df['high'] - df['close']
    df['h-c-ratio'] = (df['h-c'] / df['close']) * 100

    df2 = df[df['h-c'] > 0]
    df = copy(df2)
    h_gt_o_trade_days = len(df)

    for i in [5, 10, 20]:
        h_o_name = 'h-c-ma-{}'.format(i)
        df[h_o_name] = df['h-c'].rolling(i).mean()
        h_o_ratio_name = 'h-c-ratio-ma-{}'.format(i)
        df[h_o_ratio_name] = df['h-c-ratio'].rolling(i).mean()

    new_file = 'vix_bar_high_close_ma.csv'
    fp2 = os.path.join(getDataDir(), RESEARCH, OPTION, 'qvix', new_file)
    df.to_csv(fp2)

    print('-' * 30)
    print(u'自2016-6-13以来,期权论坛波值最高价大于收盘价的交易统计:')
    print('-' * 30)
    print(u'总交易日:%s' % all_trade_days)
    print(u'最高价大于收盘价的交易日:%s, 占比:%.3f %%' %
          (h_gt_o_trade_days,
           (float(h_gt_o_trade_days) / float(all_trade_days)) * 100))

    for n in range(0, 15):
        df_n = df[df['h-c-ratio'] > n]
        c_n = len(df_n)
        print(u'最高价对比收盘价百分比超过%s交易日:%s,占比:%.3f %%' %
              (n, c_n, (float(c_n) / float(h_gt_o_trade_days)) * 100))

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.set_title(u'Ratio(High To Close) Distribution')
    ax.set_ylabel('trade_days')
    df['h-c-ratio'].hist(bins=100, ax=ax)
    filename = '{}_open.png'.format('high_gt_close')
    fig.savefig(getTestPath(filename))
Example #6
0
def analyze_qvix():
    filename = 'qvix_daily.csv'
    fp = os.path.join(getDataDir(), RESEARCH, OPTION, 'qvix', filename)
    df = pd.read_csv(fp, index_col=0, parse_dates=True)

    df['prev_close'] = df.close.shift(1)
    df['vix_open_change'] = (df['open'] - df['prev_close']) / df['prev_close']
    df['vix_close_change'] = (df['close'] -
                              df['prev_close']) / df['prev_close']

    column_name_dict = {
        'open': VIX_OPEN,
        'high': VIX_HIGH,
        'low': VIX_LOW,
        'close': VIX_CLOSE,
        'vix_open_change': VIX_OPEN_CHANGE,
        'vix_close_change': VIX_CLOSE_CHANGE
    }

    df.rename(columns=column_name_dict, inplace=True)
    df.index.name = DATETIME
    # df.to_csv('vix.csv', encoding='utf-8-sig')
    return df
Example #7
0
 def testGetDirs(self):
     print(fn.getCurrentDir())
     print(fn.getParentDir())
     print(fn.getDataDir())
     print(fn.getTestDataDir())
     print(fn.getTestPath('test.csv'))
Example #8
0
def analyze_ohlc_relationship(data, a, b, direction):
    """
    研究OHLC的关系
    :param data: DataFrame
    :param a:
    :param b:
    :param direction:
    :return:
    """
    df = data
    # print(df.index)
    start_date = pd.to_datetime(df.index.values[0])
    end_date = pd.to_datetime(df.index.values[-1])
    print(start_date)
    all_trade_days = len(df)

    abs_change_name = '{}_{}_abs'.format(a, b)
    relative_change_name = '{}_{}_ratio'.format(a, b)

    df[abs_change_name] = df[b] - df[a]
    df[relative_change_name] = (df[abs_change_name] / df[a]) * 100

    if direction == 'up':
        df2 = df[df[abs_change_name] > 0]
        zh_cn = u'大于'
    elif direction == 'down':
        df2 = df[df[abs_change_name] < 0]
        zh_cn = u'小于'
    else:
        print('Wrong Direction')
        return

    df2 = copy(df2)
    select_trade_days = len(df2)
    select_ratio = float(select_trade_days) / float(all_trade_days) * 100

    for i in [5, 10, 20]:
        abs_ma_name = '{}_{}_ma{}'.format(a[0], b[0], i)
        df2[abs_ma_name] = df2[abs_change_name].rolling(i).mean()
        ratio_ma_name = '{}_{}_ratio_ma{}'.format(a[0], b[0], i)
        df2[ratio_ma_name] = df2[relative_change_name].rolling(i).mean()

    new_file = 'vix_bar_{}_{}_ma.csv'.format(a, b)
    fp2 = os.path.join(getDataDir(), RESEARCH, OPTION, 'qvix', new_file)
    df2.to_csv(fp2)

    print('-' * 30)
    print(u'自{}_{},期权论坛波值{}{}{}的交易统计:'.format(dateToStr(start_date), dateToStr(end_date), b, zh_cn, a))
    print('-' * 30)
    print(u'总交易日:%s' % all_trade_days)
    print(u'%s%s%s的交易日:%s, 占比:%.3f %%' % (b, zh_cn, a, select_trade_days, select_ratio))

    # for n in range(0, 15):
    #     ratio_array = df2[relative_change_name].values()
    #     count = len(ratio_array)

    # df_n = df[df['h-o-ratio'] > n]
    # c_n = len(df_n)
    # print(u'百分比超过%s交易日:%s,占比:%.3f %%' % (n, c_n, (float(c_n) / float(h_gt_o_trade_days)) * 100))

    fig = plt.figure(figsize=(16, 12))
    ax1 = fig.add_subplot(2, 1, 1)
    ax2 = fig.add_subplot(2, 1, 2)
    ax1.set_title(u'Ratio({} to {}) Distribution'.format(a, b))
    ax2.set_title(u'Ratio({} to {}) Cumulative Distribution'.format(a, b))

    plt.subplots_adjust(hspace=0.2)

    data = df[relative_change_name].values
    sns.distplot(data, bins=100, color='g', ax=ax1)
    sns.kdeplot(data, color='r', cumulative=True, ax=ax2)

    # ax1.set_xticks(ax1.get_xticks() / 2)
    # ax2.set_xticks(ax2.get_xticks() / 2)
    # ax1.set_yticks(ax1.get_yticks() / 2)
    # ax2.set_yticks(ax2.get_yticks() / 2)

    ax1.xaxis.set_major_locator(ticker.MultipleLocator(5))
    ax2.xaxis.set_major_locator(ticker.MultipleLocator(5))
    ax2.yaxis.set_major_locator(ticker.MultipleLocator(0.1))

    filename = '{}_to_{}_{}_{}_relationship.png'.format(dateToStr(start_date), dateToStr(end_date), a, b)
    fig.savefig(getTestPath(filename))