台指期日K折線圖

前言

我們可以利用一些簡單的定義,就能畫出市面上常見的折線圖。但將折線圖畫出來了,又該如何實際應用在交易中呢?每波上漲下跌的振幅與持續時間,是不是會有規律的分布呢?因此本文會先利用Multicharts蒐集台指期的日線相關資料,再利用Python進行分析。

資料整理

找出所有的轉折點(高點大於左右x日高點,低點低於左右x日低點),定義上漲為1,下跌為-1,盤整為0,並輸出轉折點日期、振幅、時間。將x帶入3、5、10日,即可得到三個周期的資料。

將5日轉折點畫在K棒上
input:
	len(5);
variable:
	count(0);

condition1 = True;
for count = 0 to len*2-1 begin
	if low[len] > low[count] then begin
		condition1 = False;
		break;
	end; 
end;

condition2 = True;
for count = 0 to len*2-1 begin
	if high[len] < high[count] then begin
		condition2 = False;
		break;
	end; 
end;

if condition1 then TL_New(date[len],time[len],low[len],date,time,low[len]);
if condition2 then TL_New(date[len],time[len],high[len],date,time,high[len]);
 
variable:
	pre_date(0), pre_price(0), pre_kbar_num(0), pre_type(0), 
	now_date(0), now_price(0), now_kbar_num(0), now_type(0);
if condition1 or condition2 then begin
	now_kbar_num = currentbar[len];
	now_date = date[len];
	if condition1 then begin
		now_price = low[len];
		now_type = -1;
	end;
	if condition2 then begin
		now_price = high[len];
		now_type = 1;
	end;
	value1 = 0;
	if now_type = 1 and pre_type = -1 then value1 = 1;
	if now_type = -1 and pre_type = 1 then value1 = -1;
	print(pre_date, ",", now_date, ",", value1, ",", now_kbar_num-pre_kbar_num, ",", (now_price-pre_price));
	pre_kbar_num = now_kbar_num;
	pre_price = now_price;
	pre_type = now_type;
	pre_date = now_date;
end;

資料分析

我們想先了解振福與持續時間的基本分布,因此把各個週期的散佈圖給畫出來。由下圖可以發現,一波上漲主要是集中在8天內,振福在500點左右。

def time_amp_scatter(f):
    df = pd.read_csv('data\high_low_' + str(f) + '.csv')
    df = df.astype(float)
    df.columns = ['pre_date', 'now_date', 'type', 'time', 'amp']
    df['type'] = df['type'].astype(int)
    print(df)
    sns.scatterplot(x='time', y='amp', hue='type', data=df, palette=sns.color_palette("muted", len(np.unique(df['type']))))
    plt.title('週期:' + str(f) + '天')
    plt.savefig('震幅與時間分布圖/' + '週期-' + str(f) + '天')
    plt.show()
週期為三天的時間與振幅散佈圖

接著,下圖中,1~5波我們在大周期中定義為上漲,但我們想知道1、3、5波分別的漲勢與時間,也想知道2、4波分別的跌勢與時間。因此我們利用已知大周期為上漲的條件下,來細分小周期。

波浪理論
def big_small_compare(big_type, small_type):
    df = pd.read_csv('data\high_low_3.csv')
    df2 = pd.read_csv('data\high_low_10.csv')
    df = df.astype(float)
    df2 = df2.astype(float)
    df.columns = ['pre_date', 'now_date', 'type', 'time', 'amp']
    df2.columns = ['pre_date', 'now_date', 'type', 'time', 'amp']
    df = df[df['type'] == small_type]
    df2 = df2[df2['type'] == big_type]
    ans = pd.DataFrame()
    for index, row in df2.iterrows():
        tmp = df.loc[(df.pre_date >= row['pre_date']) & (df.now_date <= row['now_date'])]
        tmp = tmp.assign(id=pd.Series(list(range(0, len(tmp)))).values)
        print(tmp)
        ans = ans.append(tmp)
    name = '大週期: ' + str(big_type) + ' 小週期: ' + str(small_type)
    plt.title(name)
    ans['id'] = ans['id'].astype(int)
    sns.scatterplot(x='time', y='amp', hue='id', data=ans, palette=sns.color_palette("muted", len(np.unique(ans['id']))))
    plt.savefig('大週期10天小週期3天/' + name.replace(':', '-')+'.jpg')
    plt.show()
大周期為上漲的條件下,小周期上漲的時間與振幅散佈圖(id為第幾波上漲)

有了這些後,我們還是不太清楚哪些持續時間與震幅比較容易出現,因此我們就繪製了直方圖,來觀察各個周期容易出現的時間。

def big_small_times_amp_count(big_type, small_type):
    df = pd.read_csv('data\high_low_3.csv')
    df2 = pd.read_csv('data\high_low_10.csv')
    df = df.astype(float)
    df2 = df2.astype(float)
    df.columns = ['pre_date', 'now_date', 'type', 'time', 'amp']
    df2.columns = ['pre_date', 'now_date', 'type', 'time', 'amp']
    df = df[df['type'] == small_type]
    df2 = df2[df2['type'] == big_type]
    ans = pd.DataFrame()
    for index, row in df2.iterrows():
        tmp = df.loc[(df.pre_date >= row['pre_date']) & (df.now_date <= row['now_date'])]
        ans = ans.append(tmp)
    # print(ans[name].value_counts())
    ans['time'].value_counts().sort_index().plot(kind='bar')
    plt.xlabel('時間')
    plt.ylabel('出現次數')
    plt.title('大週期:' + str(big_type) + ' 小週期:' + str(small_type))
    plt.tight_layout()
    plt.savefig('震幅與時間次數圖/' + '大週期-' + str(big_type) + ' 小週期-' + str(small_type) + '時間.jpg')
    plt.show()
    sns.distplot(ans['amp'], kde=False, bins=50)
    plt.xlabel('震幅')
    plt.ylabel('出現次數')
    plt.title('大週期:' + str(big_type) + ' 小週期:' + str(small_type))
    plt.tight_layout()
    plt.savefig('震幅與時間次數圖/' + '大週期-' + str(big_type) + ' 小週期-' + str(small_type) + '震幅.jpg')
    plt.show()
大周期為上漲,小周期也是上漲的振幅分布圖
大周期為上漲,小周期也是上漲的時間分布圖

所有的圖表與程式碼都在github上,若有需要參考可點下方連結。

https://github.com/wcchang1019/futures_time_amp_research

參考資料

https://histock.tw/blog/histock1688/206