Hot and Cold data Storage using partitioning
You want RANGE LEFT instead of RANGE RIGHT, and you only need a single boundary value at the three-year-mark.
Make the partition function like this:
Create Partition Function [MonthlyPartitionArchive] (datetime)
 as Range LEFT For Values (@Previousyear);

The scheme should then be:
Create Partition Scheme RangePartScheme as Partition [MonthlyPartitionArchive]
 To ([COLD_DATA], [HOT_DATA]);

There is no way to create a dynamic partition function.  You'll need to schedule a job to alter the partition function as needed.  Look at this answer for details about how to automate it.