Postgres jsonb column or standard normalized table?
The rule of thumb in every relational database is normalizing (usually up to 3NF or even 4NF).  With the advent of JSON into the relational world, people are often tempted to solve everything using JSON, as it probably means a very simple way of channeling some data moving in the application into the database.  However, while it has its own place, I see it more often to be the case than not, that the data could be mostly or in its entirety normalized.

Basically whenever you see that your JSONs share the same keys (having values of the same data type), you should go and extract those keys into proper columns.  If the whole structure is always the same, extract everything, create tables as needed (if you have arrays in the JSON, for example, it can be a sign you need a table for that key), and - as basically always in the relational world - do joins between them.

Besides all the problems normalization solves, this has performance benefits, too.  First, you don't store the same key again and again with every transaction, sparing probably a lot of storage space.  Second, in the typical case you can have more efficient indexes over your columns (or groups of them).  Third, you can use primary and foreign keys, and constraints to enforce data integrity (well, this is partly covered in the normalization part...).  Finally, RDBMSes are very good at joining tables and coming up with efficient query plans to retrieve the data you need.

As for keeping a separate table for each year: this can be achieved by paritioning (with recent PostgreSQL versions having important improvements with it).  If you need to do that or not, is hard to tell - it depends on the data volume in the first place, but other factors, too.  You can possibly create your transaction table as partitioned, but only with a single default partition, at least if you opt to use version 11 or later.  In this case, if necessary, you can decide to add yearly partitions later.