Take a step back for a moment and try just this part of the query:
Select id, name, stagename, (Select Id, name, stagename From Opportunities__r where stagename = 'Pre-Renewal' and type = 'Renewal') FROM Opportunity
I just tested out your scenario with a custom lookup field from Opportunity to Opportunity and the query did not error at all. I do see a problem with your WHERE clause because you cannot have the inner and outer selects on the same object type.
It is mentioned in the docs here:
You cannot query on the same object in a subquery as in the main
query. You can write such self semi-join queries without using
semi-joins or anti-joins. For example, the following self semi-join
query is invalid:
SELECT Id, Name
FROM Account
WHERE Id In (
SELECT ParentId
FROM Account
WHERE Name = 'myaccount'
)
However, it is very simple to rewrite the query in a valid form, for
example:
SELECT Id, Name
FROM Account
WHERE Parent.Name = 'myaccount'
So you would select all the parent opportunity ids from the children records instead like:
SELECT Parent_Opportunity__c , Id, Name, StageName FROM Opportunity WHERE StageName = 'Pre-Renewal and Type = 'Renewal' instead.