retirement-syncing
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseRetirement Account Syncing
退休账户数据同步
Purpose
功能目标
Safely import Vanguard and Fidelity retirement account CSV exports into the Google Sheets DataHub retirement section, updating only quantities (Column B).
将Vanguard和Fidelity的退休账户CSV导出文件安全导入Google Sheets DataHub的退休账户区域,仅更新持仓数量(B列)。
When to Use
使用场景
Use this skill when:
- Syncing retirement account positions from
notebooks/retirement-accounts/ - User mentions: "sync retirement", "update retirement", "vanguard sync", "401k update", "IRA sync"
- Working with files in directory
notebooks/retirement-accounts/
在以下场景中使用该技能:
- 从同步退休账户持仓
notebooks/retirement-accounts/ - 用户提及:"sync retirement"「同步退休账户」、"update retirement"「更新退休账户」、"vanguard sync"「Vanguard同步」、"401k update"「401k更新」、"IRA sync"「IRA同步」
- 处理目录下的文件
notebooks/retirement-accounts/
Source Files
源文件
Location:
notebooks/retirement-accounts/| File | Source | Contents |
|---|---|---|
| Vanguard IRAs | Account 39321600 & 35407271 holdings |
| Vanguard Brokerage | Account 53527429 & 50580939 holdings |
| Fidelity 401(k) | {employer_name} 401(k) Plan holdings |
存储位置:
notebooks/retirement-accounts/| 文件 | 来源 | 内容 |
|---|---|---|
| Vanguard IRAs | 账户39321600 & 35407271的持仓数据 |
| Vanguard Brokerage | 账户53527429 & 50580939的持仓数据 |
| Fidelity 401(k) | {employer_name} 401(k)计划持仓数据 |
CSV Formats
CSV格式
Vanguard OFX Format (OfxDownload.csv)
Vanguard OFX格式(OfxDownload.csv)
csv
Account Number,Investment Name,Symbol,Shares,Share Price,Total Value,
39321600,VANGUARD S&P 500 INDEX ETF,VOO,18.1817,629.3,11441.74,Key Fields:
- Column 3: Symbol
- Column 4: Shares (quantity)
csv
Account Number,Investment Name,Symbol,Shares,Share Price,Total Value,
39321600,VANGUARD S&P 500 INDEX ETF,VOO,18.1817,629.3,11441.74,关键字段:
- 第3列:Symbol(代码)
- 第4列:Shares(持仓数量)
Fidelity 401k Format (Portfolio_Positions_*.csv)
Fidelity 401k格式(Portfolio_Positions_*.csv)
csv
Account Number,Account Name,Symbol,Description,Quantity,Last Price,...
86689,{employer_name} 401(K) PLAN,FGCKX,FID GROWTH CO K,4.447,$50.04,...Key Fields:
- Column 3: Symbol
- Column 5: Quantity
csv
Account Number,Account Name,Symbol,Description,Quantity,Last Price,...
86689,{employer_name} 401(K) PLAN,FGCKX,FID GROWTH CO K,4.447,$50.04,...关键字段:
- 第3列:Symbol(代码)
- 第5列:Quantity(持仓数量)
DataHub Target Location
DataHub目标位置
Spreadsheet ID: Read from
fin-guru/data/user-profile.yamlRetirement Section: Rows 46-62 (after the "RETIREMENT ACCOUNTS (VANGUARD)" header at row 45)
| Row | Ticker | Description |
|---|---|---|
| 46 | VOO | Vanguard S&P 500 ETF |
| 47 | VUG | Vanguard Growth ETF |
| 48 | VTSAX | Vanguard Total Stock Market |
| 49 | SCHG | Schwab US Large-Cap Growth |
| 50 | PLTR | Palantir |
| 51 | NVDA | NVIDIA |
| 52 | TSLA | Tesla |
| 53 | VB | Vanguard Small-Cap ETF |
| 54 | ARKK | ARK Innovation |
| 55 | VMFXX | Vanguard Money Market |
| 56 | FGCKX | Fidelity Growth Company K |
| 57 | FXAIX | Fidelity 500 Index |
| 58-62 | Reserved | Future holdings |
表格ID:从读取
fin-guru/data/user-profile.yaml退休账户区域:第46-62行(位于第45行的"RETIREMENT ACCOUNTS (VANGUARD)"标题之后)
| 行号 | 代码 | 说明 |
|---|---|---|
| 46 | VOO | Vanguard S&P 500 ETF |
| 47 | VUG | Vanguard Growth ETF |
| 48 | VTSAX | Vanguard Total Stock Market |
| 49 | SCHG | Schwab US Large-Cap Growth |
| 50 | PLTR | Palantir |
| 51 | NVDA | NVIDIA |
| 52 | TSLA | Tesla |
| 53 | VB | Vanguard Small-Cap ETF |
| 54 | ARKK | ARK Innovation |
| 55 | VMFXX | Vanguard Money Market |
| 56 | FGCKX | Fidelity Growth Company K |
| 57 | FXAIX | Fidelity 500 Index |
| 58-62 | 预留 | 未来持仓 |
Core Workflow
核心工作流
1. Read All CSV Files
1. 读取所有CSV文件
python
undefinedpython
undefinedRead Vanguard files
Read Vanguard files
vanguard_1 = read_csv("notebooks/retirement-accounts/OfxDownload.csv")
vanguard_2 = read_csv("notebooks/retirement-accounts/OfxDownload (1).csv")
vanguard_1 = read_csv("notebooks/retirement-accounts/OfxDownload.csv")
vanguard_2 = read_csv("notebooks/retirement-accounts/OfxDownload (1).csv")
Read latest Fidelity file (by date in filename)
Read latest Fidelity file (by date in filename)
fidelity = read_csv("notebooks/retirement-accounts/Portfolio_Positions_*.csv")
undefinedfidelity = read_csv("notebooks/retirement-accounts/Portfolio_Positions_*.csv")
undefined2. Aggregate Holdings by Ticker
2. 按代码聚合持仓
Since the same ticker can appear in multiple accounts, SUM all quantities:
python
holdings = {}
for file in [vanguard_1, vanguard_2, fidelity]:
for row in file:
ticker = row['Symbol']
shares = float(row['Shares'] or row['Quantity'])
holdings[ticker] = holdings.get(ticker, 0) + sharesExpected Aggregations:
- VOO: Sum across accounts (IRA + Brokerage)
- VUG: Sum across accounts
- PLTR: Sum across accounts (53527429 + 50580939)
- SCHG: Sum across accounts
- VMFXX: Sum across accounts (all money market)
- VTSAX: Sum across accounts
由于同一代码可能出现在多个账户中,需求和所有持仓数量:
python
holdings = {}
for file in [vanguard_1, vanguard_2, fidelity]:
for row in file:
ticker = row['Symbol']
shares = float(row['Shares'] or row['Quantity'])
holdings[ticker] = holdings.get(ticker, 0) + shares预期聚合规则:
- VOO:跨账户求和(IRA + 经纪账户)
- VUG:跨账户求和
- PLTR:跨账户求和(53527429 + 50580939)
- SCHG:跨账户求和
- VMFXX:跨账户求和(所有货币市场账户)
- VTSAX:跨账户求和
3. Update DataHub Column B Only
3. 仅更新DataHub的B列
WRITABLE: Column B (Quantity) only
DO NOT TOUCH:
- Column A (Ticker) - already set
- Column C onwards - formulas
javascript
// Update VOO quantity (Row 46)
mcp__gdrive__sheets(operation: "updateCells", params: {
spreadsheetId: SPREADSHEET_ID,
range: "DataHub!B46:B46",
values: [["214.7947"]] // Aggregated quantity
})可编辑区域:仅B列(持仓数量)
禁止修改:
- A列(代码)- 已预设
- C列及以后的列 - 包含公式
javascript
// Update VOO quantity (Row 46)
mcp__gdrive__sheets(operation: "updateCells", params: {
spreadsheetId: SPREADSHEET_ID,
range: "DataHub!B46:B46",
values: [["214.7947"]] // Aggregated quantity
})4. Update Pattern
4. 更新规则
Loop through each retirement ticker and update Column B:
| Ticker | Range | Aggregation |
|---|---|---|
| VOO | B46 | 18.1817 + 196.613 = 214.7947 |
| VUG | B47 | 10.9488 + 2.1164 = 13.0652 |
| VTSAX | B48 | 126.336 + 102.126 = 228.462 |
| SCHG | B49 | 100 + 6 = 106 |
| PLTR | B50 | 25 + 42 = 67 |
| NVDA | B51 | 150 |
| TSLA | B52 | 58 |
| VB | B53 | 20 |
| ARKK | B54 | 16.13 |
| VMFXX | B55 | 2.94 + 0.57 + 179.92 + 428.42 = 611.85 |
| FGCKX | B56 | 4.447 |
| FXAIX | B57 | 3.705 |
遍历每个退休账户代码并更新B列:
| 代码 | 单元格范围 | 聚合结果 |
|---|---|---|
| VOO | B46 | 18.1817 + 196.613 = 214.7947 |
| VUG | B47 | 10.9488 + 2.1164 = 13.0652 |
| VTSAX | B48 | 126.336 + 102.126 = 228.462 |
| SCHG | B49 | 100 + 6 = 106 |
| PLTR | B50 | 25 + 42 = 67 |
| NVDA | B51 | 150 |
| TSLA | B52 | 58 |
| VB | B53 | 20 |
| ARKK | B54 | 16.13 |
| VMFXX | B55 | 2.94 + 0.57 + 179.92 + 428.42 = 611.85 |
| FGCKX | B56 | 4.447 |
| FXAIX | B57 | 3.705 |
Safety Checks
安全校验
Before updating:
- Verify all 3 CSV files exist in
notebooks/retirement-accounts/ - Confirm row mapping matches expected tickers
- Log any new tickers not in current sheet
Large Change Warning (>20%):
- If any quantity changes more than 20%, show diff and ask for confirmation
更新前校验:
- 确认目录下存在全部3个CSV文件
notebooks/retirement-accounts/ - 确认行映射与预期代码一致
- 记录表格中未包含的新代码
大额变动警告(变动>20%):
- 若任一持仓数量变动超过20%,显示差异并请求确认
Example Execution
执行示例
javascript
// Step 1: Read CSVs and aggregate
const holdings = aggregateFromCSVs();
// Step 2: Update each ticker's quantity
const updates = [
{ range: "DataHub!B46:B46", values: [[holdings.VOO.toFixed(4)]] },
{ range: "DataHub!B47:B47", values: [[holdings.VUG.toFixed(4)]] },
{ range: "DataHub!B48:B48", values: [[holdings.VTSAX.toFixed(3)]] },
// ... etc
];
for (const update of updates) {
mcp__gdrive__sheets(operation: "updateCells", params: {
spreadsheetId: SPREADSHEET_ID,
...update
});
}
// Step 3: Log summary
console.log("Updated 12 retirement positions");javascript
// Step 1: Read CSVs and aggregate
const holdings = aggregateFromCSVs();
// Step 2: Update each ticker's quantity
const updates = [
{ range: "DataHub!B46:B46", values: [[holdings.VOO.toFixed(4)]] },
{ range: "DataHub!B47:B47", values: [[holdings.VUG.toFixed(4)]] },
{ range: "DataHub!B48:B48", values: [[holdings.VTSAX.toFixed(3)]] },
// ... etc
];
for (const update of updates) {
mcp__gdrive__sheets(operation: "updateCells", params: {
spreadsheetId: SPREADSHEET_ID,
...update
});
}
// Step 3: Log summary
console.log("Updated 12 retirement positions");Post-Update Validation
更新后验证
Verify:
- All quantities updated correctly
- Formulas in columns C+ still working
- Total retirement value approximately matches sum of CSV totals
- No formula errors introduced
Log Summary:
Updated 12 retirement positions:
- VOO: 214.7947 shares
- VUG: 13.0652 shares
- VTSAX: 228.462 shares
...
Total Retirement Value: ~$387,806需验证:
- 所有持仓数量更新正确
- C列及以后的公式仍正常运行
- 退休账户总价值与CSV文件的总价值大致匹配
- 未引入公式错误
日志摘要示例:
Updated 12 retirement positions:
- VOO: 214.7947 shares
- VUG: 13.0652 shares
- VTSAX: 228.462 shares
...
Total Retirement Value: ~$387,806Critical Rules
核心规则
WRITABLE Column
可编辑列
- Column B: Quantity ONLY
- B列:仅持仓数量
DO NOT TOUCH
禁止修改
- Column A: Tickers (pre-set)
- Columns C-S: All formulas
- A列:代码(已预设)
- C-S列:所有公式
Row Mapping
行映射规则
Retirement section starts at row 46 (after header at row 45).
Rows 46-62 are reserved for retirement holdings.
退休账户区域从第46行开始(位于第45行的标题之后)。第46-62行预留为退休账户持仓区域。
Trigger Keywords
触发关键词
- "sync retirement"
- "update retirement"
- "retirement accounts"
- "vanguard sync"
- "401k update"
- "IRA sync"
- "retirement quantities"
Skill Type: Domain (workflow guidance)
Enforcement: SUGGEST
Priority: Medium
Line Count: < 200
- "sync retirement"「同步退休账户」
- "update retirement"「更新退休账户」
- "retirement accounts"「退休账户」
- "vanguard sync"「Vanguard同步」
- "401k update"「401k更新」
- "IRA sync"「IRA同步」
- "retirement quantities"「退休账户持仓数量」
技能类型:领域类(工作流指引)
执行规则:建议执行
优先级:中等
代码行数:< 200行