淺談K棒生成

閱讀時間約 15 分鐘


聊到股票或是期貨技術分析,最基本的事情就是將即時報價轉換成K棒,也就是OHLC格式﹔某個時段的開始價 (Open),最高價 (High),最低價 (Low) 與結束價 (Close),時段長短常見的有三分鐘,五分鐘,一小時,或是一天,端看個人喜好。


前文有提到過小弟是透過群益API接收即時報價,他的格式大概就像這樣﹔某一檔股票在幾月幾號幾點幾分幾秒的成交價與成交量。這邊是一秒內所接收的資料量範例。


TX00,20230508 090000 006000,15749.00,12
TX00,20230508 090000 057000,15749.00,3
TX00,20230508 090000 167000,15749.00,2
TX00,20230508 090000 263000,15747.00,1
TX00,20230508 090000 289000,15747.00,1
TX00,20230508 090000 304000,15747.00,1
TX00,20230508 090000 308000,15747.00,1
TX00,20230508 090000 309000,15747.00,4
TX00,20230508 090000 309000,15748.00,1
TX00,20230508 090000 338000,15746.00,2
TX00,20230508 090000 350000,15748.00,2
TX00,20230508 090000 383000,15748.00,1
TX00,20230508 090000 403000,15748.00,1
TX00,20230508 090000 410000,15748.00,1
TX00,20230508 090000 439000,15748.00,1
TX00,20230508 090000 448000,15748.00,1
TX00,20230508 090000 452000,15748.00,3
TX00,20230508 090000 547000,15748.00,1
TX00,20230508 090000 607000,15746.00,1
TX00,20230508 090000 620000,15746.00,1
TX00,20230508 090000 664000,15746.00,1
TX00,20230508 090000 678000,15747.00,1
TX00,20230508 090000 690000,15745.00,1
TX00,20230508 090000 817000,15745.00,1
TX00,20230508 090000 844000,15745.00,1
TX00,20230508 090000 998000,15747.00,1
TX00,20230508 090000 998000,15748.00,5
TX00,20230508 090001 003000,15749.00,6


這邊需要注意的是有時候成交量跟次數會突然爆大量,所以小弟採用RAMDisk與ConcurrentQueue來處理巨量資料產生的現象。另外一個常遇到的問題就是群益API接收即時報價有時候會缺少某些筆的資料,所以往往還需要在收盤之後,重新要求重送當日全部的報價資料做一個回歸校正,至於為什麼即時報價會少資料,小弟還是不清楚原因,可能跟網路頻寬或是設備負載有關吧,還希望網路神人能夠幫忙解惑,只求即時技術分析的精準度不要受到太大影響。


接著我們透過C#的LINQ表示式將即時報價轉為OHLC格式,在這邊我們需要注意到依據不同分析習慣,有退位與進位表示式,也就是說早上九點到九點五分時段裡所有報價匯集成的K棒是應該放在九點這個點還是九點五分這個點。小弟是習慣採用進位表示式,所以以下的內文都以此為準。


private IEnumerable<OHLCBar> GenerateOHLCBars(IEnumerable<Tick> ticks, long barSizeInTicks)
{
TimeSpan naturalTime = new TimeSpan(8, 45, 0);
var bars = from tick in ticks
let barIndexForDay = Math.Floor(tick.Timestamp.TimeOfDay.Subtract(naturalTime).TotalSeconds / barSizeInTicks)
let barBeginDateTime = tick.Timestamp.Date.Add(naturalTime).AddSeconds(barIndexForDay * barSizeInTicks)
let barEndDateTime = tick.Timestamp.Date.Add(naturalTime).AddSeconds((barIndexForDay + 1) * barSizeInTicks)
group tick by new { barBeginDateTime, barEndDateTime, tick.Symbol } into tickGroup
orderby tickGroup.Key.barBeginDateTime
let orderedPrices = tickGroup.OrderBy(t => t.Timestamp).Select(t => t.Price)
select new OHLCBar
{
Symbol = tickGroup.Key.Symbol,
OPEN = orderedPrices.First(),
CLOSE = orderedPrices.Last(),
HIGH = orderedPrices.Max(),
LOW = orderedPrices.Min(),
VOLUME = Convert.ToUInt32(tickGroup.Sum(t => t.Volume)),
BeginTime = tickGroup.Key.barBeginDateTime,
EndTime = tickGroup.Key.barEndDateTime,
Interval = TimeSpan.FromSeconds(barSizeInTicks)
};
return bars;
}


所以匯集不同長度K棒的時候,也需要統一設定為進位格式。


