交易的遗传规划:如何表示染色体

时间:2014-04-07 16:59:03

标签: python genetic-algorithm genetic-programming

我正在研究python中可用于交易的遗传算法。如果您熟悉进化算法,原理很简单: 基因代表交易策略:更具体地说,每个基因都是这种形式的树: gene description

这可以解释为这样的布尔值:

如果:

  • 50 最后库存值的平均值 更少 实际价格

  • 最低 6 最后库存值更少实际即可。 然后回答* True **,否则 False

如果答案为真,则发送买入信号,否则卖出信号。

这是我如何在python中表示这样的树的示例:

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

问题在于我无法为交叉突变运算符考虑好技术。有什么想法吗?

2 个答案:

答案 0 :(得分: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:]]
然后

变异也是相对微不足道的,只是随机改变一个数字,切换布尔运算符等等......我会把那个作为练习留给读者。

答案 1 :(得分:0)

您的运算符应该可以安全地互换 - 如果所有运算符都接受相同的输入类型并返回相同的输出类型(很可能是浮点数)。

没有必要但是一个好主意(通过神经网络):使用可区分的运算符函数 - 即不是返回YES或NO,而是返回&#34; yes-of-ness&#34;。这为您的表达提供了更多渐进的反馈。为每个操作员提供一个设定值控制值以调整其行为也是有用的。

变异算子可以改变运算符的类型或设定值;交叉操作通常会交换子树。

一个相当标准的二叉树表示形式是一个列表,如[head,left,right,left-left,left-right,right-left,right-right,left-left-left,...] 。好的是,给定任何节点的索引,您可以立即计算父,子和右子索引;缺点是,如果你有一个稀疏的树结构,它会浪费很多空间。另外,正确复制子树应该通过递归函数完成,而不是像上面显示的@Slater那样简单的切片和拼接。