Calculation Methods


Please note that the calculation methods and details described on this page may be changed without prior notice. Furthermore, per our terms and conditions, we do not take any responsibility or liability for any damage caused through use of the contents displayed.

Table of contents

  1. Terminology
  2. Calculation method
    1. How we determine open vs close
    2. Calculating realized profit & loss
    3. Transaction collapsing
  3. Calculating cryptocurrency prices
    1. For transactions settled in fiat currency (e.g. JPY, USD, EUR)
    2. For transactions settled in cryptocurrencies
    3. How we convert crypto-crypto to the user's reporting currency
    4. Data unavailability
  4. Fee handling
    1. Transaction fees
    2. Transfer (blockchain) fees
  5. Fiat currency exchange rates
  6. Special transactions
    1. bitFlyer Lightning Futures (BTC Futures) Maturity
    2. Mining
    3. Changelly's transaction/network fees
    4. Chat bonuses, campaign bonuses, airdrops and lending income
    5. Self-transaction fees
    6. Tipping
    7. Margin and leverage trading (Japanese residents)
    8. Zaif margin trading / Zaif AirFX collateral treatment
  7. US tax specific treatment
    1. Wash sale support
    2. Long and short term capital gains separation

Base currency and counter currency are defined as follows:

In a quote such as "1 BTCJPY = 2,000,000円" BTC is the base currency and JPY is the settlement currency.

Supported counter currencies are those for which Cryptact provides automatic price information.  For transactions which require automatic reference rates (crypto-crypto, etc), Cryptact will reference our data to provide the user with accurate profit & loss information in the user's selected reporting currency.  Please see our supported currencies page for more information.

There are several situations where Cryptact will mark a transaction as invalid to ensure the validity of the user's ledger.  For example if the user's data reflects a transaction that exceeds his position at the time (oversell) or if our database is lacking a price for the time at which he executed his transaction these entries will be marked as invalid transactions.  For more details on how to remedy these transactions, please see here for more details.

For each uploaded transaction, we will judge whether the transaction is "Open" (i.e. opens a new position) or "Close" (i.e. closes an existing position) and use this to calculate profit and loss.

Important: Transactions between fiat currencies (e.g. USDJPY) are ignored for the calculation of profit and loss.

  • Consolidate the transactions included in all the uploaded files into one list of transactions ordered by transaction time (oldest to newest).

  • Per currency, search for a new buy or short-sell transaction and mark it "open".

  • Per currency, every transaction encountered that is in the opposite direction of any "open" transactions is marked as "close". The following is done when the quantity on a "close" transaction exceeds the quantity of the "open" transaction:

    • Cryptocurrency coins/tokens: 
      If the user attempt to sell more than he owns, "oversell" will be displayed. Please confirm that all transactions have been uploaded correctly.

    • Derivatives (e.g. futures, options, swaps etc) on cryptocurrencies: 
      The transaction will be split into one "close" transaction with a quantity of the existing "open" transaction, and one "open" transaction with the remaining quantity.

Realized profit/loss will vary according to the accounting method as described below.

2.2.1. Cryptact supported accounting methods

Method Explanation
Average cost (idouheikinhou) When a transaction is closed, the weighted average price (including fees) of all open transactions is used as the corresponding open price.
Average cost is the default method for Yen.
Periodic average cost (souheikinhou) The open price used for a close transaction is the weighted average acquisition cost for the current fiscal period, including the weighted average cost of any carryover positions from the previous fiscal period.
FIFO First-In, First-Out. 
Open transactions are closed in the order in which they occurred (i.e. oldest transaction is closed first).
LIFO Last-In, First-Out. 
Open transactions are closed in the opposite order in which they occurred (i.e. newest transaction is closed first).

2.2.2. Calculation formulas

Average cost

{ (Close price)-(moving average cost per coin including fees) } * (Volume)-(Fees for closing)


Periodic Average Cost

{ (Close price)-(moving periodic average cost per coin including fees) } * (Volume)-(Fees for closing)


{ (Close price)-(open price) } * (Volume)-(open fees)-(close fees)

For details on how the transaction price is calculated, refer to "Calculating cryptocurrency Prices". For details on how transaction fees are handled, refer to "Fee handling".

"Open Transaction Price" varies depending on the accounting method selected.

2.2.3. Loss carryforward

Losses are not carried forward across fiscal years (i.e. a loss in 2017 will not offset a gain in 2018).

For transactions with similar parameters that take place in consecutive, rapid succession we will collapse these down into one transaction for the purpose of calculating the user's ledger.

The calculation method depends on the transaction as noted below.

(Important) If the user's transaction is not in a supported counter currency it will be marked as invalid.

The transaction price is used for the cryptocurrency price. If the user's accounting currency is different than the transaction settlement currency, a conversion is done as described in "Fiat currency exchange rates" below.

When trading other cryptocurrencies denominated in a supported counter currency, the transaction price is converted to the user's reporting currency based on the currency rates calculated by Cryptact.

