今天盯盘的时候偶然间发现一款meme币竟然有高达88%的涨幅,所以决定应用相似K线技术对其做空。
因为考虑到(1)购买合约每4小时就需要缴纳资金费(2)这种meme币段时间的波动就较大。所以我接入API获取所有种类5min级别的数据 (High、Low、Open、Close、Volume)。
绘制当下时间以及过去1500(300*5)分钟的 K线图:
end = '2025-02-08 23:40:00'
end = datetime.datetime.strptime(end, "%Y-%m-%d %H:%M:%S")
start = get_previous_trading_hour(end,300)
stock_a = merged_df.loc['GODS-USDT'].loc[start:end]
mpf.plot(stock_a, type='candle', volume=True,style='yahoo')
注:这里的时间为UTC时间
要找到与目标相似形态的K线,除了上文获取到的5个量价指标外,还可以构建别的特征:
def get_dev_feature(df):
df_tmp = df.copy()
# 价格变化率
df_tmp['pct'] = df_tmp['close'].pct_change()
# 振幅
df_tmp['hl'] = df_tmp['high']/df_tmp['low'] - 1
# 上影线
df_tmp['hc'] = (df_tmp['high']/df_tmp[['close','open']].max(axis = 1)) - 1
# 下影线
df_tmp['lc'] = (df_tmp['low']/df_tmp[['close','open']].min(axis = 1)) - 1
return df_tmp
之后再查找过去历史中,与这段时间内该币相似度较高的时间段和币种:
def get_match_hist_kline(price,stock,end):
dt = pd.DataFrame(columns=['stock','startdate','enddate','T'])
start = get_previous_trading_min(end,39)
stock_a = get_dev_feature(price.loc[stock].loc[start:end])
stock_a = stock_a.reset_index().drop(['timestamp'],axis = 1)
stocklist = sorted(set(price.index.get_level_values(0)))
datelist = sorted(set(price.index.get_level_values(1)))
datelist = datelist[:datelist.index(get_previous_trading_min(end,5))]
y = 0
for stock in tqdm(stocklist):
stock_b = price.loc[stock]
for d in datelist[8:-8:3]:
s = get_previous_trading_min(d,39)
stock_b_tmp = get_dev_feature(stock_b.loc[s:d])
if len(stock_b_tmp) == 8:
stock_b_tmp = stock_b_tmp.reset_index().drop(['timestamp'],axis = 1)
T = stock_b_tmp.corrwith(stock_a).fillna(0).mean()
dt.loc[y] = [stock,s,d,T]
y += 1
dt = dt.sort_values(by='T',ascending=False).dropna()
return dt
将数据带入后得到相似度排序,取相似度最高的来进行比较分析:
注:GODS-USDT为我们要预测的种类
只选一种比较得出的结论较为片面,我们进一步绘制了上涨中继买入后25分钟的收益率随相似度衰减图:
fig = plt.figure()
axes = fig.add_axes([0.1, 0.1, 1, 0.618])
x1_list = list(highdt['ret_5'])
y=np.array(x1_list)
x=np.array(range(0,len(x1_list)))
axes.plot(x, y, 'r')
axes.set_xlabel('相似度递减',fontsize=10)
axes.set_ylabel('收益率',fontsize=10)
axes.set_title('上涨中继买入后25分钟收益率',fontsize=10)
由这张图可以看出数据呈现出偏态,但大部分都是涨幅小于0,即意味着在25min内就会下跌,所以果断小额买入进行实践,最终在15内获得了5%的收益。
改进与反思:
1、从发现机会到跑代码之间消耗了一定时间,导致没有找到最优买入点
2、K线相似技术只能大致预判未来的涨跌,但是无法预测具体涨跌的幅度,导致在我平仓后的半小后又出现一波更大的跌幅
3、接入API获取的数据具有局限性,不论是1min/5min/1day都只能获取前300个单位的,这导致能学习的样本较少,相似度不够高。