2014-04-07 6 views
-2

나는 파이썬에서 유전 알고리즘을 사용하여 거래에 사용할 수있다. 프린 당신이 진화 알고리즘에 익숙하다면 간단하다 : 유전자는 거래 전략을 나타냅니다 gene description거래를위한 유전 프로그래밍 : 어떻게 염색체를 표현할 것인가?

이이 같은 부울 값으로 해석 될 수있다 : 구체적으로, 각각의 유전자는이 양식의 나무입니다 :

  • 50 마지막 재고 값의 평균는을 덜 입니다 :

    경우 실제 가격

  • 6 분 마지막 주식 값 실제 가격이하이다. 는 대답이 True 인 경우 매수 신호를 보내고, 그렇지 않으면 신호를 판매

다른 거짓, ** * 진정한 대답합니다.

class BinaryRule: 
def __init__(self, child1, child2): 
    self.child1 = child1 
    self.child2 = child2 


class LessThan(BinaryRule): 
    name = '<' 

    def eval(self): 
     return self.child1.eval() < self.child2.eval() 

# Here there is the definition of the other classes 

# and then I create the tree 
    tree = rules.LessThan(  
        rules.Max(rules.Float(1)),     
         rules.SMA(rules.Float(15)), 
        ) 
    print tree.eval() # True or false 

문제는 내가 크로스 오버돌연변이 사업자를위한 좋은 방법을 생각할 수 없다는 것입니다 :

내가 파이썬에서이 같은 트리를 표현하는 방법의 예입니다. 어떤 아이디어?

+0

당신은 어떻게 이것을 현재 대표하고 있습니까? –

+0

내가 내 게시물을 편집했습니다 – maroxe

+1

당신은 ... 꽤 중요한 코드 조각을 버리고 있습니다. –

답변

0

운영자는 모두 동일한 입력 유형을 허용하고 동일한 출력 유형 (대부분 플로트 가능성)을 반환해야합니다.

(신경망을 통해) 필요하지는 않지만 : 차별화 된 연산자 기능을 사용하십시오. 예를 들어, YES 또는 NO를 반환하는 대신 "degree-of-yes-ness"를 반환하십시오. 이것은 표현에 대한 개선에 대한 더 많은 졸업 된 피드백을 제공합니다. 또한 각 작동 자에게 그 동작을 조정할 수있는 지령치 제어 값을 제공하는 것이 유용 할 수 있습니다.

돌연변이 연산자는 연산자의 유형이나 설정 값을 변경할 수 있습니다. 교차 작업은 일반적으로 하위 트리를 바꿉니다.

상당히 표준 이진 트리 표현은 [head, left, right, left-left, left-right, right-left, right-right, left-left-left, ...와 같은 목록 형식입니다. ]. 좋은 점은 모든 노드의 인덱스가 주어지면 부모, 왼쪽 자식 및 오른쪽 자식 인덱스를 즉시 계산할 수 있다는 것입니다. 단점은 스파 스 트리 구조를 사용하면 많은 공간을 낭비 할 수 있다는 것입니다. 또한 올바르게 서브 트리를 복사하는 것은 @Slater가 위에 보여준 것처럼 단순한 슬라이스 및 스플 라이스가 아닌 재귀 함수를 통해 수행되어야합니다.

1

이것은 일반적으로 유전자 알고리즘이 표현되는 방식이 아니며 개인적으로 유전자 알고리즘이이 접근법이라고 생각하지 않지만 분명 그렇습니다.

boolean = "and" 
comparator = "<" 

등이 ...

이 당신이 쉽게 이러한를 나타낼 수 있다는 것을 의미합니다 :

당신을 변수의 특정 세트와 상호 작용하려는 가정하면, 잠재적 인 값의 작은 세트가 단순 목록 :

chromosome = ["and", "<", ...] 

크로스 오버 후 바로 일부 특정 분리 점에서 두 개의 염색체를 혼합되어

def crossover(cr1, cr2): 
    split_point = random.randint(1, len(cr1)) 
    return [cr1[:split_point] + cr2[split_point:]], [cr2[:split_point] + cr1[split_point:]] 

돌연변이는 또한 비교적 간단합니다. 숫자를 무작위로 변경하고, 부울 연산자를 바꾸는 등 ... 저는 독자에게 운동으로 남겨 두겠습니다.

+0

이것은 트리가 아닌 명령의 선형 흐름을 가정합니다. –

+0

@HughBothwell 그렇지 않습니다. 이는 단순히 정의 된 트리 구조를 크로스 오버를 위해 해당 트리에 명확한 적용 순서로 목록에 캐스팅하는 것입니다. 여기서의 염색체 레이아웃은 트리 자체와는 독립적이며, OP는 트리의 구조를 실제로 편집하고 싶다는 의미는 아닙니다. 그들이 그렇게한다면 나는이 대답을 바꿀 것이다. –