淺談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棒的長度,一開始小弟也覺得很有趣,不過時間久了,也就乏了。穩定的訊號來源,可靠的技術分析及下單進出策略才是專注的目標。


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

留言
avatar-img
留言分享你的想法!
avatar-img
Gary Hu的沙龍
4會員
11內容數
Gary Hu的沙龍的其他內容
2025/04/14
從2023年之前,美股會直接預扣30% 股息預扣稅率,但是在2023年通過台美稅務協定後,你想在美國券商(例如 TD Ameritrade、Firstrade、Charles Schwab 等)享有台美稅務協定下的21% 股息預扣稅率,關鍵就在於正確填寫並提交一份W-8BEN 表格。 以下是步
Thumbnail
2025/04/14
從2023年之前,美股會直接預扣30% 股息預扣稅率,但是在2023年通過台美稅務協定後,你想在美國券商(例如 TD Ameritrade、Firstrade、Charles Schwab 等)享有台美稅務協定下的21% 股息預扣稅率,關鍵就在於正確填寫並提交一份W-8BEN 表格。 以下是步
Thumbnail
2024/12/21
小弟走跳江湖多年,也累績了一些職場心得,在年底轉職熱門時刻,希望能夠幫助到一些有緣人。
2024/12/21
小弟走跳江湖多年,也累績了一些職場心得,在年底轉職熱門時刻,希望能夠幫助到一些有緣人。
2024/10/13
本地端生成式AI工具LM Studio安裝介紹,包含如何手動載入AI模型的技巧。
Thumbnail
2024/10/13
本地端生成式AI工具LM Studio安裝介紹,包含如何手動載入AI模型的技巧。
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
本文介紹了一種名為「時間轉折」的股票投資技術,利用時間來預測股票價格的轉折點。作者分享了從股價波段高點或相對高尾爆大量起算,第8、13、21根k棒的走勢可能出現轉折的方法。同時,作者解釋了時間轉折與黃金分割率以及費波那契數列的關係。如果你對股票投資感興趣,這篇文章絕對值得一讀。
Thumbnail
本文介紹了一種名為「時間轉折」的股票投資技術,利用時間來預測股票價格的轉折點。作者分享了從股價波段高點或相對高尾爆大量起算,第8、13、21根k棒的走勢可能出現轉折的方法。同時,作者解釋了時間轉折與黃金分割率以及費波那契數列的關係。如果你對股票投資感興趣,這篇文章絕對值得一讀。
Thumbnail
上課囉! 今天來分享一個用5分K放空的教學,用K棒的價格與成交量來判斷放空與回補的位置。 股價連續兩日漲停而且價漲量增,第三天開盤爆更大量,若大盤當天走勢偏弱,個股價格與成交量出現背離現象可以等一根黑K出現,等待下一根K棒收盤跌破此黑K低點進場空單,K棒"收盤價"站上此價位停損, 後續K
Thumbnail
上課囉! 今天來分享一個用5分K放空的教學,用K棒的價格與成交量來判斷放空與回補的位置。 股價連續兩日漲停而且價漲量增,第三天開盤爆更大量,若大盤當天走勢偏弱,個股價格與成交量出現背離現象可以等一根黑K出現,等待下一根K棒收盤跌破此黑K低點進場空單,K棒"收盤價"站上此價位停損, 後續K
Thumbnail
所有的K棒都是真真實實用資金砸出來的,因此去看懂K棒的最高點、最低點、開盤價與收盤價很重要。 技術分析不能一成不變,要隨著趨勢來畫線。使用不同的週期來畫線,短線操作者(採用日K棒即可),因為我們主要是做選擇權,期貨則是需要更長的週期來看。 技術分析的兩大流派就是逆勢交易與順勢
Thumbnail
所有的K棒都是真真實實用資金砸出來的,因此去看懂K棒的最高點、最低點、開盤價與收盤價很重要。 技術分析不能一成不變,要隨著趨勢來畫線。使用不同的週期來畫線,短線操作者(採用日K棒即可),因為我們主要是做選擇權,期貨則是需要更長的週期來看。 技術分析的兩大流派就是逆勢交易與順勢
Thumbnail
在交易千萬別見樹不見林 中示範如何在同一張圖表上加入不同週期的行情走勢,本篇將對MultiCharts初體驗-函式撰寫、MultiCharts初體驗-訊號撰寫 的程式進行改寫,讓程式可以讀取到多週期的K線資料。 在MC中可以用Data1、Data2、⋯⋯、Data99的指定方式,來存取圖表中的數列
Thumbnail
在交易千萬別見樹不見林 中示範如何在同一張圖表上加入不同週期的行情走勢,本篇將對MultiCharts初體驗-函式撰寫、MultiCharts初體驗-訊號撰寫 的程式進行改寫,讓程式可以讀取到多週期的K線資料。 在MC中可以用Data1、Data2、⋯⋯、Data99的指定方式,來存取圖表中的數列
Thumbnail
  每個語法都像是一塊積木,我們必須擁有這些各式各樣的積木才能一層層向上構建屬於自己的策略腳本。在所有的策略腳本中,在這篇我們想描述一些在腳本中最基本的語法:「K棒」、「時間」、「日期」。   「K棒」是最基本的元素。透過「K棒」,我們能夠衍生出其他指標或技術分析。那麼,就讓我們從「K棒」開始認
