Parse Kalshi transaction CSV files and generate IRS Form 8949 tax summaries for event contract trading.
pip install kalshi-csvDownload your transaction history from Kalshi:
- Go to https://kalshi.com/account/taxes
- Download the transaction CSV for the tax year you want to analyze
- Pass it to
kalshi-csvas shown below
Each tax year produces a separate CSV file.
The tool expects the standard Kalshi transaction export with these columns:
type, quantity_fp, market_ticker, side, entry_price_dollars, exit_price_dollars,
open_fees_dollars, close_fees_dollars, realized_pnl_without_fees_dollars,
realized_pnl_with_fees_dollars, close_timestamp, open_timestamp
Rows without realized_pnl_without_fees_dollars are automatically skipped.
Parse a Kalshi transactions CSV and display the trade matrix with IRS summary:
kalshi-csv Kalshi-Transactions-2026.csvExport the IRS summary to a file:
kalshi-csv Kalshi-Transactions-2026.csv --irs-file irs-summary.txtDisable colored output (useful for piping or redirecting):
kalshi-csv Kalshi-Transactions-2026.csv --no-colorUse ASCII characters instead of Unicode box-drawing (for terminals without UTF-8 support):
kalshi-csv Kalshi-Transactions-2026.csv --asciiDefault mode (Unicode box-drawing):
┌──────────────────────────────────┬──────┬────────┬────────┬────────┬────────────────┬────────┐
│ Ticker │ Side │ Qty │ Entry │ Exit │ P&L (No Fees) │ Fees │
├──────────────────────────────────┼──────┼────────┼────────┼────────┼────────────────┼────────┤
│ KXWCADVANCE-26JUL07ARGEGY-ARG │ YES │ 0.17 │ $0.86 │ $0.69 │ $-0.03 │ $0.00 │
│ KXWC1H-26JUL07ARGEGY-TIE │ YES │ 0.34 │ $0.28 │ $0.00 │ $-0.10 │ $0.00 │
│ KXMLBGAME-26JUL081940BOSCWS-BOS │ YES │ 0.96 │ $0.50 │ $0.91 │ $+0.39 │ $0.02 │
└──────────────────────────────────┴──────┴────────┴────────┴────────┴────────────────┴────────┘
Total Transactions Parsed: 3
Total Exchange Fees Paid: $0.02
Internal Tracked Net P&L: $+0.26
-----------------------------------------------------------------------------------
=== IRS FORM 8949 / SCHEDULE D AGGREGATE SUMMARY ===
Use these exact aggregates for a single-line summary entry:
* Box to Check: Box C (Short-term, not reported on Form 1099-B)
* (a) Description: Kalshi Event Contracts (Aggregate Summary)
* (b) Date Acquired: 07/07/2026
* (c) Date Sold: 07/08/2026
* (d) Gross Proceeds: $+2.50
* (e) Cost or Other Basis: $2.24
* (h) Gain or (Loss): $+0.26
====================================================
ASCII mode (--ascii):
+----------------------------------+------+--------+--------+--------+----------------+--------+
| Ticker | Side | Qty | Entry | Exit | P&L (No Fees) | Fees |
+----------------------------------+------+--------+--------+--------+----------------+--------+
| KXWCADVANCE-26JUL07ARGEGY-ARG | YES | 0.17 | $0.86 | $0.69 | $-0.03 | $0.00 |
| KXWC1H-26JUL07ARGEGY-TIE | YES | 0.34 | $0.28 | $0.00 | $-0.10 | $0.00 |
| KXMLBGAME-26JUL081940BOSCWS-BOS | YES | 0.96 | $0.50 | $0.91 | $+0.39 | $0.02 |
+----------------------------------+------+--------+--------+--------+----------------+--------+
Total Transactions Parsed: 3
Total Exchange Fees Paid: $0.02
Internal Tracked Net P&L: $+0.26
-----------------------------------------------------------------------------------
=== IRS FORM 8949 / SCHEDULE D AGGREGATE SUMMARY ===
Use these exact aggregates for a single-line summary entry:
* Box to Check: Box C (Short-term, not reported on Form 1099-B)
* (a) Description: Kalshi Event Contracts (Aggregate Summary)
* (b) Date Acquired: 07/07/2026
* (c) Date Sold: 07/08/2026
* (d) Gross Proceeds: $+2.50
* (e) Cost or Other Basis: $2.24
* (h) Gain or (Loss): $+0.26
====================================================
Use kalshi-csv as a Python library in your own scripts:
from kalshi_csv import KalshiCSV
kalshi = KalshiCSV("Kalshi-Transactions-2026.csv")
kalshi.parse()
# Access individual trades
for trade in kalshi.trades:
print(f"{trade['ticker']}: {trade['side']} {trade['qty']} @ ${trade['entry']}")
print(f" P&L: ${trade['pnl_with_fees']:.2f}")
# Access aggregate summary
print(f"Total trades: {kalshi.summary['trade_count']}")
print(f"Total fees: ${kalshi.summary['total_fees']:.2f}")
print(f"Total P&L: ${kalshi.summary['total_pnl_with_fees']:.2f}")
# Get IRS Form 8949 data
irs = kalshi.irs_summary()
print(f"Gross Proceeds: ${irs['gross_proceeds']:.2f}")
print(f"Cost Basis: ${irs['cost_basis']:.2f}")
print(f"Gain/Loss: ${irs['gain_or_loss']:.2f}")Trade dict (kalshi.trades):
ticker: Market ticker symbolside: "YES" or "NO"qty: Quantity of contractsentry: Entry price in dollarsexit: Exit price in dollarspnl_no_fees: P&L without feespnl_with_fees: P&L including feesopen_fees: Opening feesclose_fees: Closing fees
Summary dict (kalshi.summary):
trade_count: Number of trades parsedtotal_fees: Sum of all feestotal_pnl_without_fees: Total P&L excluding feestotal_pnl_with_fees: Total P&L including feestotal_tax_basis: Total cost basis for IRS reportingtotal_tax_proceeds: Total proceeds for IRS reporting
IRS summary dict (kalshi.irs_summary()):
box: "C" (for Form 8949 Box C)description: "Kalshi Event Contracts (Aggregate Summary)"gross_proceeds: Total proceedscost_basis: Total cost basisgain_or_loss: Net gain or loss
Kalshi event contracts are typically reported on IRS Form 8949, Box C (short-term transactions not reported on Form 1099-B). The tool calculates:
- Gross Proceeds: Total exit value minus close fees
- Cost Basis: Total entry value plus open fees
- Gain/Loss: Realized P&L including all fees
Use the aggregate summary for a single-line entry on Form 8949, or export to a file for your records.
Disclaimer: This tool provides calculations based on Kalshi transaction data. Consult a tax professional for specific tax advice.
This project is hosted in two locations: