Beruflich Dokumente
Kultur Dokumente
"""
Created on Sat Jan 20 12:55:43 2018
@author: Rudy Xu
"""
import json
import numpy as np
import matplotlib.pyplot as plt
def sigma(x,deriv=False):
if deriv==True:
return x*(1-x)
return 1/(1+np.exp(-x))
#output dataset
Y = np.array([Y]).T
#print(Y)
for j in range(iterations):
#Feed forward through layers 0,1,2
l0 = X
l1 = sigma(np.dot(X,syn0))
l2 = sigma(np.dot(l1,syn1))
if (j% message_interval) == 0:
#print("Error:" + str(np.mean(np.abs(l2_error))))
print("TrainingResult sum:" + str(sum(l2)))
return(l2,syn0,syn1)
def TrainNN1(X,Y,iterations=6000):
x = X
y = np.array([Y]).T
np.random.seed(1)
syn0 = 2*np.random.random((len(x[0]),1))-1
for i in range(iterations):
l0 = x
l1 = sigma(np.dot(x,syn0))
l1_err=y-l1
if (i% 1000) == 0:
print("Error:" + str(np.mean(np.abs(l1_err))))
print("TrainingResult sum:" + str(sum(l1)))
l1_delta=l1_err*sigma(l1,True)
syn0+=np.dot(l0.T,l1_delta)
return(l1,syn0)
def GetData(json_data,datarange):
pricedata = []
for i in datarange:
pricedata.append(json_data[i][1])
return(pricedata)
def ConvertPercentageChange(pricedata):
#Units are actually in decimal, not percentage
PercentageChangeData = [0]
for i in range(len(pricedata)-1):
PercentageChangei = (pricedata[i+1]-
pricedata[i])/pricedata[i]*PercentageChangeDataModifier
PercentageChangeData.append(PercentageChangei+PercentageNormaliser*PercentageChange
DataModifier) #PercentageCHangeDataDivide
return(PercentageChangeData)
def BuySellHold(pricedata, brokerage_percent=0.1):
#Units should be in decimal, not percent
ResultList = []
BiggestIncreaseFound = 0
BiggestDecreaseFound = 0
InitialValue = 0
PercentageChangeFromInitial = 0 #This is a decimal, not percentage
for i in range(len(pricedata)):
j=i
InitialValue = pricedata[j]
BiggestIncreaseFound = 0
BiggestDecreaseFound = 0
while j<len(pricedata):
PercentageChangeFromInitial = (pricedata[j]-InitialValue)/InitialValue
if BiggestIncreaseFound < PercentageChangeFromInitial:
BiggestIncreaseFound = PercentageChangeFromInitial
j=j+1
return(ResultList)
def BuySellHold2(pricedata,brokerage_percent=0.1):
#Tries to only output buy or sell, and less holds
ResultList = []
BiggestIncreaseFound = 0
BiggestDecreaseFound = 0
InitialValue = 0
PercentageChangeFromInitial = 0 #This is a decimal, not percentage
for i in range(len(pricedata)):
j=i
InitialValue = pricedata[j]
BiggestIncreaseFound = 0
BiggestDecreaseFound = 0
while j<len(pricedata):
PercentageChangeFromInitial = (pricedata[j]-InitialValue)/InitialValue
if BiggestIncreaseFound < PercentageChangeFromInitial:
BiggestIncreaseFound = PercentageChangeFromInitial
j=j+1
return(ResultList)
for i in range(len(pricedata)):
j=i
InitialValue = pricedata[j]
BiggestIncreaseFound = 0
BiggestDecreaseFound = 0
while j<len(pricedata):
PercentageChangeFromInitial = (pricedata[j]-InitialValue)/InitialValue
if BiggestIncreaseFound < PercentageChangeFromInitial:
BiggestIncreaseFound = PercentageChangeFromInitial
j=j+1
return(ResultList)
while j<len(pricedata):
PercentageChangeFromInitial = (pricedata[j]-InitialValue)/InitialValue
if BiggestIncreaseFound < PercentageChangeFromInitial:
BiggestIncreaseFound = PercentageChangeFromInitial
j=j+1
return(ResultList)
if pricedata[i]<pricedata[i+1]:
ResultList.append(1)
else:
ResultList.append(0)
return(ResultList)
def Savedata(data,filename):
dataArray = np.array(data)
np.savetxt(filename,dataArray)
def CreateRandomPriceData(length,average=1,std=0.05):
#randomData = np.random.random(length)
randomData = np.random.normal(average,std,length)
return(randomData)
'''
for i in range(1,100,5):
PercentageChangeDataModifier = i
for i range()
'''
PercentageChangeDataModifier = 2000
TrainingRange = range(-2501,-1)
TestingRange1 = range(-5000,-2502)
TestingRange2 = range(-7000,-5001)
TestingRange3 = range(-7000,-2501)
TestingRange4 = range(-10000,-7001)
SetSize = 150
Brokerage_Percent = 0.03
BuyThreshhold = 0.45
SellThreshhold = 0.45
Matrixdimension = 14
NN2_iter = 6000
message_interval = 1000
PercentageNormaliser = 0.0
json_data = ReadFile('POWR2')
#pricedata = Loaddata('testingbasic.txt')
#pricedata = CreateRandomPriceData(100,1,0.02)
#pricedata = data
pricedata = GetData(json_data,TrainingRange)
#TrainingRange
PercentageChangeData = ConvertPercentageChange(pricedata)
answerkey = BuyOnly(pricedata,Brokerage_Percent)
#anskwerkey generator function, Brokerage_percentage
answerkeyS = SellOnly(pricedata,Brokerage_Percent)
#dataset = GenerateDataset(pricedata,answerkey,SetSize)
dataset = GenerateDataset(PercentageChangeData,answerkey, SetSize)
#Setsize
datasetS = GenerateDataset(PercentageChangeData,answerkeyS, SetSize)
return(l2,answerkey,PercentageChangeData,dataset,l1)
return(l2,answerkey,PercentageChangeData,dataset,l1)
'''
def TestWeightsNN1(pricedata,setsize):
PercentageChangeData = ConvertPercentageChange(pricedata)
answerkey = Buy1StepProfit(pricedata,Brokerage_Percent)
#anskwerkey generator function, Brokerage_Percentage
dataset = GenerateDataset(PercentageChangeData,answerkey, setsize)
l1 = sigma(np.dot(dataset[:,0:-1],Weights0))
return(l1,answerkey,PercentageChangeData,dataset)
'''
def CheckEffectiveness(TrainingResults,PercentageChangeData,threshhold =
BuyThreshhold):
dollars = 1
IncCount = 0
DecCount = 0
sizeDifference = len(PercentageChangeData)-len(TrainingResults)
for i in range(len(TrainingResults)):
if TrainingResults[i]>threshhold:
dollars =
dollars*(1+PercentageChangeData[i+sizeDifference]/PercentageChangeDataModifier)
#PercentageChangeDataDivide
if PercentageChangeData[i+sizeDifference]>0:
IncCount+=1
elif PercentageChangeData[i+sizeDifference]<0:
DecCount+=1
#print(i+sizeDifference,dollars)
print("Increase Count: " + str(IncCount))
print("Decrease Count: " + str(DecCount))
try:
print("Inc/Dec ratio: " + str(IncCount/DecCount))
except ZeroDivisionError:
print("You can't divide by zero, you're silly.")
return(dollars)
def
CheckEffectivenessBuySell(TrainingResults,TrainingResultsS,PercentageChangeData,thr
eshhold = BuyThreshhold,threshholdS = SellThreshhold):
dollars = 1
Buy1Sell0 = 0
sizeDifference = len(PercentageChangeData)-len(TrainingResults)
HitCount = 0
MissCount = 0
for i in range(len(TrainingResults)):
if TrainingResults[i]>threshhold and TrainingResultsS[i]<threshholdS:
Buy1Sell0 = 1
if
PercentageChangeData[i+sizeDifference]>PercentageNormaliser*PercentageChangeDataMod
ifier:
HitCount+=1
elif
PercentageChangeData[i+sizeDifference]<PercentageNormaliser*PercentageChangeDataMod
ifier:
MissCount+=1
elif TrainingResultsS[i]>threshholdS and TrainingResults[i]<threshhold:
Buy1Sell0 = 0
if
PercentageChangeData[i+sizeDifference]<PercentageNormaliser*PercentageChangeDataMod
ifier:
HitCount+=1
elif
PercentageChangeData[i+sizeDifference]<PercentageNormaliser*PercentageChangeDataMod
ifier:
MissCount+=1
else:
Buy1Sell0 = Buy1Sell0
if Buy1Sell0 == 1:
dollars =
dollars*(1+PercentageChangeData[i+sizeDifference]/PercentageChangeDataModifier-
PercentageNormaliser) #PercentageChangeDataDivide
elif Buy1Sell0 == 0:
dollars = dollars
print("Hit Count: " + str(HitCount))
print("Miss Count: " + str(MissCount))
try:
print("Hit/Miss ratio: " + str(HitCount/MissCount))
except ZeroDivisionError:
print("You can't divide by zero, you're silly.")
return(dollars)
def IncDecCounter(PercentageChangeData):
IncreasesTrue =
np.array(PercentageChangeData)>PercentageNormaliser*PercentageChangeDataModifier
DecreasesTrue =
np.array(PercentageChangeData)<PercentageNormaliser*PercentageChangeDataModifier
IncreasesCount = sum(IncreasesTrue.astype(int))
DecreasesCount = sum(DecreasesTrue.astype(int))
pricedataT1 = GetData(json_data,TestingRange1)
#TestingRange
(TrT1,AkT1,PcdT1,DsT1,L1T1) = TestWeightsNN2(pricedataT1,SetSize)
#Setsize
(TrT1S,AkT1S,PcdT1S,DsT1S,L1T1S) = TestWeightsNN2S(pricedataT1,SetSize)
#Setsize
#(Tr2,Ak2,Pcd2,Ds2) = TestWeightsNN1(pricedata2,SetSize)
#Setsize
DollarsTrained =
CheckEffectivenessBuySell(TrainingResults,TrainingResultsS,PercentageChangeData,Buy
Threshhold,SellThreshhold)
print("NN performance: "+ str(DollarsTrained))
#print(np.power(np.mean(PercentageChangeData)/PercentageChangeDataModifier+1,len(Pe
rcentageChangeData)))
print("Avg. Market performance: "+
str(np.mean(pricedata)/np.mean(pricedata[0:SetSize])))
pricedataT2 = GetData(json_data,TestingRange2)
#TestingRange
(TrT2,AkT2,PcdT2,DsT2,L1T2) = TestWeightsNN2(pricedataT2,SetSize)
#Setsize
(TrT2S,AkT2S,PcdT2S,DsT2S,L1T2S) = TestWeightsNN2S(pricedataT2,SetSize)
#Setsize
#(Tr2,Ak2,Pcd2,Ds2) = TestWeightsNN1(pricedata2,SetSize)
#Setsize
print("\nTest Set 2: ")
IncDecCounter(PcdT2)
DollarsT2 =
CheckEffectivenessBuySell(TrT2,TrT2S,PcdT2,BuyThreshhold,SellThreshhold)
print("NN performance: "+ str(DollarsT2))
#print(np.power(np.mean(PcdT2)/PercentageChangeDataModifier+1,len(PcdT2)))
print("Avg. Market performance: "+
str(np.mean(pricedataT2)/np.mean(pricedataT2[0:SetSize])))
pricedataT3 = GetData(json_data,TestingRange3)
#TestingRange
(TrT3,AkT3,PcdT3,DsT3,L1T3) = TestWeightsNN2(pricedataT3,SetSize)
#Setsize
(TrT3S,AkT3S,PcdT3S,DsT3S,L1T3S) = TestWeightsNN2S(pricedataT3,SetSize)
#Setsize
#(Tr2,Ak2,Pcd2,Ds2) = TestWeightsNN1(pricedata2,SetSize)
#Setsize
print("\nTest Set 3: ")
IncDecCounter(PcdT3)
DollarsT3 =
CheckEffectivenessBuySell(TrT3,TrT3S,PcdT3,BuyThreshhold,SellThreshhold)
print("NN performance: "+ str(DollarsT3))
#print(np.power(np.mean(PcdT3)/PercentageChangeDataModifier+1,len(PcdT3)))
print("Avg. Market performance: "+
str(np.mean(pricedataT3)/np.mean(pricedataT3[0:SetSize])))
json_data = ReadFile('POWR2')
pricedataT4 = GetData(json_data,TestingRange4)
#TestingRange
(TrT4,AkT4,PcdT4,DsT4,L1T4) = TestWeightsNN2(pricedataT4,SetSize)
#Setsize
(TrT4S,AkT4S,PcdT4S,DsT4S,L1T4S) = TestWeightsNN2S(pricedataT4,SetSize)
#Setsize
#(Tr2,Ak2,Pcd2,Ds2) = TestWeightsNN1(pricedata2,SetSize)
#Setsize
print("\nTest Set 4: ")
IncDecCounter(PcdT4)
DollarsT4 =
CheckEffectivenessBuySell(TrT4,TrT4S,PcdT4,BuyThreshhold,SellThreshhold)
print("NN performance: "+ str(DollarsT4))
#print(np.power(np.mean(PcdT4)/PercentageChangeDataModifier+1,len(PcdT4)))
print("Avg. Market performance: "+
str(np.mean(pricedataT4)/np.mean(pricedataT4[0:SetSize])))
'''
pp=0
ppp=0
while ppp < 3:
pp = ppp
while pp <10:
if pp > 5:
break
pp=pp+1
print(pp)
ppp=ppp+1
'''