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)
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
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
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))
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))
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
def testGetDirs(self): print(fn.getCurrentDir()) print(fn.getParentDir()) print(fn.getDataDir()) print(fn.getTestDataDir()) print(fn.getTestPath('test.csv'))
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))