public static IEnumerable<Quote> Aggregate<TQuote>(
this IEnumerable<TQuote> quotes,
PeriodSize newSize)
where TQuote : IQuote
{
// handle no quotes scenario
if (quotes == null || !quotes.Any())
{
return new List<Quote>();
}
// parameter conversion
TimeSpan timeSpan = newSize.ToTimeSpan();
if (timeSpan <= TimeSpan.Zero)
{
throw new ArgumentOutOfRangeException(nameof(timeSpan), timeSpan,
"Quotes Aggregation must use a usable new size value (see documentation for options).");
}

// return aggregation with RoundUp
return quotes
.OrderBy(x => x.Date)
.GroupBy(x => x.Date.RoundUp(timeSpan))
.Select(x => new Quote
{
Date = x.Key,
Open = x.First().Open,
High = x.Max(t => t.High),
Low = x.Min(t => t.Low),
Close = x.Last().Close,
Volume = x.Sum(t => t.Volume)
});
}


其中的時段單位可以設定為不同長度,端看個人喜好。


internal static TimeSpan ToTimeSpan(this PeriodSize periodSize)
{
return periodSize switch
{
PeriodSize.OneMinute => TimeSpan.FromMinutes(1),
PeriodSize.TwoMinutes => TimeSpan.FromMinutes(2),
PeriodSize.ThreeMinutes => TimeSpan.FromMinutes(3),
PeriodSize.FiveMinutes => TimeSpan.FromMinutes(5),
PeriodSize.FifteenMinutes => TimeSpan.FromMinutes(15),
PeriodSize.ThirtyMinutes => TimeSpan.FromMinutes(30),
PeriodSize.OneHour => TimeSpan.FromHours(1),
PeriodSize.TwoHours => TimeSpan.FromHours(2),
PeriodSize.FourHours => TimeSpan.FromHours(4),
PeriodSize.Day => TimeSpan.FromDays(1),
PeriodSize.Week => TimeSpan.FromDays(7),
_ => TimeSpan.Zero
};
}


另外一個有趣的問題就是如何準確地每五分鐘執行一次K棒資料彙集的動作。不管任何電腦,都存在時間執行誤差的問題,假設第一次執行的時候,是早上九點準,我們要如何保證下一次起來執行的時間是九點五分準,如果我們單純的設定五分鐘,這會導致執行誤差會隨著時間的遞移而越變越長,所以這裡我們透過計算目前電腦滴答(tick)的差距來對齊下一次時間執行時間。


public static double Align(this DateTime dateTime, TimeSpan interval) // 對齊
{
var diff = (interval.Ticks - (dateTime.Ticks % interval.Ticks)) / TimeSpan.TicksPerMillisecond;

return diff == 0 ? 1 : diff;
}


某些市面上的股市軟體會即時地劃出K棒,所以畫面上會看到K棒不斷地變化,直至下一個時間段到來才固定此時間段K棒的長度,一開始小弟也覺得很有趣,不過時間久了,也就乏了。穩定的訊號來源,可靠的技術分析及下單進出策略才是專注的目標。


最後還是祝福大家都能夠賺大錢!

