【问题标题】:genetic programming for trading: How to represent chromosomes交易的遗传编程:如何表示染色体
【发布时间】:2014-04-08 02:09:32
【问题描述】:

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

这可以解释为一个布尔值,如下所示:

如果:

  • 50 个最后股票价值的平均值小于 实际价格

  • 6个最后库存值的min小于实际价格。 然后回答 *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

问题是我想不出适合 crossovermutation 运算符的好的技术。有什么想法吗?

【问题讨论】:

  • 您目前如何代表这些?
  • 你……遗漏了一些非常关键的代码。

标签: python genetic-algorithm genetic-programming


【解决方案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:]]

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

【讨论】:

  • 这假定指令是线性流而不是树。
  • @HughBothwell 它没有。这只是将定义的树结构转换为列表,该列表具有应用到该树的明确顺序以进行交叉。这里的染色体布局独立于树本身,OP 并没有暗示他们想要实际编辑树的结构。如果他们这样做,我会改变这个答案。
【解决方案2】:

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

没有必要,但一个好主意(通过神经网络):使用可微分的算子函数 - 即返回“是或否”,而不是返回“是”。这为您的表达改进提供了更多分级反馈。为每个操作员提供设定点控制值以调整其行为也很有用。

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

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

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2014-02-07
    • 2018-07-24
    • 2017-10-30
    相关资源
    最近更新 更多