There are many ways. Although archive isn't the word I would use. Just hide them until you need them.
You could create a flag field "Archive". Then on the layout for the current year, only show the records that are not archived. You could add a global drop down field named "Previous Year(s), and populate it with the previous years dates (I would do it dynamically with the values of current year, current year -1, current year -2, etc. Attach a script trigger OnObjectModify, so when the person selects (say 2014) it will perform a script to show the records from 2014 (or 2014 and current year)
You could put a portal on the layout, that looks like a list view that shows records from the year you select also, to compare.
If you show your layout or a mock up of what you want it to look like, more help should follow
I would like to do this too, and have read various approaches, including just keeping old records in the same file and hiding them or excluding them from active processes. However, I like to keep things simple and am working with a simple database (organization membership records, including donations) where the most common activities are simply searching for a name. I would have to script the simple searches and then retrain some people because we don't want the search expired memberships, while some of us also want to retain old records "just in case" or for historical reasons. The simplest approach then seems to be to have a second table with the archives of expired memberships.
Only mentioning this to underline the point that some questions about this topic really may only want a simple two-table solution.