์˜ต์‹œ๋””์–ธ์ด ๋ญ๋ƒ๋ฉด, ๋ฉ”๋ชจ์žฅ ์ง„ํ™”๋ฒ„์ „์ž„. ์‚ฌ์ง„๋„ฃ๊ณ  ํ‘œ๋‚˜ ๊ฐ•์กฐํ‘œ์‹œ๊ฐ™์€๊ฑฐ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๊ฑฐ๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉํ•ด์„œ ํ™•์žฅ๊ฐ€๋Šฅํ•จ.

ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋Š”๊ฑฐ๊ณ , ๋‹ค๋ฅธ ๊ธฐ๊ธฐ์—์„œ๋„ ์‚ฌ์šฉํ•˜๊ณ ์‹ถ๋‹ค๋ฉด ๋™๊ธฐํ™”๋Š” ์ˆ˜๋™์œผ๋กœ ํ•ด์ค˜์•ผํ•จ.


์˜ต์‹œ๋””์–ธ์€ ์ด ์•„์žฌ๊ฐ€ ์ž˜ ์„ค๋ช…ํ•ด๋†จ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๊ณ 

https://gall.dcinside.com/mgallery/board/view?id=chartanalysis&no=4532257


๊ฐœ์ธ์ ์ธ ์˜ต์‹œ๋””์–ธ.ai ์…‹์—…๊ณผ ํ™œ์šฉ(์žฅ๋ฌธ์ฃผ์˜)์ €๋Š” ์ด๋ ‡๊ฒŒ ์“ฐ๊ณ ์žˆ์Šต๋‹ˆ๋‹คย ๋ฌผ๋ก  ๋‚ ๊ณ  ๊ธฐ๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ๋‹˜๋“ค๊ณผ AI์˜ ์„ ๋‘์ฃผ์ž๋“ค์€ ๋” ๋ฝ•๋นจ๋‚˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ฒ ์ง€๋งŒย ์ €๋Š” ๋”ฑ ์š”์ •๋„๋กœ๋งŒ ์“ฐ๊ณ  ์žˆ๋„ค์š”ย ์—Š๊ทธ์ œ ์˜ต์‹œ๋””์–ธAi ์–ด์ผ€ ์“ฐ๋Š”์ง€ ์•Œ๋ ค๋‹ฌ๋ผ๋Š” ์š”์ฒญ์— ๋ช‡์ž ์ ์—ˆ์Šต๋‹ˆ๋‹คhttps:/gall.dcinside.com




1. ๋‹ค์šด๋กœ๋“œ

Download - ObsidianObsidian is available on all major platforms. Download Obsidian for iOS, Android, macOS, Windows and Linux.obsidian.md


https://obsidian.md/download


๊ธฐ๋ณธ์ ์œผ๋กœ ํ”ผ์‹œ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž‘์„ฑํ•จ. ๋ชจ๋ฐ”์ผ์€ ๋ถˆํŽธํ•จ....



2. ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜


์˜ค๋Š˜ ๊ณต์œ ํ•  ํ…œํ”Œ๋ฆฟ์— ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด๊ณ  ์›ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์žˆ์œผ๋ฉด ์„ค์น˜ํ•ด๋„ ๋Œ

์„ค์น˜ํ•˜๊ณ  ํ™œ์„ฑํ™”๊นŒ์ง€ ํ•ด์ฃผ์ž



3. ์ผ์ง€ ํ…œํ”Œ๋ฆฟ


ํ…œํ”Œ๋ฆฟ ํด๋”(์•„๋ฌด์ด๋ฆ„์ด๋‚˜ ์ƒ๊ด€์—†์Œ)๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ ์ƒ์„ฑํ•ด์„œ ๋‹ค์Œ ๋‚ด์šฉ ๋ถ™์—ฌ๋„ฃ๊ธฐ (์ปจํŠธ๋กค+์‰ฌํ”„ํŠธ+V๋กœ ๋ถ™์—ฌ๋„ฃ์–ด์•ผ์ง€ ์ œ๋Œ€๋กœ ๋“ค์–ด๊ฐ)



---

date: <% tp.date.now("YYYY-MM-DD") %>

tickers:

start_balance: <% tp.system.prompt("์‹œ์ž‘ ์ž”๊ณ ") %>

end_balance:

transfer:

position_count:

---

# PNL

`= default(number(this.end_balance), 0) - default(number(this.start_balance), 0) - default(number(this.transfer), 0)`


4. ์„ค์ • ๋ณ€๊ฒฝ