4會員
9內容數
留言0
查看全部
發表第一個留言支持創作者!
Gary Hu的沙龍 的其他內容
利用C語言透過WMI服務偵測Windows系統裝置管理員裡面的黃色驚嘆號
透過C#取得臺灣證券交易所與證券櫃檯買賣中心OpenAPI公司治理與財務報表等資料進行分析。
利用C#爬蟲查詢每日的小台指散戶多空比
透過C#去證券櫃檯買賣中心爬取買賣日報表的程式介紹
透過C#實作台灣證券交易所買賣日報表查詢機器人
本文將討論在EWDK或WDK環境下如何取得時區差值與日光節約時間開啟與否的相關資訊,並記錄下相關研究結果。
利用C語言透過WMI服務偵測Windows系統裝置管理員裡面的黃色驚嘆號
透過C#取得臺灣證券交易所與證券櫃檯買賣中心OpenAPI公司治理與財務報表等資料進行分析。
利用C#爬蟲查詢每日的小台指散戶多空比
透過C#去證券櫃檯買賣中心爬取買賣日報表的程式介紹
透過C#實作台灣證券交易所買賣日報表查詢機器人
本文將討論在EWDK或WDK環境下如何取得時區差值與日光節約時間開啟與否的相關資訊,並記錄下相關研究結果。
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否當日為弱勢盤,當成交量能達到當日一定的量能時,當日順勢向下的盤面機率就會增加,適合空方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
▋訂單匹配 - Order Pairing K 棒的影線告訴你範圍,柱體告訴你故事。 Wick shows you the range, Body tells you the story. 可這句話聽起來很哲學、摸不著邊際吧! 這次主題分上下兩集來聊, 上集是以市場運作機制的角度來理解
Thumbnail
本篇文章分享了在近期市場波動中的交易經驗與學習,強調退場機制、槓桿比例和靈活性的重要性,以及應對市場風險的計畫。作者透過個人經歷,討論如何在多頭和回檔期小心操作並尋找最佳進場時機,同時也從市場行為的觀察中提出對策略建立的見解,認為應該在上漲時就開始規劃,而非遇到困難時才想出對策。
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否當日為攻擊盤,當成交量能達到當日一定的量能時,當日順勢向上的盤面機率就會增加,適合多方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
這篇是給初學技術分析者的建議,覺得去蕪存菁,最簡潔有效的東西。 1.認識什麼是K線,開高低收,成交量。 2.知道均線與均量的數學意義。 3.學習簡單的走勢型態,比如W底M頭,切線,跳空缺口。 以上3點就足夠了,不管基於什麼說法想法理由,都不要花時間去學任何其他指標。
K線的意思是某段期間的股價紀錄,K線圖的意思則是記錄市場某段期間的價格變化,屬於技術分析的一種。 包含股票、ETF、期貨、外匯等等商品,在觀察價格走勢時,其實都會使用到K線與K線圖。 本篇市場先生將介紹K線、K線圖,以及K線的16種型態。 本文市場先生會告訴你: K線是什麼? K線圖怎
Thumbnail
本文介紹了一種名為「時間轉折」的股票投資技術,利用時間來預測股票價格的轉折點。作者分享了從股價波段高點或相對高尾爆大量起算,第8、13、21根k棒的走勢可能出現轉折的方法。同時,作者解釋了時間轉折與黃金分割率以及費波那契數列的關係。如果你對股票投資感興趣,這篇文章絕對值得一讀。
Thumbnail
以下為個人研究心得分享,主要是判斷趨勢用於日內交易(當沖為準),僅供參考,不構成投資建議,當沖有風險一定要注意,該停損停利勿凹單勿貪! 周五盤前公開分享大盤看法,壓力支撐點位和趨勢,馬前砲可自行回測。 周一到周四沒意外的話盤前會在付費專欄更新。 偶爾會有個股分享(權重股為主)。 操作理念
Thumbnail
本文章介紹如何使用XQ的數據報價源,利用Excel設計動態的技術K線圖。完成學系後你將學會Excel個股動態技術K線圖,Excel期貨動態技術K線圖,Excel加權動態技術K線圖,Excel成交量製作,與Excel均線的繪製。
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否當日為弱勢盤,當成交量能達到當日一定的量能時,當日順勢向下的盤面機率就會增加,適合空方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
▋訂單匹配 - Order Pairing K 棒的影線告訴你範圍,柱體告訴你故事。 Wick shows you the range, Body tells you the story. 可這句話聽起來很哲學、摸不著邊際吧! 這次主題分上下兩集來聊, 上集是以市場運作機制的角度來理解
Thumbnail
本篇文章分享了在近期市場波動中的交易經驗與學習,強調退場機制、槓桿比例和靈活性的重要性,以及應對市場風險的計畫。作者透過個人經歷,討論如何在多頭和回檔期小心操作並尋找最佳進場時機,同時也從市場行為的觀察中提出對策略建立的見解,認為應該在上漲時就開始規劃,而非遇到困難時才想出對策。
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否當日為攻擊盤,當成交量能達到當日一定的量能時,當日順勢向上的盤面機率就會增加,適合多方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
這篇是給初學技術分析者的建議,覺得去蕪存菁,最簡潔有效的東西。 1.認識什麼是K線,開高低收,成交量。 2.知道均線與均量的數學意義。 3.學習簡單的走勢型態,比如W底M頭,切線,跳空缺口。 以上3點就足夠了,不管基於什麼說法想法理由,都不要花時間去學任何其他指標。
K線的意思是某段期間的股價紀錄,K線圖的意思則是記錄市場某段期間的價格變化,屬於技術分析的一種。 包含股票、ETF、期貨、外匯等等商品,在觀察價格走勢時,其實都會使用到K線與K線圖。 本篇市場先生將介紹K線、K線圖,以及K線的16種型態。 本文市場先生會告訴你: K線是什麼? K線圖怎
Thumbnail
本文介紹了一種名為「時間轉折」的股票投資技術,利用時間來預測股票價格的轉折點。作者分享了從股價波段高點或相對高尾爆大量起算,第8、13、21根k棒的走勢可能出現轉折的方法。同時,作者解釋了時間轉折與黃金分割率以及費波那契數列的關係。如果你對股票投資感興趣,這篇文章絕對值得一讀。
Thumbnail
以下為個人研究心得分享,主要是判斷趨勢用於日內交易(當沖為準),僅供參考,不構成投資建議,當沖有風險一定要注意,該停損停利勿凹單勿貪! 周五盤前公開分享大盤看法,壓力支撐點位和趨勢,馬前砲可自行回測。 周一到周四沒意外的話盤前會在付費專欄更新。 偶爾會有個股分享(權重股為主)。 操作理念
Thumbnail
本文章介紹如何使用XQ的數據報價源,利用Excel設計動態的技術K線圖。完成學系後你將學會Excel個股動態技術K線圖,Excel期貨動態技術K線圖,Excel加權動態技術K線圖,Excel成交量製作,與Excel均線的繪製。