1 ICN is purchased at 1 ICN = 0.01 ETH and sold at 0.02 ETH. User's accounting currency is JPY.

Assuming that the ETHJPY rate calculated by Cryptact at the time of purchase is JPY 20,000 and JPY 25,000 at the time of sale:

  • ICN price at open = 0.01 ETH * 20,000 (JPY/ETH) = JPY 200
  • ICN price at close = 0.02 ETH * 25,000 (JPY/ETH) = JPY 500

Cryptact has a comprehensive database of one (1) minute interval prices for our supported counter currencies.  When a user opens/closes a cryptocurrency denominated in another cryptocurrency, we use these prices to automatically calculate the user's ledger in his selected reporting currency.  In order to ensure data sanity and validity, we use data from multiple sources.

If we are unable to obtain a price for the user's cryptocurrency for an extended period of time, his transaction will be marked invalid due to a missing price.

If a transaction is uploaded with a timestamp greater than the latest data availability date of Cryptact, an error will be displayed. If this happens, please wait for a while and try again.

An error will be displayed if the latest rate available in Cryptact for ETHJPY is 5:00 and an ETHBTC transaction for 5:01 is uploaded.

Fees paid during open and close transactions are converted to the user's accounting currency and deducted from the calculated realized profit/loss.

4.1.1. Transaction fees in fiat currencies

For fees paid in fiat currencies, the amount used will be the amount specified in the transaction.

If the fee currency is not the user's reporting currency, we will convert the value with a rate obtained from our sources detailed in "Fiat currency exchange rates" below.

4.1.2. Transaction fees in cryptocurrency that is in either the base or counter currency

We will use the same logic dictated in "Calculating cryptocurrency prices" to convert the fee to the user's reporting currency.

4.1.3. Transaction fees in cryptocurrency that is neither the base nor counter currency

If a user pays transaction fees in a cryptocurrency that is neither his base nor counter (eg. paying BNB fees for trading BTCETH), we will take the following steps below:

  • We will create a sell transaction for the amount of currency used to pay fees in the original transaction for the fee currency.
  • We will use the value of the fees paid in the user's reporting currency to reduce the profit & loss of the original transaction in line with our normal fee calculations.

A user can choose whether or not transfer (blockchain) fees will be expensed through the settings page.  Please note: for individuals, it is highly unlikely that transfer fees will be accepted as tax write-offs.  Please consult with your tax adviser before using this setting.

If the counter or fee currency of a transaction is in fiat but different from the user's reporting currency, Cryptact will use rates from FRB (USD), ECB (EUR) and MUFJ (JPY) to calculate the user's ledger.

Cryptact will automatically add a transaction called "SETTLE" to close any futures positions that are not closed by the expiration date.

The price used for the "SETTLE" transaction is the bitFlyer BTCJPY price as of 12:05pm JST (per bitFlyer's explanation).

6.2. Mining

For coins obtained through mining, profit equal to the market value of the coin at the time is realized at the time of mining.  The cost basis for those coins is also the value at the time of mining.  Any fees related to the coins that were mined are excluded from profit at the time of mining.

When a user transacts at Changelly, the cost of transferring the coins between exchanges is included in the commissions charged for the trade.  Because these fees are directly linked to the transaction, Crypact will include them in the fee calculation done for the transaction.

For any coins obtained through bonus campaigns (chat bonuses, login bonuses, etc), any coins obtained through airdrops, and coins gained through lending activities, the value of the coins at the time they were received is realized as profit.  This value also becomes the cost basis for the acquired coins.

At some exchanges, when a user trades with themselves to create an execution (buying their own offer, selling their own bid), the exchange will print an execution showing no position change but will take fees for the transaction.  When Cryptact processes one of these trades, the fee associated with the execution is recognized as a loss.  If it is in fiat, a "CASH" entry is created with the value paid.  If it is in a cryptocurrency, the amount collected by the exchange is considered sold with a zero price.

For all tips given through chats and SNS, Cryptact assumes both parties are individuals (not companies) and treats them as below:

  • For the sender of the tip, we reduce their holdings of the cryptocurrency by the amount given.There is no profit or loss associated with the transaction.
  • For the receiver, we conservatively assume that the acquisition cost basis was zero. Profit and loss are only realized when the coins are sold.

Margin and leverage trading is calculated with separate cost basis using FIFO or LIFO.

When trading margin on Zaif, there are instances where the exchange will reduce cryptocurrency holdings due to realized losses.  Cryptact goes by the assumption that losses incurred for the trade have already been included in the transaction itself; the reduction in inventory is done without any profit or loss.

If the user selects USD as their reporting currency, the below options can be selected through the settings menu.

If a certain currency position is closed and then reopened within 30 days, the loss cannot be realized. Instead, the loss is included in the cost of the next open transaction.  There is no clear guidance on wash sale treatments for cryptocurrency at this time.  Please consult with your tax adviser.

Realized gains/losses will be split between gains/losses made from positions held less than 1 year (short term) and from positions held for more than 1 year (long term).

This is because different tax rates are applicable to short term capital gains vs long term capital gains.