Thumbnail
  每個語法都像是一塊積木,我們必須擁有這些各式各樣的積木才能一層層向上構建屬於自己的策略腳本。在所有的策略腳本中,在這篇我們想描述一些在腳本中最基本的語法:「K棒」、「時間」、「日期」。   「K棒」是最基本的元素。透過「K棒」,我們能夠衍生出其他指標或技術分析。那麼,就讓我們從「K棒」開始認
Thumbnail
新手要開始投資,先學什麼技能最划算?不要懷疑!學會看懂k線結構最划算。因為k線已經包含了「一段時間的價格趨勢」、「價格的演進方式」甚至「市場的交易行為」更重要的是對新手而言,是最容易「取得到的資訊」。 第一點 k線的「組成結構」 第二點 k線的「成交量」 第三點 k線的「成交量分布」
Thumbnail
新手要開始投資,先學什麼技能最划算?不要懷疑!學會看懂k線結構最划算。因為k線已經包含了「一段時間的價格趨勢」、「價格的演進方式」甚至「市場的交易行為」更重要的是對新手而言,是最容易「取得到的資訊」。 第一點 k線的「組成結構」 第二點 k線的「成交量」 第三點 k線的「成交量分布」
Thumbnail
本文將會帶你認識:    1.K線是什麼?  2.K線怎麼畫出來的?  3.K線圖怎麼看? 一、K線是什麼? K線來記錄股市某段期間的股價,(英文:Candlestick Charts),  K線是根據股價一天(或者某一周期)走勢中形成的四個價位: 開盤價、最高價、最低價、收盤價(開、高、低、收
Thumbnail
本文將會帶你認識:    1.K線是什麼?  2.K線怎麼畫出來的?  3.K線圖怎麼看? 一、K線是什麼? K線來記錄股市某段期間的股價,(英文:Candlestick Charts),  K線是根據股價一天(或者某一周期)走勢中形成的四個價位: 開盤價、最高價、最低價、收盤價(開、高、低、收
Thumbnail
我曾經說過我的技術系統是各商品適用,包含各種不同期貨商品以及股票,曾經有伙伴問我,說他住在美國,平常在做的是美股,我的系統一樣可以用嗎?我說當然。不用說,以期貨而言,不同商品有他自己的特性,就像我們談股票時說的「股性」,指數、外匯、能源、金屬或農產品等,分別有其價格變動上的特色,例如有些商品適用日
Thumbnail
我曾經說過我的技術系統是各商品適用,包含各種不同期貨商品以及股票,曾經有伙伴問我,說他住在美國,平常在做的是美股,我的系統一樣可以用嗎?我說當然。不用說,以期貨而言,不同商品有他自己的特性,就像我們談股票時說的「股性」,指數、外匯、能源、金屬或農產品等,分別有其價格變動上的特色,例如有些商品適用日
Thumbnail
我曾經說過我的技術系統是各商品適用,包含各種不同期貨商品以及股票,曾經有伙伴問我,說他住在美國,平常在做的是美股,我的系統一樣可以用嗎?我說當然。不用說,以期貨而言,不同商品有他自己的特性,就像我們談股票時說的「股性」,指數、外匯、能源、金屬或農產品等,分別有其價格變動上的特色,例如有些商品適用日
Thumbnail
我曾經說過我的技術系統是各商品適用,包含各種不同期貨商品以及股票,曾經有伙伴問我,說他住在美國,平常在做的是美股,我的系統一樣可以用嗎?我說當然。不用說,以期貨而言,不同商品有他自己的特性,就像我們談股票時說的「股性」,指數、外匯、能源、金屬或農產品等,分別有其價格變動上的特色,例如有些商品適用日
Thumbnail
(提醒大家記得重新申請加入社團,然後一定要載入社問答留下訂閱基本資料,已經申請但還沒回答的伙伴記得再去回答嘿)   我曾經說過我的技術系統是各商品適用,包含各種不同期貨商品以及股票,曾經有伙伴問我
Thumbnail
(提醒大家記得重新申請加入社團,然後一定要載入社問答留下訂閱基本資料,已經申請但還沒回答的伙伴記得再去回答嘿)   我曾經說過我的技術系統是各商品適用,包含各種不同期貨商品以及股票,曾經有伙伴問我
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News