kalshi-csv
Parse Kalshi transaction CSV files and generate IRS Form 8949 tax summaries for event contract trading.
Installation
pip install kalshi-csv
Getting Your Transactions CSV
Download 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.
CSV Format
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.
CLI Usage
Parse a Kalshi transactions CSV and display the trade matrix with IRS summary:
kalshi-csv Kalshi-Transactions-2026.csv
Export the IRS summary to a file:
kalshi-csv Kalshi-Transactions-2026.csv --irs-file irs-summary.txt
Disable colored output (useful for piping or redirecting):
kalshi-csv Kalshi-Transactions-2026.csv --no-color
Use ASCII characters instead of Unicode box-drawing (for terminals without UTF-8 support):
kalshi-csv Kalshi-Transactions-2026.csv --ascii
Sample Output
Default 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
====================================================
Library API
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}")
Data Structures
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
IRS Form 8949
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.
Source Code
This project is hosted in two locations:
- GitHub: https://github.com/MARKMENTAL/kalshi-csv
- Codeberg: https://codeberg.org/markmental/kalshi-csv
License
Metadata
Release files for kalshi-csv 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| kalshi_csv-0.1.2.tar.gz | 8.2 kB | Without provenance | Details for kalshi_csv-0.1.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| kalshi_csv-0.1.2-py3-none-any.whl | Python 3 | none | any | Details for kalshi_csv-0.1.2-py3-none-any.whl |
Total release size: 16.7 kB
Release files / kalshi_csv-0.1.2.tar.gz
| Download URL | kalshi_csv-0.1.2.tar.gz |
|---|---|
| Size | 8.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8708ee2419475d3a505eafee152fc9465d76561d5a99a05555311fc3b84a5e58
|
|
BLAKE2b-256 checksum How to use checksums |
5bc2e52f80e6cf98e466e29f0981b3f90eff5c991bcf90785b88586101be8689
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / kalshi_csv-0.1.2-py3-none-any.whl
| Download URL | kalshi_csv-0.1.2-py3-none-any.whl |
|---|---|
| Size | 8.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f44d5f5be92bcd67d1dfac9bbdb5509c9a8135259a5c5c04474581a052a9fa8d
|
|
BLAKE2b-256 checksum How to use checksums |
2d8c774ff6a72ce14ff321ae9943560833d9ed6a87bbed424791f605d7f99f80
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Security for kalshi-csv 0.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.