์ด๋ฏธ์ง€ ์ €์žฅํด๋” ๋ณ€๊ฒฝ - ์ผ์ง€ ์“ฐ๋ฉด์„œ (์œˆ๋„ํ‚ค+์‰ฌํ”„ํŠธ+S)๋กœ ์บก์ณํ•˜๊ณ  ๋ถ™์—ฌ๋„ฃ๊ธฐ๋กœ ์ด๋ฏธ์ง€ ๋ฐ”๋กœ ๋„ฃ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ์ €์žฅ๋  ํด๋” ์„ค์ •




ํ…œํ”Œ๋ฆฟ ์ €์žฅ๋œ ํด๋” ์„ค์ •.




5. ์ผ์ผ ๋…ธํŠธ ์ƒ์„ฑ


์ฑŒ๋ฆฐ์ง€ ํด๋”์— ์ƒˆ ๋…ธํŠธ -> ์ œ๋ชฉ์€ ์˜ค๋Š˜๋‚ ์งœ yyyy-mm-dd ํ˜•์‹์œผ๋กœ ์ž…๋ ฅ


6. ๋Œ€์‹œ๋ณด๋“œ ์„ธํŒ…


! ๋Œ€์‹œ๋ณด๋“œ (๋˜๋Š” ์•„๋ฌด์ด๋ฆ„์ด๋‚˜) ๋ฉ”๋ชจ ์ƒ์„ฑ ํ›„ ๋‹ค์Œ ๋‚ด์šฉ ๋ถ™์—ฌ๋„ฃ๊ธฐ, ์ด๊ฒƒ๋„ ์ปจํŠธ๋กค+์‰ฌํ”„ํŠธ+V๋กœ ๋ถ™์—ฌ๋„ฃ์–ด์•ผ์ง€ ์ œ๋Œ€๋กœ ๋“ค์–ด๊ฐ.ย 


ํ•˜๋‚˜ ์ˆ˜์ •ํ•ด์ค˜์•ผํ• ๊ฒŒ ๋ฐ”๋กœ๋ฐ‘์— "๋ฐฑ๋ถˆ์ฑŒ" ๋ถ€๋ถ„์ธ๋ฐ, ์ด๊ฒƒ๋งŒ ์ฑŒ๋ฆฐ์ง€์šฉ ํด๋”๋ช…์œผ๋กœ ๊ต์ฒด



```dataviewjs

// 1. ๋‚ ์งœ ํ˜•์‹ ํ•„ํ„ฐ๋ง ๋ฐ ๋ฐ์ดํ„ฐ ์ •๋ ฌ

const dateRegex = /^\d{4}-\d{2}-\d{2}$/;

const pages = dv.pages('"๋ฐฑ๋ถˆ์ฑŒ"')

ย  ย  .where(p => dateRegex.test(p.file.name))

ย  ย  .sort(p => p.file.name);


const dates = [];

const endBalances = [];

const pnls = [];


// 2. ๋ฐ์ดํ„ฐ ์ถ”์ถœ ๋ฐ PnL ์‹ค์‹œ๊ฐ„ ๊ณ„์‚ฐ

for (let page of pages) {

ย  ย  dates.push(page.file.name);ย 


ย  ย  const start = Number(page.start_balance) || 0;

ย  ย  const end = Number(page.end_balance) || 0;

ย  ย  const transfer = Number(page.transfer) || 0;

ย  ย ย 

ย  ย  // ์ฐจํŠธ ๋ Œ๋”๋ง ์‹œ์ ์— PnL ์ง์ ‘ ๊ณ„์‚ฐ

ย  ย  const dailyPnl = end - start - transfer;

ย  ย ย 

ย  ย  endBalances.push(end);

ย  ย  pnls.push(dailyPnl);

}


// 3. ๋ณตํ•ฉ ์ฐจํŠธ(Line + Bar) ์„ค์ •

const chartData = {

ย  ย  type: 'bar', // ๊ธฐ๋ณธ ๊ณจ๊ฒฉ์€ ๋ง‰๋Œ€ํ˜•

ย  ย  data: {

ย  ย  ย  ย  labels: dates,

ย  ย  ย  ย  datasets: [

ย  ย  ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  ย  ย  type: 'line',

ย  ย  ย  ย  ย  ย  ย  ย  label: '์ด ์ž์‚ฐ (๊ธฐ๋ง์ž”๊ณ )',

ย  ย  ย  ย  ย  ย  ย  ย  data: endBalances,

ย  ย  ย  ย  ย  ย  ย  ย  backgroundColor: 'rgba(54, 162, 235, 0.2)',

ย  ย  ย  ย  ย  ย  ย  ย  borderColor: 'rgba(54, 162, 235, 1)',

ย  ย  ย  ย  ย  ย  ย  ย  borderWidth: 2,

ย  ย  ย  ย  ย  ย  ย  ย  tension: 0.2,

ย  ย  ย  ย  ย  ย  ย  ย  yAxisID: 'y' // ์™ผ์ชฝ Y์ถ• ์‚ฌ์šฉ

ย  ย  ย  ย  ย  ย  },

ย  ย  ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  ย  ย  type: 'bar',

ย  ย  ย  ย  ย  ย  ย  ย  label: '๋‹น์ผ ์†์ต (PnL)',

ย  ย  ย  ย  ย  ย  ย  ย  data: pnls,

ย  ย  ย  ย  ย  ย  ย  ย  // ์ˆ˜์ต(>0)์ด๋ฉด ๋ฏผํŠธ์ƒ‰, ์†์‹ค(<=0)์ด๋ฉด ๋ถ‰์€์ƒ‰

ย  ย  ย  ย  ย  ย  ย  ย  backgroundColor: pnls.map(p => p > 0 ? 'rgba(75, 192, 192, 0.6)' : 'rgba(255, 99, 132, 0.6)'),

ย  ย  ย  ย  ย  ย  ย  ย  borderColor: pnls.map(p => p > 0 ? 'rgba(75, 192, 192, 1)' : 'rgba(255, 99, 132, 1)'),

ย  ย  ย  ย  ย  ย  ย  ย  borderWidth: 1,

ย  ย  ย  ย  ย  ย  ย  ย  yAxisID: 'y1' // ์˜ค๋ฅธ์ชฝ Y์ถ• ์‚ฌ์šฉ

ย  ย  ย  ย  ย  ย  }

ย  ย  ย  ย  ]

ย  ย  },

ย  ย  options: {

ย  ย  ย  ย  scales: {

ย  ย  ย  ย  ย  ย  y: {

ย  ย  ย  ย  ย  ย  ย  ย  type: 'linear',

ย  ย  ย  ย  ย  ย  ย  ย  display: true,

ย  ย  ย  ย  ย  ย  ย  ย  'left',

ย  ย  ย  ย  ย  ย  ย  ย  title: { display: true, text: '์ด ์ž์‚ฐ' }

ย  ย  ย  ย  ย  ย  },

ย  ย  ย  ย  ย  ย  y1: {

ย  ย  ย  ย  ย  ย  ย  ย  type: 'linear',

ย  ย  ย  ย  ย  ย  ย  ย  display: true,

ย  ย  ย  ย  ย  ย  ย  ย  'right',

ย  ย  ย  ย  ย  ย  ย  ย  title: { display: true, text: '๋‹น์ผ ์†์ต' },

ย  ย  ย  ย  ย  ย  ย  ย  grid: { drawOnChartArea: false } // ๋ˆˆ๊ธˆ์„  ๊ฒน์นจ ๋ฐฉ์ง€

ย  ย  ย  ย  ย  ย  }

ย  ย  ย  ย  }

ย  ย  }

};


// ์ฐจํŠธ ๋ Œ๋”๋ง

window.renderChart(chartData, this.container);

```




7. ์‚ฌ์šฉ



์‹œ์ž‘ ์ž”๊ณ ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ…œํ”Œ๋ฆฟ์ด ๋ถˆ๋Ÿฌ์™€์ง


์—ฌ๊ธฐ ์•ˆ์—์„œ ๋งค๋งคํ•œ๊ฑฐ ๊ธฐ๋กํ•˜๊ณ 



end_balance์—๋Š” ๋งค๋งค์ข…๋ฃŒ์‹œ ์ž”๊ณ , transfer์—๋Š” ์ž…์ถœ๊ธˆ(์ž…์ถœ๊ธˆ์€ ์—†์œผ๋ฉด ๋นˆ์นธ ๋˜๋Š” 0) ๊ฐ’ ์ฑ„์›Œ์ฃผ๋ฉด ๋Œ.



์—ฌ๊ธฐ๊นŒ์ง€ ์ž˜ ๋”ฐ๋ผ์™”๋‹ค๋ฉด ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ฝ๊ธฐ๋ชจ๋“œ (์˜ค๋ฅธ์ชฝ ์œ„ ์ฑ… ๋ชจ์–‘)์„ ๋ˆ„๋ฅด๋ฉด ์ฐจํŠธ๊ฐ€ ๋‚˜์˜ด